2015-09-10 28 views
5

我想打從可執行文件,例如,test_runner.cpp:CMake的可執行文件自動生成的源

add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp) 

但是這個特殊的cpp文件本身是自動生成的預生成命令:

add_custom_command(
    TARGET myexe PRE_BUILD 
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp" src/My_test_suite.h 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
) 

但現在我不能生成新的cmake構建文件,因爲它抱怨缺少的源代碼,直到預構建才真正缺失。

回答

8

問題的癥結在於將GENERATED property應用於「test_runner.cpp」。這告訴CMake不要在配置時檢查它的存在,因爲它是作爲構建過程的一部分而創建的。

您可以手動應用此屬性(例如使用set_source_files_properties)。但是,處理這種情況的正確方法是使用add_custom_command的其他形式,即add_custom_command(OUTPUT ...)而不是add_custom_command(TARGET ...)

如果指定「test_runner.cpp」作爲add_custom_command(OUTPUT ...)調用的輸出,則任何使用它的目標(在本例中爲「myexe」)將導致在構建目標之前調用自定義命令。

所以,你真的只需要在你的代碼更改爲類似:

set(TestRunner "${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp") 
add_executable(myexe ${TestRunner}) 
add_custom_command(
    OUTPUT ${TestRunner} 
    COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "${TestRunner}" src/My_test_suite.h 
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 
) 
+0

這是完美的。謝謝。我發現cmake比第一次看起來更詳盡和細緻,我肯定需要閱讀它的文檔封面。但最終它是值得的,因爲cmake是非常有用的。 –