【问题标题】:qmake rules for generated code生成代码的 qmake 规则
【发布时间】:2011-01-01 16:20:18
【问题描述】:

我意识到我之前的问题对规则和依赖关系有些困惑。如果 qmake 运行时目录“生成”中的源文件存在,则以下 .pro 文件生成一个可以正常工作的 makefile。

idl.target   = generated/qmtest.h
idl.commands = code_generator 
idl.config   = no_link
idl.depends  = $$SOURCES $$HEADERS $$FORMS

TEMPLATE       = app
INCLUDEPATH    += generated
SOURCES        += generated/*.cpp
PRE_TARGETDEPS += generated/qmtest.h
QMAKE_EXTRA_UNIX_TARGETS += idl

但是当 qmake 运行时,它只生成一个 makefile,而 PRE_TARGETDEPS 和 QMAKE_EXTRA_UNIX_TARGETS 对我没有帮助。如何让 qmake 生成一个生成文件,它将生成/的内容添加到 SOURCES?

【问题讨论】:

    标签: qt qmake


    【解决方案1】:

    您可能需要分两次执行此操作。

    在您的 qmake 文件中,添加以下行:

    include( generated/generated.pri )
    

    然后,在 code_generator 脚本的末尾,将源代码添加到 generated.pri 文件中(以 bash 为例,但几乎所有语言的想法都是相同的):

    rm generated/generated.pri
    for file in $( ls generated/*.cpp ); do
        echo "SOURCES += ${file}" >> generated/generated.pri
    done
    

    第一次运行 qmake 文件时,generated/generated.pri 可能为空。当您运行 make 时,它​​将填充生成的.pri 文件。第二次,它将重新创建 make 文件(因为源 .pri 文件已更改),然后再次编译。您也许可以摆弄其他可以为您完成第二阶段的命令。

    【讨论】:

    • 谢谢 - 我最终在 qmake 期间使用 system($$idl.commands) 强制生成器运行。它生成的 makefile 是正确的,因为我将输出添加到目标它并没有真正伤害任何东西。
    【解决方案2】:

    我刚才也遇到了同样的问题,但只是一个生成文件的更简单的用例。为此,我找到了一种更简单的方法来实现这一点,即使用 GENERATED_SOURCES 而不是 SOURCES:

    dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += 虚拟文件 GENERATED_SOURCES += $$dummyfile.target

    也许人们可以将它推入一个 qmake 循环并为多个文件生成正确的目标。

    【讨论】:

    • + PRE_TARGET_DEPENDS += 虚拟文件
    【解决方案3】:

    我提出了一个我认为稳健且通用的解决方案,它依赖于qmake 生成 GNU Makefile。

    假设我们在名为Makefile.pri 的文件中获得了所有额外的SOURCESHEADERS 分配,该文件是通过执行脚本generate_Makefile.pri.sh 生成的,该脚本还生成Makefile.pri 中提到的源和/或标题.

    我们希望此文件由构建系统本身自动可靠地生成,以便包含在.pro 文件中,以便qmake 可以考虑其内容并生成具有适当依赖关系的 Makefile。

    这就是我们必须放入 .pro 文件的内容。

    Makefile_pri.target   = Makefile.pri
    Makefile_pri.commands = generate_Makefile.pri.sh
    Makefile_pri.depends  = FORCE
    
    Makefile.target  = $$MAKEFILE
    Makefile.depends = Makefile_pri
    
    include($$Makefile_pri.target)
    
    QMAKE_EXTRA_TARGETS = Makefile Makefile_pri
    

    这边:

    1. 如果没有Makefile.pri,则创建它;
    2. 如果Makefile.pri 被创建或更新,则qmake 再次运行并考虑其内容,重新生成Makefile

    如前所述,这确实依赖于qmake 生成 GNU Makefile,但我相信同样的方法也可以适用于其他目标构建系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多