6

PRE_TARGETDEPS用于生成源文件,并将生成的源文件添加到SOURCES编译中。

我的生成器的输出在 qmake 运行时显然不存在,因此 qmake 输出WARNING: Failure to find:每个要创建的源文件。

PRE_TARGETDEPS既然我知道我将生成这些文件,我该如何消除这个警告?

或者,有没有更好的方法来使用 qmake 生成中间文件?

例子

test.pro这是一个显示问题的完整文件:

TEMPLATE = lib

preprocess.commands += cat test.cc.in | sed 's/a/0/g' > test.0.cc ;
preprocess.commands += cat test.cc.in | sed 's/a/1/g' > test.1.cc ;
preprocess.depends = test.cc.in
QMAKE_EXTRA_TARGETS += preprocess
PRE_TARGETDEPS += preprocess

SOURCES = test.0.cc test.1.cc

将其放在一个空文件夹中,并创建一个空test.cc.in文件。运行qmake,您将看到以下警告:

WARNING: Failure to find: test.0.cc
WARNING: Failure to find: test.1.cc
4

1 回答 1

4

我怎样才能平息这个警告

根据我对 qmake 代码的阅读,您可以:

  • 要么让 qmake 忽略任何不存在的文件名 - 在这种情况下,它们将不会通过您的后续步骤构建
  • 或者让它写下这些警告

我认为这些都不会让你满意。


Failure to find这是我的推理.... 我在必须手头的 Qt 发行版中寻找文本:qt4.8.1。

它在 中出现了 3 次qmake/generators/makefile.cpp。这两个代码块如下所示:

QStringList
MakefileGenerator::findFilesInVPATH(QStringList l, uchar flags, const QString &vpath_var)
{
....
                    debug_msg(1, "%s:%d Failure to find %s in vpath (%s)",
                              __FILE__, __LINE__,
                              val.toLatin1().constData(), vpath.join("::").toLatin1().constData());
                    if(flags & VPATH_RemoveMissingFiles)
                        remove_file = true;
                    else if(flags & VPATH_WarnMissingFiles)
                        warn_msg(WarnLogic, "Failure to find: %s", val.toLatin1().constData());
....
                else if(flags & VPATH_WarnMissingFiles)
                    warn_msg(WarnLogic, "Failure to find: %s", val.toLatin1().constData());

这被称为:

        l = findFilesInVPATH(l, (comp.flags & Compiler::CompilerRemoveNoExist) ?
                             VPATH_RemoveMissingFiles : VPATH_WarnMissingFiles, "VPATH_" + comp.variable_in);

所以传入第一个块的标志参数将是RemoveMissingFilesWarnMissingFiles,具体取决于comp.flags & Compiler::CompilerRemoveNoExist


或者,有没有更好的方法来使用 qmake 生成中间文件?

我不确定它是否更好——即它肯定很复杂——但这就是我工作的地方所做的......

在 .pro 文件中,完成了系统调用,即:

  1. 生成所需的文件,
  2. 然后将他们的名字写到标准输出。

这是 .pro 中的一个示例,以显示如何调用它:

SOURCES    += $$system( python my_script_name.py )

如果您愿意,您当然可以将参数传递给 python 脚本

注意事项/限制:

  • 这意味着无论您何时运行,python 脚本都会运行qmake,但不会在单独make调用期间运行。
  • 每次调用 python 确实减慢了我们的 qmake 步骤 - 大约是在不启动 python 的情况下运行 qmake 的两倍 - 但你总是可以使用不同的脚本语言

这将解决您的问题,因为当 qmake 处理该SOURCES值时,文件已由脚本创建。

于 2013-01-01T15:26:13.487 回答