9

我意识到我之前的问题对规则和依赖关系有些困惑。如果 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?

4

3 回答 3

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

于 2010-01-06T18:32:49.193 回答
5

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

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

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

于 2012-08-08T12:25:40.257 回答
0

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

假设我们在一个名为 的文件中获得了所有额外SOURCES和分配,该文件是通过执行脚本生成的,该脚本还生成.HEADERSMakefile.prigenerate_Makefile.pri.shMakefile.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,但我相信同样的方法也可以适用于其他目标构建系统。

于 2017-02-10T16:45:20.607 回答