我有一个项目,我正在使用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命令,即使是从build目录中调用?另外,如何从cmake
获取复合命令的输出,就像我在shell中通常所期望的那样?
我尝试过的事情
为了在子shell中运行命令,我尝试用带括号的here括起复合命令,但输出似乎没有返回到父shell。
This link建议execute_process
可以使用多个COMMAND
次调用运行,但似乎第一个stdout
通过管道传输到下一个stdin
,这样就不会产生预期的结果。
我还试图在sh -c
结构中使用execute_process
显式地使用shell。我不确定我是否完全理解了这次尝试的结果,但是我无法在'
内得到execute_process
我需要的VM398:148 Uncaught TypeError: $(...).html(...).enhanceWithin is not a function
。
答案 0 :(得分:4)
命令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中明确说明。
通常,对于命令的achive 顺序顺序,您需要调用execute_process
两次(或更多)。但是这种用法不适用于更改目录,这就是引入特殊选项的原因。