我意识到我之前的问题对规则和依赖关系有点困惑。以下.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?
答案 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
的文件中获得了所有额外的HEADERS
和Makefile.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
这样:
Makefile.pri
,则会创建; Makefile.pri
被创建或更新,则qmake
会再次运行并考虑其内容,重新生成Makefile
如上所述,确实依赖qmake
生成GNU Makefile,但我认为可以采用相同的方法与其他目标构建系统一起使用。