2016-06-09 35 views
0

我有一个项目,我正在使用cmake来帮助构建。该假设项目是/home/proj和build目录是/home/proj-buildcmake中的多个命令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内正确地逃脱。

回答

3

命令execute_processworking_directory的选项,它的目的是设置目录,COMMAND将被调用:

execute_process(COMMAND git describe --abbrev=0 --always 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
    OUTPUT_VARIABLE GIT_VERSION 
) 

至于&&操作数,它不与execute_process工作,因为壳ISN使用运行该命令。这在documentation中明确陈述。

正常情况下,为了实现连续命令的顺序,您需要调用execute_process两次(或更多)。但是这种用法不适用于更改目录,这就是为什么引入特殊选项。