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_process
有 WORKING_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()