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_VERSION
、BSON_INCLUDE_DIRS
和 BSON_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
)
我需要在 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_VERSION
、BSON_INCLUDE_DIRS
和 BSON_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
)