cmake execute_process 中的多个命令

vil*_*laa 1 git cmake

我有一个项目,我正在使用 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}\\\"")
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试过的事情

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

此链接表明execute_process可以通过多次COMMAND调用运行,但似乎stdout从第一个调用到stdin下一个调用,因此不会产生所需的结果。

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

Tsy*_*rev 6

命令execute_process具有WORKING_DIRECTORY选项,其目的是设置将调用COMMAND 的目录:

execute_process(COMMAND  git describe --abbrev=0 --always 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    OUTPUT_VARIABLE GIT_VERSION
)
Run Code Online (Sandbox Code Playgroud)

至于&&操作数,它不适用于execute_process,因为shell 不用于运行命令。这在文档中明确说明。

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