如何从 cmake 中运行 cmake?

Posted

技术标签:

【中文标题】如何从 cmake 中运行 cmake?【英文标题】:How can I run cmake from within cmake? 【发布时间】:2017-06-12 12:24:48 【问题描述】:

我的项目依赖于mariadb-connector-c,我正在尝试使用 cmake 自动化下载、构建和链接过程。

我目前将项目下载到一个目录中,然后我尝试执行生成忍者文件并运行它们,但我根本无法运行 cmake:

execute_process(COMMAND "cmake -GNinja ." WORKING_DIRECTORY $mariadb-connector-c_SOURCE_DIR)

我知道这不起作用,因为下一步运行 ninja 失败了:

execute_process(COMMAND "ninja" WORKING_DIRECTORY $mariadb-connector-c_SOURCE_DIR)

cmake 在 CLI 中运行良好,我尝试使用 cmake 可执行文件的完整路径并将点替换为具有完整目录的变量(如果您想知道,这也是一个有效的变量。)

如何让 cmake 在该外部项目上运行 cmake?

【问题讨论】:

看起来你可能会从ExternalProject中受益 ExternalProject 的最新文档是here 【参考方案1】:

您可以将您的项目组织到***CMakeLists.txt,将您的子项目构建为ExternalProject

这种方法需要更多的工作和维护更多的 CMake 模块,但它有其自身的好处。我下载谷歌测试如下:

# 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)

上面的代码在我的 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找到更多关于此模式的提示。

【讨论】:

以上是关于如何从 cmake 中运行 cmake?的主要内容,如果未能解决你的问题,请参考以下文章

如何在CMake构建中每次运行python脚本?

从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中

如何在 cmake 的 try_run 中运行 nvcc?

CMake构建后如何在c ++库中运行示例

从 CMake 中的自定义目标运行目标

如何在 CMake 中构建过程后复制目标的所有运行时依赖项?