2014-09-05 111 views
7

我試圖讓CMake運行三個bash命令或一個bash腳本。但是,我似乎無法讓它工作。通過CMake運行bash命令

bash的命令是:

cd ${CMAKE_SOURCE_DIR}/dependencies/library 
    make 
    cd ${CMAKE_BINARY_DIR} 

從本質上講,我想CMake的建庫在該目錄中,如果它不存在。

這裏是CMake的代碼,我想:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 
    execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library) 
    execute_process(COMMAND make) 
    execute_process(COMMAND cd ${CMAKE_BINARY_DIR}) 
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 

然而,這不是什麼建設。我究竟做錯了什麼?

此外,雖然我在這裏問這個問題:第三個命令是否應該包含在二進制文件夾中?

謝謝!

+3

首先,爲什麼不使用'WORKING_DIRECTORY'參數而不是'cd'命令?像'execute_process(COMMAND make WORKING_DIRECTORY $ {CMAKE_SOURCE_DIR}/dependencies/library)'。我想,'execute_process()'調用不共享相同的環境。另外,如果我是你,我會查看['add_custom_target()'](http://www.cmake.org/cmake/help/v3.0/command/add_custom_target.html?highlight=add_custom_target)和['add_custom_command()'](http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html?highlight=add_custom_command)這樣的事情。 – Kamiccolo 2014-09-05 14:23:50

+1

我不能評論@ Kamiccolo說的大部分內容,但我可以說我認爲'execute_process'不共享狀態的細節幾乎肯定是準確的。 *令人難以置信的是*第一個命令中的'cd'可能僅僅爲該進程更改目錄,而不是其他任何目錄。 – 2014-09-05 14:26:21

+1

如果您打算構建第三方庫,則最好使用[ExternalProject](http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html)模塊。 – sakra 2014-09-05 18:47:28

回答

11

execute_process()在配置時執行。但是你希望在編譯時運行,因此add_custom_command()add_custom_target()就是你正在尋找的東西。

在要生成的輸出文件,所以你應該去add_custom_command()(兩者在本質上是相同的這種特殊情況,但command產生一個或多個輸出文件,而target沒有。

CMake的片段這個看起來應該像下面這樣:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o 
    WORKING_DIR ${CMAKE_SOURCE_DIR}/dependencies/library 
    COMMAND make 
) 

然後,您必須添加輸出文件中的另一目標爲相關性,預期一切都應該(希望)工作

您還可以將DEPENDS語句添加到add_custom_command()調用中,以在某些輸入源發生更改時重建對象文件。