cmake execute_process中的多个命令

时间:2016-06-09 21:43:38

标签: 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}\\\"")

问题是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

1 个答案:

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