2013-02-17 98 views
3

我使用python腳本(gen_instantiations.py)生成另一個cpp文件(foo.cpp)中包含的cpp文件(autogen_instantiations.cpp) 因此,我希望CMake每當重新生成此文件時foo.hpp或gen_instantiations.py更改。 從CMake的常見問題解答以下說明中,這裏就是我所做的自定義目標的cmake依賴關係

add_custom_command(
    COMMAND "./gen_instantiations.py" 
    OUTPUT "autogen_instantiations.cpp" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
    DEPENDS gen_instantiations.py foo.hpp 
) 
add_custom_target(instantiations ALL DEPENDS autogen_instantiations.cpp) 

add_library(foo 
    foo.cpp 
) 
add_dependencies(foo instantiations) 

但這運行運行腳本每一次。我究竟做錯了什麼?

回答

1

更好的方法是不#include產生autogen_instantiations.cpp,但其添加到foo庫作爲一個多個源文件,這樣的cmake可以看到foo依賴於它,如果不便改變

set(GENERATED_SOURCES autogen_instantiations.cpp) 
add_custom_command(
    OUTPUT ${GENERATED_SOURCES} 
    COMMAND "./gen_instantiations.py" 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/gen_instantiations.py ${CMAKE_CURRENT_SOURCE_DIR}/foo.hpp 
) 

add_library(
    foo 
    foo.cpp 
    ${GENERATED_SOURCES} 
) 
2
打電話給你發生器

確保在CMAKE_CURRENT_BINARY_DIR中生成了autogen_instantiations.cpp。如果輸出名稱是相對路徑,則它將被解釋爲相對於CMAKE_CURRENT_BINARY_DIR

如果該命令實際上並未在當前二進制目錄中創建autogen_instantiations.cpp,則該規則將始終運行。