我剛剛閱讀了關於CMake的配置文件包「概念」,這聽起來很有希望。我非常喜歡的是,如果我自己創建配置文件包,我可以指定它所依賴的其他包。我的問題是:如何創建一個「可重定位」並取決於查找模塊包(例如boost)的Config-File包?CMake:配置文件包依賴查找模塊包的推薦方式
更詳細地說:假設我想創建一個名爲HyDi的包。 cmake documentation很好地解釋了我可以如何自動創建相應的HydiConfig.cmake和HydiTargets.cmake文件。在的CMakeLists.txt的一個非常簡單的版本確實是這樣的:
project(HyDi)
find_package(Boost COMPONENTS program_options)
add_library(HyDi foo.cpp foo.hpp)
target_include_directories(HyDi PUBLIC INTERFACE ${Boost_INCLUDE_DIRS})
target_link_libraries(HyDi ${Boost_LIBRARIES})
target_compile_options(HyDi INTERFACE PUBLIC "-std=c++11")
install(TARGETS HyDi EXPORT HyDiTarget
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include
)
install(FILES foo.hpp DESTINATION include)
configure_file(cmake/HyDiConfig.cmake
"${CMAKE_CURRENT_BINARY_DIR}/HyDi/HyDiConfig.cmake"
COPYONLY
)
set(ConfigPackageLocation lib/cmake/HyDi)
install(EXPORT HyDiTarget FILE HyDiTargets.cmake
NAMESPACE Upstream:: DESTINATION ${ConfigPackageLocation})
install(FILES cmake/HyDiConfig.cmake DESTINATION ${ConfigPackageLocation})
相應HydiConfig.cmake是:
include(CMakeFindDependencyMacro)
find_dependency(Boost COMPONENTS program_options)
include("${CMAKE_CURRENT_LIST_DIR}/HyDiTargets.cmake")
但是如果我安裝這個庫中,HyDiTargets.cmake文件將包含包括硬編碼Boost庫的路徑,因此不可重定位。
請注意,cmake documentation給出了一個示例,說明如何不包含基本上是我的版本的boost庫。但不幸的是,他們沒有解釋如何更好地做到這一點。
我知道我可以使用cmake構建boost,然後可以將boost作爲配置文件包導入,以便我的HydiTargets.cmake可以重定位。但是這種方法不適用於提供Findxxx.cmake文件的每個其他庫。
謝謝ruslo,但這種方法本質上意味着我將不得不使用cmake構建提升(這仍然是實驗性的) – craffael
好吧,我剛剛又看了看獵人和肯定,爲推動這將是一種選擇。但是我沒有看到我如何爲我的其他七個外部庫(除非在Hunter中存在一個包)獲得一個cmake包(配置模式)。如果可能的話,我也想避免使用第三方cmake工具。 – craffael
非常有趣的問題,我面臨同樣的問題。 [craffael](https://stackoverflow.com/users/2796908/craffael)你有想出一個解決方案? – kiki