如何平息qmake的“警告:未能找到:”?

时间:2012-12-31 20:38:05

标签: qmake

我正在使用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

1 个答案:

答案 0 :(得分:4)

如何平息此警告

从我对qmake代码的阅读中,看起来你可以:

  • 让qmake忽略任何不存在的文件名 - 在这种情况下,它们不会由后面的步骤构建
  • 让它写下这些警告

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


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

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

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);

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


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

我不确定它是否更好 - 即它确实很复杂 - 但这就是我工作的地方......

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

  1. 生成所需文件
  2. 然后将他们的名字写到stdout。
  3. 以下是.pro中的一个示例,用于说明如何调用它:

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

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

    注意事项/限制:

    • 这意味着只要您运行qmake,python脚本就会运行,但在单个make调用期间不会运行
    • 每次调用python都会减慢我们的qmake步骤 - 大约是运行qmake的两倍,而不启动python - 但是你总是可以使用不同的脚本语言

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