web-dev-qa-db-ja.com

qMake:qmakeは「CONFIG(debug、debug | release)」構文をどの程度正確に解釈しますか

[〜#〜] here [〜#〜] を読みましたが、qmake CONFIG変数の構文はまだわかりません。たとえば、.pro fileに次のCONFIG設定がある場合:

CONFIG(debug, debug|release) {
    message("debug mode")
}else {
    message("release mode")
}

その後、qmakeを実行すると、Qt-Creatorのコンパイル出力に次が表示されます。

Project MESSAGE: debug mode
Project MESSAGE: debug mode
Project MESSAGE: release mode

"デバッグモード"でプロジェクトを構築していることを知っている場合、私の質問は次のとおりです。

  • 「デバッグモード」メッセージのみを表示しない理由?そして、なぜそれを一度だけ表示しないのですか?
  • 次に、「デバッグモード」でビルドしているため、「プロジェクトメッセージ:リリースモード」というメッセージが表示される理由
  • 正確に、構文:CONFIG(debug、debug | release)の実際の意味は?これは、デバッグモードでビルドし、次にデバッグモードでビルドし、最後にリリースモードでビルドすることを意味しますか?これらの括弧 "{}"は scope を意味することを知っていますが、これらの括弧 "()"の中にあるものをqmakeがどのように解釈するか?
40
hashDefine

リンクした記事では、プロジェクトファイルが3回処理されると最初に述べました。これで最初の質問に答えるはずです。 3回処理されるため、message()も3回実行されます。なぜ複数回処理されるのですか? qmakeはプロジェクトをビルドしないためです!実際にプロジェクトをビルドするために使用されるビルド命令のみを生成します。考えられるすべての構成のビルド手順を生成するには、プロジェクトファイルを複数回(構成ごとに1回)処理する必要があります。

2番目の質問:デバッグモードで選択した場合のみ、プロジェクトはデバッグモードでビルドされますが、既に説明したように、リリースモードでもビルド手順が作成されます。たとえば、(Visual Studioではなく)mingwで「make」を使用すると、2つのMakefile、_Makefile.Release_および_Makefile.Debug_を取得します。リリースメイクファイルを生成すると、「リリースモード」が出力されます。

最後に、CONFIG(debug, debug|release)は、CONFIGに「debug」が含まれるが「release」に含まれない場合、または「debug」と「release」の両方を含むが「release」が最後に出現した後に表示されない場合にtrueと評価されますデバッグ"。たとえば、これがあるかもしれません:

_CONFIG += release debug release debug release debug
_

最後の「デバッグ」は最後の「リリース」の後に来るため、CONFIG(debug, debug|release)はtrueです。

CONFIG()の最初の引数(この場合は「デバッグ」)は、最後に表示する必要がある値です。 2番目の引数( "debug | release")は、最初の引数がチェックされる値のセットです。

それを英語に翻訳すると、次のような結果になります。「debug」が少なくとも1回出現し、「release」も出現する場合、「debug」の最後の出現が「release」の最後の出現の後に来る場合、trueと評価します。

58
Nikos C.