我的项目取决于mariadb-connector-c,我正在尝试使用cmake自动执行下载,构建和链接过程。
我目前将项目下载到一个目录中,然后尝试执行生成ninja文件并运行它们但我根本无法运行cmake:
execute_process(COMMAND "cmake -GNinja ." WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR})
我知道这不起作用,因为下一步,运行忍者,失败了:
execute_process(COMMAND "ninja" WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR})
cmake在CLI中运行正常,我尝试使用cmake可执行文件的完整路径,并用变量替换带有完整目录的点(如果你想知道的话,这也是一个有效的变量。)
如何告诉cmake在该外部项目上运行cmake?
答案 0 :(得分:2)
您可以将项目组织到顶级CMakeLists.txt
,将子项目构建为ExternalProject
。
这种方法需要更多的工作和维护更多的CMake模块,但它有其自身的优点。我按如下方式下载Google Test:
# Create download URL derived from version number.
set(GTEST_HOME https://github.com/google/googletest/archive)
set(GTEST_DOWNLOAD_URL ${GTEST_HOME}/release-${GTEST_VERSION}.tar.gz)
unset(GTEST_HOME)
# Download and build the Google Test library and add its properties to the third party arguments.
set(GTEST_ROOT ${THIRDPARTY_INSTALL_PATH}/gtest CACHE INTERNAL "")
ExternalProject_Add(gtest
URL ${GTEST_DOWNLOAD_URL}
CMAKE_ARGS -DBUILD_GTEST=ON -DBUILD_GMOCK=ON -DCMAKE_INSTALL_PREFIX=${GTEST_ROOT}
INSTALL_COMMAND make install
)
list(APPEND GLOBAL_THIRDPARTY_LIB_ARGS "-DGTEST_ROOT:PATH=${GTEST_ROOT}")
unset(GTEST_DOWNLOAD_URL)
unset(GTEST_ROOT)
代码abowe位于我的ExternalGoogleTest.cmake
模块中,该模块包含在CMakeLists.txt
个第三方库中:
set_directory_properties(PROPERTIES EP_BASE ${CMAKE_BINARY_DIR}/ThirdParty)
get_directory_property(THIRDPARTY_BASE_PATH EP_BASE)
set(THIRDPARTY_INSTALL_PATH ${THIRDPARTY_BASE_PATH}/Install)
set(GTEST_VERSION 1.8.0)
include(ExternalProject)
include(ExternalGoogleTest)
依赖于外部库的您自己的项目需要一个CMake模块来构建它ExternalProject
。它看起来像:
ExternalProject_Add(my_project
DEPENDS gtest whatever
SOURCE_DIR ${CMAKE_SOURCE_DIR}/lib
CMAKE_ARGS
${GLOBAL_DEFAULT_ARGS}
${GLOBAL_THIRDPARTY_LIB_ARGS}
-DCMAKE_INSTALL_PREFIX=${DESIRED_INSTALL_PATH}/my_project
BUILD_COMMAND make
)
您可以找到有关此模式的更多提示here。