2017-10-19 53 views
1

我有很多外部依賴關係,我想用ExternalProject_Add來拉入我的項目。訣竅是以最簡潔的方式導出包含目錄和生成的靜態鏈接庫。建立作爲ExternalProject_Add Boost並且或者FindBoost或者導出結果

是否有可能使FindBoost依賴於ExternalProject_Add或者至少使用target_link_libraries將項目拉入庫和頭中?

升壓

include(ExternalProject) 

set(boost_URL "http://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.bz2") 
set(boost_SHA1 "9f1dd4fa364a3e3156a77dc17aa562ef06404ff6") 
set(boost_INSTALL ${CMAKE_CURRENT_BINARY_DIR}/third_party/boost) 
set(boost_INCLUDE_DIR ${boost_INSTALL}/include) 
set(boost_LIB_DIR ${boost_INSTALL}/lib) 

ExternalProject_Add(external_boost 
     PREFIX boost 
     URL ${boost_URL} 
     URL_HASH SHA1=${boost_SHA1} 
     BUILD_IN_SOURCE 1 
     CONFIGURE_COMMAND ./bootstrap.sh 
      --with-libraries=filesystem 
      --with-libraries=system 
      --with-libraries=date_time 
      --prefix=<INSTALL_DIR> 
     BUILD_COMMAND 
     ./b2 install link=static variant=release threading=multi runtime-link=static 
     INSTALL_COMMAND "" 
     INSTALL_DIR ${boost_INSTALL}) 

set(boost_LIBRARY_SUFFIX .a) 

add_library(boost::date_time STATIC IMPORTED) 
set_property(TARGET boost::date_time PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_date_time${boost_LIBRARY_SUFFIX}) 
set_property(TARGET boost::date_time PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR}) 
add_dependencies(boost::date_time external_boost) 

add_library(boost::system STATIC IMPORTED) 
set_property(TARGET boost::system PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_system${boost_LIBRARY_SUFFIX}) 
set_property(TARGET boost::system PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR}) 
add_dependencies(boost::system external_boost) 

add_library(boost::filesystem STATIC IMPORTED) 
set_property(TARGET boost::filesystem PROPERTY IMPORTED_LOCATION ${boost_LIB_DIR}/libboost_filesystem${boost_LIBRARY_SUFFIX}) 
set_property(TARGET boost::filesystem PROPERTY INTERFACE_LINK_LIBRARIES boost::system) 
set_property(TARGET boost::filesystem PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${boost_INCLUDE_DIR}) 
add_dependencies(boost::filesystem external_boost) 

回答

1

ExternalProject_Add創建目標,將推動拉動外部項目。這意味着下載,構建和安裝外部項目發生在構建步驟。因此外部項目的屬性在配置步驟中是未知的,所以你不能直接依賴(或者find_package)。

解決方法是使用所謂的超級構建。這個想法是在您的項目中使用find_package以獲得依賴關係,就好像它們已安裝在系統上一樣。然後,您創建另一個CMakeLists.txt,其中包含ExternalProject_Add所有依賴關係和您的項目的說明。

當你在超級構建的CMakeLists.txt上調用cmake時,它只會建立一個構建系統來下載和構建所有項目,但什麼都不做。當您調用構建時,這些項目將被下載,配置,構建並逐個安裝。因此,當涉及到您的項目時,所有的依賴關係都將被安裝並且配置步驟將會成功。

超級構建的例子可以在這裏找到(我沒有嘗試它,但至少你可以得到的想法):https://github.com/Sarcasm/cmake-superbuild。請注意,cmake/SuperBuild.cmake中的最後一條指令是用於主CMakeLists.txt(即您的項目)的ExternalProject_Add。

另請參閱CMake文檔https://cmake.org/cmake/help/v3.10/module/ExternalProject.html瞭解如何定義ExternalProject級別的依賴關係。