建立作为ExternalProject_Add Boost并且或者FindBoost或者导出结果

问题描述:

我有很多外部依赖关系,我想用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) 

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级别的依赖关系。