2016-10-10 190 views
3

我有以下目錄結構:運行自定義shell腳本的CMake

/CMakeLists.txt 
/component-a/CMakeLists.txt 
      /... 
/component-b/CMakeLists.txt 
      /... 
/doc/CMakeLists.txt 
    /create-doc.sh 

shell腳本create-doc.sh創建一個文檔文件(doc.pdf)。我如何在構建時使用CMake來執行這個shell腳本,並將文件doc.pdf複製到構建目錄中?

我嘗試通過在CMakeLists.txt文件中使用add_custom_command目錄doc內:

add_custom_command (OUTPUT doc.pdf 
        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh 
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) 

不幸的是,命令永遠不會運行。

我也試過execute_process

execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh 
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) 

現在腳本是在配置階段不是在構建時執行,但。

+2

可能重複的[CMake add \ _custom \ _command not running](http://stackoverflow.com/questions/2937128/cmake-add-custom-command-not-being-run) – Tsyvarev

回答

5

你差不多有add_custom_command。這確實是告訴CMake如何生成文件的正確方法。但是,CMake只會在某些事情依賴於該文件時運行。

當如在你的情況下,該文件本身是最終產品,並且不被後續的構建步驟進一步使用的任何,通常的方法是創建一個定製目標,以驅動相關的自定義命令(S):

add_custom_target(
    BuildDocs ALL 
    DEPENDS doc.pdf 
) 

這個(自定義命令的自定義目標驅動程序)是CMake中非常常見的習慣用法。

你當然可以玩add_custom_target(例如ALL,COMMENT)的參數,因爲它適合你。

+0

謝謝。 :)我必須使用特殊的CMake命令將doc.pdf複製到build目錄嗎? 'doc.pdf'在目錄'doc'中創建,但不被複制。 – Marcello90

+0

@ Marcello90如果您希望在二進制目錄中生成該文件,並且該腳本缺乏單獨執行此操作的功能(例如,通過傳遞所需的輸出位置),則可以使用其他自定義命令來複制文件(並且目標取決於* final *輸出位置);可以使用'$ {CMAKE_COMMAND} -E copy_if_different'或類似的方法在構建時實現與平臺無關的副本。 – Angew