我有一个项目,我正在使用 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 -c在execute_process结构内部使用显式调用 shell 。我不确定我是否完全理解这次尝试的结果,但我无法获得'在这种情况下我需要在execute_process.
命令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两次(或多次)。但是这种用法不适用于更改目录,这就是引入特殊选项的原因。
| 归档时间: |
|
| 查看次数: |
5319 次 |
| 最近记录: |