【问题标题】:How can I control build order in cmake without adding static dependencies?如何在不添加静态依赖项的情况下控制 cmake 中的构建顺序?
【发布时间】:2013-12-27 23:46:00
【问题描述】:

我正在使用 OpenGL Loader Generator 为我的项目生成 GL 函数加载代码。它生成 gl_loader.h 和 gl_loader.c。我的其他一些源文件依赖于 gl_loader.h,但不是全部,所以我需要 cmake 在编译其余代码之前(重新)运行 glLoadGen,否则编译会因为尝试编译而停止在 gl_loader.h 构建之前依赖于 gl_loader.h 的文件。我已将 GENERATED 属性添加到 gl_loader.h/.c ,但这并不是该属性旨在解决的问题,而且它不起作用。

在这种情况下,我可以简单地将 OBJECT_DEPENDS 属性添加到我的所有源文件,因为我几乎不需要重新运行 glLoadGen。但在其他情况下,这会导致过多不必要的重新编译,例如当 GObjectBuilder (gob2) 生成多个 C 源文件和头文件时。手动计算出哪些 C 文件依赖于哪个生成的头文件是不切实际的。

在这种情况下,另一种可能性是在配置时而不是构建时运行 glLoadGen,但这不适用于 gob2 的其他场景。

有没有其他方法告诉cmake在编译其他代码之前必须运行glLoadGen?

【问题讨论】:

    标签: cmake generated-code build-dependencies


    【解决方案1】:

    这似乎是GENERATED 源文件属性的理想方案。它基本上告诉 CMake 不要担心在配置时(当 CMake 运行时)源文件不存在;它会在构建时需要时可用(当 make/vc/etc. 运行时)。

    我不熟悉 OpenGL 或其加载器生成器,但如果您使用 add_custom_commandOUTPUT 形式调用 glLoadGen,GENERATED 属性会自动应用于输出文件:

    add_custom_command(OUTPUT gl_loader.h gl_loader.c
                       COMMAND glLoadGen [whatever args are needed]
                       COMMENT "Generating gl_loader.h and gl_loader.c")
    ...
    add_executable(MyExe ${OtherSources} gl_loader.h gl_loader.c)
    

    使用此设置,当您构建 MyExe 时,应首先执行自定义命令(如果需要)生成适当的源 (gl_loader.h/.c)

    【讨论】:

    • 我就是这么做的;我想我错了,我忘了将 gl_loader.c 添加到 add_executable 的源代码中。这样做似乎可以解决问题,谢谢。
    • 是的 - 这将是一个问题 :-) 很高兴它现在可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多