【问题标题】:CMake compile time generation of sourceCMake 编译时生成源代码
【发布时间】:2014-01-28 21:32:53
【问题描述】:

我在使用 CMake 时遇到以下情况:

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

    一个。 发电机

    b. something_else

  2. 生成器没什么花哨的,几个 CPP 文件链接在一起

  3. something_else 是:

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

    b.生成我必须链接的 CPP/h 文件。这些 CPP 文件由 generator

    生成

生成器在配置阶段配置了一些选项,根据这些选项生成的文件的内容是不同的。

在这里我得到一个错误:如果我在 something_elseadd_application 中指定所有文件(生成的和未生成的),则配置阶段会阻塞它,因为它找不到生成的文件。 . 显然是因为它们还没有生成,因为 generator 还没有构建和执行。

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

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    是的,这是可能的。您可以通过提供自定义命令来生成文件来做到这一点,以便 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,然后运行它,然后构建 something_else

    【讨论】:

    • 在修复了生成文件的实际位置的问题后,它可以工作了!
    【解决方案2】:

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

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

    现在您只需确保在运行 something_else 步骤之前运行 generator。也有管理方法,请查看

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

    【讨论】:

    • 无需将自定义命令的输出标记为GENERATED,CMake 会自动执行此操作。当生成器也由项目构建时,也无需提供自定义目标。
    猜你喜欢
    • 2020-07-27
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多