gpt4 book ai didi

git - cmake execute_process 中的多个命令

转载 作者:行者123 更新时间:2023-12-05 09:20:20 28 4
gpt4 key购买 nike

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

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

在我的 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 中正确转义。

最佳答案

命令 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 两次(或更多次)。但是这种用法不适用于更改目录,这就是引入特殊选项的原因。

关于git - cmake execute_process 中的多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37736680/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com