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。2 つのコード ブロックは次のようになります。

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 パラメータは、 に応じてRemoveMissingFiles または のいずれかになります。WarnMissingFilescomp.flags & Compiler::CompilerRemoveNoExist


または、qmake を使用して中間ファイルを生成するより良い方法はありますか?

それが良いかどうかはわかりません-つまり、確かに複雑です-しかし、これは私が働いている場所で行われていることです...

.pro ファイルでは、次のようなシステム コールが実行されます。

  1. 必要なファイルを生成し、
  2. そしてそれらの名前を stdout に書き出します。

.pro の例を次に示します。これは、どのように呼び出されるかを示しています。

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

もちろん、必要に応じて引数を python スクリプトに渡すこともできます。

注意事項/制限事項:

  • これは、 を実行するたびに python スクリプトが実行されることを意味しますがqmake、個々のmake呼び出し中は実行されません。
  • Python を呼び出すたびに、qmake のステップが本当に遅くなります。Python を起動せずに qmake を実行する場合の約 2 倍の時間がかかりますが、別のスクリプト言語をいつでも使用できます。

これにより、qmake がSOURCES値を処理するまでに、スクリプトによってファイルが作成されているという問題が解決されます。

于 2013-01-01T15:26:13.487 に答える