具有自动生成源的Cmake可执行文件

Jef*_*f M 7 c++ cmake

我想从例如test_runner.cpp创建一个可执行文件:

add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp)
Run Code Online (Sandbox Code Playgroud)

但是这个特定的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}"
)
Run Code Online (Sandbox Code Playgroud)

但现在我无法生成新的cmake构建文件,因为它抱怨缺少的源,这在预构建之前确实缺失.

Fra*_*ser 10

问题的关键是将GENERATED属性应用于"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}"
)
Run Code Online (Sandbox Code Playgroud)