2015-09-10 29 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是非常有用的。 –