cmake include_directories 传递给 externaproject_add

cmake include_directories passed to externaproject_add

我需要在 mongo-c-driver 和 mongo-cxx-driver 上使用 mangrove(mongo ODM 库)并将其作为 CMake [=14] 包含到我的项目中=] 命令,依赖项为 mongo-c-driver/mongo-cxx-driver

# mongo-c-driver
ExternalProject_Add(mongo-c-driver
        GIT_REPOSITORY https://github.com/mongodb/mongo-c-driver.git
        GIT_TAG r1.12
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF
#        CMAKE_ARGS -DINCLUDE_DIRECTORIES=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0 ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0
        )

#include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
#        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
#link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)

include_directories 这里的命令并不是真正需要的,因为 mongoc 的 cmake 配置文件使它起作用。但是,可以肯定的是,我也检查了未注释的内容。

所以下一个包含的外部项目 - mangrove 需要来自 mongo-c-driver 的包含。

由于 c++ 错误未找到一些包含文件而失败,这些文件存在于当前项目的包含路径中。所以似乎包含的外部项目不使用当前的 CMake 包含,这是以前由另一个外部项目添加的

# mangrove
ExternalProject_Add(mangrove
        GIT_REPOSITORY https://github.com/aospan/mangrove.git
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DCMAKE_INCLUDE_DIRECTORIES_BEFORE=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        )

ExternalProject_Add_StepDependencies(mangrove build mongo-c-driver mongo-cxx-driver)

include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
        ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)

脚本中的 include_directories 似乎不会影响 ExternalProject_Add 包含的基于 CMake 的项目。

有没有一种技术可以将这些包含路径传递给外部项目?

您使用了错误的宏。 CMAKE_INCLUDE_DIRECTORIES_BEFORE 仅表示 include-directories 的工作方式,是 flag.

没有其他选项可以设置适当的变量,以便外部 CMakeLists.txt 使用 find_path 填充到 bson.h 的路径。如果没有,那么我建议您修补 CMakeLists.txt 以使用 find_path 并提出拉取请求。

编辑:

似乎红树林项目有办法用 ENABLE_BSON 设置所有这些。如果默认 AUTO 不起作用,您可以手动设置 BSON_VERSIONBSON_INCLUDE_DIRSBSON_LIBRARIES

如其他答案所述,您不能将包含传递给 mangrove 项目,并且外部项目和当前项目都是相互独立的。

这似乎是问题的一半。看起来您正在尝试使用 mongo-c-driver 来提供 libbson。但是 mangrove 正在使用:

set(LIBBSON_REQUIRED_VERSION 1.7.0)
set(LIBBSON_REQUIRED_ABI_VERSION 1.0)
find_package(LibBSON ${LIBBSON_REQUIRED_VERSION} REQUIRED)

不完全清楚的是 find_package 是否在模块或配置模式下是 运行 以及它的结果是什么。但是要成功运行 libbson 需要在构建 mongo-c-driver 时构建,以便 find_package 可以找到库并设置包含路径和 link 行。

似乎 mangrove 找到了一些允许 find_package 不失败但没有使用正确的包含路径填充 ${LIBBSON_INCLUDE_DIRS} 的东西,这导致了您提到的编译错误。

如果没有具体细节,很难给你一个详细的答案,但你需要确保 mangrove 中的 find_package 命令在构建但未安装的 libbson 或在与 mangrove.

使用的 find_package 命令兼容的位置安装 libbson

尝试与 mongo-c-driver 同时构建 mongo-cxx-driver 时遇到同样的问题,两者都是超级构建中的外部项目

修复感觉有点粗糙,但这是在下一步将包含作为 CPLUS_INCLUDES_PATH 传递的情况:

Include(ExternalProject)
ExternalProject_Add(libmongoc
        GIT_REPOSITORY  https://github.com/mongodb/mongo-c-driver.git
        GIT_TAG         [tag]
        STEP_TARGETS    build
        SOURCE_DIR      "${CMAKE_BINARY_DIR}/libmongoc"
        BINARY_DIR      "${CMAKE_BINARY_DIR}/libmongoc-build"
        INSTALL_DIR     "${CMAKE_BINARY_DIR}/libmongoc-install"
        CMAKE_CACHE_ARGS
            ${common_cmake_cache_args}
            -DENABLE_AUTOMATIC_INIT_AND_CLEANUP:BOOL=OFF
            -DCMAKE_BUILD_TYPE:STRING=Release
            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/libmongoc-install
            -DCMAKE_INSTALL_RPATH:PATH=${CMAKE_BINARY_DIR}/libmongoc-install
            -DENABLE_TESTS:BOOL=OFF
            -DENABLE_STATIC:BOOL=OFF
            -DENABLE_EXAMPLES:BOOL=OFF
            -DENABLE_EXTRA_ALIGNMENT:BOOL=OFF
            -DBUILD_SHARED_LIBS:BOOL=ON
)
set(libmongoc-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib64/cmake/libmongoc-1.0")
set(libbson-1.0_DIR "${CMAKE_BINARY_DIR}/libmongoc-install/lib64/cmake/libbson-1.0")
set(libmongoc_hdrs "${CMAKE_BINARY_DIR}/libmongoc-install/include/libmongoc-1.0")
set(libbson_hdrs "${CMAKE_BINARY_DIR}/libmongoc-install/include/libbson-1.0")
set(all-includes "${libmongoc_hdrs}:${libbson_hdrs}")

ExternalProject_Add(libmongocxx
        GIT_REPOSITORY  https://github.com/mongodb/mongo-cxx-driver.git
        GIT_TAG         [tag]
        SOURCE_DIR      "${CMAKE_BINARY_DIR}/libmongocxx"
        BINARY_DIR      "${CMAKE_BINARY_DIR}/libmongocxx-build"
        INSTALL_DIR     "${CMAKE_BINARY_DIR}/libmongocxx-install"
        BUILD_COMMAND   CPLUS_INCLUDE_PATH=${all-includes} make
        CMAKE_CACHE_ARGS
            ${common_cmake_cache_args}
            -DCMAKE_BUILD_TYPE:STRING=Release
            -DMONGOC_INCLUDE_DIRS:PATH=${libmongoc_hdrs}
            -DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_BINARY_DIR}/mongocxx-install
            -DCMAKE_INSTALL_RPATH:PATH=${CMAKE_BINARY_DIR}/mongocxx-install
            -DBUILD_SHARED_LIBS:BOOL=ON
            -DENABLE_TESTS:BOOL=OFF
            -DENABLE_EXAMPLES:BOOL=OFF
            -DBSONCXX_POLY_USE_BOOST:BOOL=OFF
            -DBSONCXX_POLY_USE_MNMLSTC:BOOL=ON
            -DBSONCXX_POLY_USE_STD:BOOL=OFF
            -Dlibmongoc-1.0_DIR:PATH=${libmongoc-1.0_DIR}
            -Dlibbson-1.0_DIR:PATH=${libbson-1.0_DIR}
        DEPENDS
            libmongoc
)