cmake execute_process 中的多个命令

Posted

技术标签:

【中文标题】cmake execute_process 中的多个命令【英文标题】:multiple commands in cmake execute_process 【发布时间】:2016-10-10 17:44:36 【问题描述】:

我有一个项目,我正在使用 cmake 来帮助构建。假设项目在/home/proj,构建目录在/home/proj-build

/home/proj 目录是一个带有一些标签的 git 存储库,我想在构建代码时将最新的标签合并到代码中,以便二进制文件知道它是什么版本。

在我的CMakeLists.txt 文件中,我在设置部分有以下节:

set(CMAKE_BUILD_TYPE None)
message($CMAKE_CURRENT_SOURCE_DIR)
execute_process(COMMAND cd $CMAKE_CURRENT_SOURCE_DIR && exec git describe --abbrev=0 --always OUTPUT_VARIABLE GIT_VERSION)
message("$GIT_VERSION")
set(CMAKE_C_FLAGS "$CMAKE_C_FLAGS -D__GIT_VERSION=\\\"$GIT_VERSION\\\"")
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -D__GIT_VERSION=\\\"$GIT_VERSION\\\"")

问题在于execute_process 中的复合命令显然为版本返回了一个空字符串。我必须以某种方式从存储库目录中运行git describe 命令,但它与生成代码的构建目录不同。

如何让 make 进程在适当的目录中执行适当的 git 命令,即使是从构建目录中调用?另外,我怎样才能让 cmake 像我通常在 shell 中所期望的那样从复合命令中获取输出?

我尝试过的事情

我尝试按照here 的建议将复合命令括在括号中,以便在子 shell 中运行该命令,但输出似乎没有返回到父 shell。

This link 建议 execute_process 可以与多个 COMMAND 调用一起运行,但似乎第一个的 stdout 被传送到下一个的 stdin,因此不会产生所需的结果.

我还尝试在 execute_process 结构中使用 sh -c 显式调用 shell。我不确定我是否完全理解了这次尝试的结果,但我无法获得',在这种情况下我需要在execute_process 内正确逃脱。

【问题讨论】:

【参考方案1】:

Command execute_processWORKING_DIRECTORY 选项,其目的是设置将调用 COMMAND 的目录:

execute_process(COMMAND  git describe --abbrev=0 --always 
    WORKING_DIRECTORY $CMAKE_CURRENT_SOURCE_DIR
    OUTPUT_VARIABLE GIT_VERSION
)

对于&& 操作数,它不适用于execute_process,因为不使用shell 来运行命令。这在documentation 中有明确说明。

通常,为了实现命令的顺序顺序,您需要调用execute_process 两次(或更多)。但是这种用法不适用于更改目录,这就是引入特殊选项的原因。

【讨论】:

以上是关于cmake execute_process 中的多个命令的主要内容,如果未能解决你的问题,请参考以下文章

qmake 等效于 cmake execute_process()

如果使用带有 execute_process 命令的 CMake 脚本模式,如何获得彩色控制台输出?

CMAKE使用笔记

如何从 cmake 中运行 cmake?

Tools系列CMake入门基础:CMake语法

在CMake中生成命令后执行命令