2017-12-08 28 views
1

私の問題を説明するために空のQtプロジェクトを作成しました。 in proファイルのこのQMakeコードを除いて、プロジェクトには何もありません。プロジェクト/ビルドの設定は単にデフォルトです。QMake DEFINEに条件を守らずに追加する

このQmakeコードは常に$$system()関数を実行しますが、それは「裏口」です。 contains(DEFINES, anything)が常に真であると評価され、後続のコードが実行されるいくつかの謎のプロセスがあります。文字通り、私がsomethinganythingを使用したところで任意の値を使用できます。

CONFIG(something){ DEFINES+=anything } 
contains(DEFINES, anything){ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

これが実行されるたびに(私はちょうどところで、それをキックオフするQtCreatorでファイルを保存しています - qmakeのを実行していない)、この一般的なメッセージが表示されます:

プロジェクトMESSAGE:何を!

秒後に、test.txtファイルがプロジェクトディレクトリに表示されます。

ファイルの書き込みを制御する条件としてCONFIG()を直接使用すると、奇妙なことに加えて、これは起こりません。さらに、そのCONFIG()行を削除すると、これは起こりません。

これを評価する不思議なバックグラウンドプロセスがあり、常にDEFINES+=anythingを実行してから、ロジックが何であれ処理を続けます。

ソースファイルをプロジェクトに条件付きで追加すると、ファイルがコンパイルされていなくても、常にファイルブラウジングツリーに表示されます。これは、Qt Creatorが条件文を無視し、それ自身の目的のためにQMakeを実行する例です。これは演劇で同じメカニズムですか?

答えて

0

私はこれと戦う時間を無駄にして、質問を投稿した直後に答えに到着しました。私はしばしば、自分の問題を簡単に説明するという行為は、それを解決する方法を明確にしているようです。

とにかく、フードの下で何が起こっているのか、私の推測は正しいと確信しています。 Qt Creatorは、定義を作成するためにすべての条件を無視するコードのパスを実行します(プライベートな目的のために...)。

一つの解決策は、値を定義していないセットになり、そしてちょうどこのようなqmakeの変数を使用します:あなたが唯一のqmakeの内、後続の条件を使用する必要がある場合は罰金だ

CONFIG(something){ IS_SOMETHING=true } else { IS_SOMETHING=false } 
$$IS_SOMETHING{ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

を。しかし、その弱点は、ロジックをC++にカスケードしないことです。だから、私はよりよい解決策を見つけた:

defineReplace(hideFromIdeParser){ return($$1) } 

CONFIG(something){ DEFINES+=$$hideFromIdeParser(anything) } 
contains(DEFINES, anything){ 
    message(anything!) 
    stdOut=$$system(echo x > test.txt) 
} 
else{ 
    message(nothing!) 
} 

どうやら、ブラックボックスのパーサは、関数の結果を解決しませんので、必要に応じて、このトリックは、すべての仕事になります!

関連する問題