具有自动生成源的 Cmake 可执行文件
Posted
技术标签:
【中文标题】具有自动生成源的 Cmake 可执行文件【英文标题】:Cmake executable with auto-generated sources 【发布时间】:2015-09-10 22:54:39 【问题描述】:我想从例如 test_runner.cpp 创建一个可执行文件:
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 构建文件,因为它抱怨缺少源,在预构建之前确实丢失了。
【问题讨论】:
【参考方案1】:问题的症结在于将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"
)
【讨论】:
太完美了。谢谢你。我发现 cmake 比它最初出现的更详尽和细致入微,我绝对需要阅读它的文档封面。但最终还是值得的,因为 cmake 非常有用。 如果使用的生成文件是由其他目标生成的,请不要忘记add_dependencies(myExe theOtherTargetGeneratingTestRunner)
以确保在编译开始时文件在所有情况下(而不仅仅是偶然)都可用。跨度>
以上是关于具有自动生成源的 Cmake 可执行文件的主要内容,如果未能解决你的问题,请参考以下文章
CMake基础教程(24)add_executable生成目标可执行文件
CMake项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中