2016-06-09 60 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兩次(或更多)。但是這種用法不適用於更改目錄,這就是爲什麼引入特殊選項。