इसलिए, मैं एक सी पुस्तकालय बनाना चाहता हूं जिसे इस तरह से स्थापित किया जा सकता है कि यह अन्य परियोजनाओं में आसानी से उपयोग करने योग्य find_package सेमेक में फ़ंक्शन के साथ है। विशेष रूप से, मैं एक परियोजना चाहता हूं, जिसे फू कहा जाता है, इस तरह सुलभ होने के लिए:

find_package (foo-1.0 REQUIRED)

message ("!--   foo found version \"${FOO_VERSION}\"")
message ("!--   foo include path \"${FOO_INCLUDE_DIRS}\"")
message ("!--   foo libraries \"${FOO_LIBRARIES}\"")

फिर, उन चरों का उपयोग अन्य सेमेक परियोजनाओं में लक्ष्य के साथ किया जा सकता है, जैसे:

add_executable (example example.c)
target_include_directories (example PRIVATE "${FOO_INCLUDE_DIRS}")
target_link_libraries (example PRIVATE "${FOO_LIBRARIES}")

मेरा सवाल हालांकि है:

  1. find_package द्वारा खोजने योग्य होने के लिए एक स्थिर या साझा सी पुस्तकालय किस तरह स्थापित किया जाना चाहिए (उर्फ क्या गंतव्य की आवश्यकता है)।
  2. मैं FOO_LIBRARIES जैसे वेरिएबल्स को कैसे उजागर कर सकता हूं जैसे कि find_package फ़ंक्शन उन्हें find_package कॉल करने वाले प्रोजेक्ट में उजागर करेगा?
0
Josh Weinstein 18 अप्रैल 2019, 21:49

1 उत्तर

सबसे बढ़िया उत्तर

मुझे पता चला कि यह कैसे करना है। मूल रूप से आपके पास .cmake.in फ़ाइलें होनी चाहिए जो एक कॉन्फ़िग फ़ाइल के लिए एक टेम्पलेट के रूप में और अंतिम पैकेज के लिए एक कॉन्फ़िग संस्करण फ़ाइल के रूप में कार्य करती हैं। find_package cmake कॉन्फिगरेशन और वर्जन फाइल्स के लिए निम्नलिखित जगहों को देखेगा:

${CMAKE_INSTALL_PREFIX}/include/${LIBKOF_NAMED_VERSION}
${CMAKE_INSTALL_PREFIX}/lib/${LIBKOF_NAMED_VERSION}

जहां LIBKOF_NAMED_VERSION पैकेज फ़ोल्डर है, जैसे foo-1.2

libkof मेरे पैकेज का नाम है, और आप नीचे देख सकते हैं कि यह कैसे किया जाता है:

# This cmake is responsible for installing cmake config and other version
# files.

# This sets the package specific versioning
set(LIBKOF_MAJOR_VERSION 1)
set(LIBKOF_MINOR_VERSION 0)
set(LIBKOF_PATCH_VERSION 0)

# This allows easy creation of the directories within /usr/local or another install
# prefix
set(LIBKOF_NAMED_VERSION libkof-${LIBKOF_MAJOR_VERSION}.${LIBKOF_MINOR_VERSION})

# These statements will create the directories needed for installs
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${LIBKOF_NAMED_VERSION})
install(DIRECTORY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/${LIBKOF_NAMED_VERSION})

# This tracks the name of the in files used to generate the package cmake files
set(LIBKOF_CONFIG_FILE libkof-config.cmake.in)
set(LIBKOF_CONFIG_VERSION_FILE libkof-config-version.cmake.in)

# The configure_file statements will exchange the variables for the values in this cmake file.
configure_file(${LIBKOF_CONFIG_FILE} libkof-config.cmake @ONLY)
configure_file(${LIBKOF_CONFIG_VERSION_FILE} libkof-config-version.cmake @ONLY)

# Installs to the output locations so they can be found with find_package()
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libkof-config-version.cmake DESTINATION include/${LIBKOF_NAMED_VERSION})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libkof-config.cmake DESTINATION lib/${LIBKOF_NAMED_VERSION})
1
Josh Weinstein 19 अप्रैल 2019, 20:30