代码之家  ›  专栏  ›  技术社区  ›  swarfrat

qmake生成代码的规则

  •  8
  • swarfrat  · 技术社区  · 15 年前

    我意识到我之前的问题对规则和依赖性有点困惑。下面的.pro文件生成一个makefile,如果运行qmake时目录“generated”中的源文件存在,该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-targetedeps&qmake-extra-unix-targets对我没有帮助。我如何让qmake生成一个makefile,它将生成的/的内容添加到源中?

    3 回复  |  直到 8 年前
        1
  •  5
  •   Caleb Huitt - cjhuitt    15 年前

    你可能需要两次传球。

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

    include( generated/generated.pri )
    

    然后,在代码生成器脚本的末尾,将源代码添加到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文件更改),然后再次编译。你也许能够摆弄其他的命令,这些命令将为你完成第二阶段。

        2
  •  4
  •   milianw    12 年前

    我刚才也遇到了同样的问题,但是对于一个简单的用例来说,只需要一个生成的文件。为此,我找到了一种更简单的方法,通过使用生成的源而不是源来实现这一点:

    dummyfile.target = dummy.cpp
    dummyfile.commands = touch $$dummyfile.target
    QMAKE_EXTRA_TARGETS += dummyfile
    GENERATED_SOURCES += $$dummyfile.target
    

    可能有人可以将其推入qmake循环,并为多个文件生成适当的目标。

        3
  •  0
  •   Fabio A. fredoverflow    8 年前

    我已经想出了一个解决方案,我相信它是强大的和通用的,它依赖于 qmake 生成GNU生成文件。

    说我们有多余的 SOURCES HEADERS 名为的文件中的工作分配 Makefile.pri ,通过执行脚本生成 generate_Makefile.pri.sh 它还生成中提到的源和/或头 PrimFiel.PRI .

    我们希望此文件由构建系统本身自动可靠地生成,以便包含在 .pro 文件,以便 Quew 可以考虑其内容并生成具有适当依赖关系的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. 如果没有 PrimFiel.PRI ,然后创建;
    2. 如果 PrimFiel.PRI 创建或更新,然后 Quew 再次运行并考虑其内容,重新生成 Makefile

    如所说,这个 依靠 Q制动 生成一个GNU生成文件,但我认为同样的方法也可以适应其他目标构建系统。