【问题标题】:Get CMake to execute a target in project before building a library在构建库之前让 CMake 执行项目中的目标
【发布时间】:2011-07-20 02:24:23
【问题描述】:

我正在使用 CMake 构建我的 C++ 项目,它有多个可执行文件和一个库(同一个项目的所有部分)。一切正常,但是我的一个可执行文件是创建一些库类的代码生成器。我已经完成了所有的生成工作,但是在构建库之前无法弄清楚如何调用这个可执行文件(codegen)。我在Linux环境中。希望有人能回答这个问题。

【问题讨论】:

    标签: c++ build cmake


    【解决方案1】:

    CMakeLists.txt:

    首先,定义你的可执行文件:

    add_executable(marks-code-generator gen.cpp)
    

    然后,定义一个自定义命令来生成源代码:

    add_custom_command(OUTPUT generated.cpp generated.hpp
                       COMMAND marks-code-generator ARGS args here maybe
                       MAIN_DEPENDENCY input-file.in
                       DEPENDS marks-code-generator
                       COMMENT here we go!
                       VERBATIM)
    

    VERBATIM 选项可确保正确完成特定于平台的转义。 COMMENT 将在 make 执行时打印出来,给出类似 [ 66%] here we go! 的内容。

    最后,在你的真实程序的源代码列表中命名你生成的源代码:

    add_executable(some-program generated.cpp generated.hpp non-generated.cpp foo.cpp)
    

    【讨论】:

    • 感谢 Jack,marks-code-generator 应该将生成的.cpp/h 文件写入当前目录还是简单地将它们输出到 stdout 并让 OUTPUT 部分写入它们?如果是这样,我在写作时是否只用 EOF 将它们分开?
    • 我越来越认为递归构建系统不起作用。他们不使用make,他们不使用automake,我不相信他们使用CMake。你有什么理由不能在顶级CMakeLists.txt 中完成这一切吗?如果它太大,请使用include。您仍然需要输出到文件。 add_custom_command 中的 OUTPUT 行只是告诉 CMake 您正在生成哪些文件(因为它无法自行解决),所以请继续使用 ofstream 或其他任何内容来生成您的标头和源代码。
    • 谢谢 Jack,我会考虑转移到一个 CMakeLists,看起来它会更容易维护等。
    • 确实,那些其他系统要求您将所有内容放入一个巨大的文件中,但递归 CMake 可以正常工作。它将管理依赖项(确实如此)。
    • @JackKelly:您将如何处理代码生成器输出可变数量文件的情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2021-06-05
    • 2023-04-07
    • 2013-01-23
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多