CMake编译时生成源

时间:2014-01-28 13:09:48

标签: c++ cmake

我对CMake有以下情况:

  1. 它必须构建两个应用程序:

    一个。的发生器

    湾的 something_else

  2. 生成器没什么特别的,一些CPP文件链接在一起

  3. something_else 是:

    一个。一些“正常”的CPP文件

    湾我必须链接生成的CPP / h文件。这些CPP文件由生成器生成

  4. 生成器在配置阶段配置了一些选项,具体取决于这些选项,生成的文件内容不同。

    在这里我收到一个错误:如果我在 something_else add_application中指定了所有文件(生成的和未生成的),则配置阶段会对其进行扼流,因为它无法找到生成的文件...显然是因为它们尚未生成,因为生成器尚未构建和执行。

    所以问题:这可能是使用CMake吗?如果是,怎么样?

2 个答案:

答案 0 :(得分:9)

是的,有可能。您可以通过提供自定义命令来生成文件,以便CMake了解如何生成它们。这是一个例子:

add_executable(generator gen1.cpp gen2.cpp)

add_custom_command(
  OUTPUT generated_file1.cpp generated_file2.cpp
  COMMAND generator -options --go here
  COMMENT "Running generator"
  VERBATIM
)

add_executable(something_else
  fixed1.cpp
  fixed2.cpp
  generated_file1.cpp
  generated_file2.cpp
)

这样,CMake就会知道文件是生成的,并且还会引入正确的依赖关系 - 在一个干净的构建目录中键入make something_else将构建generator,然后运行它,然后构建{{1 }}

答案 1 :(得分:4)

您需要告诉CMake文件已生成:

set_source_files_properties(someautogeneratedfile.cpp PROPERTIES GENERATED TRUE)
set_source_files_properties(someothergeneratedfile.h PROPERTIES GENERATED TRUE)

现在,您只需确保在运行 something_else 步骤之前运行生成器。有办法管理,检查

add_custom_command(...)
add_custom_target(...)
add_dependencies(...)