生成代码的qmake规则

时间:2010-01-05 14:51:50

标签: qt qmake

我意识到我之前的问题对规则和依赖关系有点困惑。以下.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_TARGETDEPS& QMAKE_EXTRA_UNIX_TARGETS不帮助我。如何让qmake生成一个makefile,它将生成的内容添加到SOURCES?

3 个答案:

答案 0 :(得分:5)

您可能需要两次通过。

在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.pri可能是空的。运行make时,它将填充generated.pri文件。第二次,它将重新创建make文件(更改源.pri文件),然后再次编译。你或许可以摆弄其他可以为你做第二阶段的命令。

答案 1 :(得分:4)

我刚才遇到了同样的问题,但是只使用了一个生成的文件。为此,我通过使用GENERATED_SOURCES而不是SOURCES找到了一种更简单的方法:

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

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

答案 2 :(得分:0)

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

假设我们在名为SOURCES的文件中获得了所有额外的HEADERSMakefile.pri分配,该文件是通过执行同时生成源代码的脚本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
  3. 如上所述,确实依赖qmake生成GNU Makefile,但我认为可以采用相同的方法与其他目标构建系统一起使用。

相关问题