我有一个项目,我正在使用cmake来帮助构建。该假设项目是/home/proj
和build目录是/home/proj-build
cmake中的多个命令execute_process
的/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中预期的那样?
事情我已经试过
我试图环绕的建议,以运行在一个子shell命令here带括号的复合命令,但输出似乎不退还到父shell。
This link表明execute_process
可与多种COMMAND
调用运行,但似乎从第一个stdout
通过管道被输送到下stdin
,这样就不会产生期望的结果。
我也尝试在execute_process
结构中明确使用sh -c
来使用shell。我不确定我是否完全理解了这种尝试的结果,但我无法获得'
我需要在这种情况下在execute_process
内正确地逃脱。