生成代码的qmake规则

swa*_*rat 8 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
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*itt 5

您可能需要两次通过.

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

include( generated/generated.pri )
Run Code Online (Sandbox Code Playgroud)

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

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

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


mil*_*anw 5

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

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

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