2015-12-15 3 views
8

同じコマンドラインでclang -O2 -O3をこの順番で指定すると、は-O2を上書きしますか?後の引数は常にオーバーライドされますか?
私がデフォルトで変更できないビルドスクリプトは-O2を追加し、後に追加することができます。それは受け入れられるものですか?clangコマンドラインの引数を無効にする

答えて

6

Clangドライバの操作については、マニュアルページDriver Design & Internals § Driver stagesに記載されています。 -###オプションを使用して各ステージの結果をダンプする方法を確認してください。これはオプションが最初にリストされなければならないので、あなたがボルケンビルドシステムで行使できるものではありません。 「云々」はそれのあまりがありますので、私は、省略することを吐き出すある

clang -### foo.cpp -O2 -O3 # dumps yayayada "-O3" yadamore 
clang -### foo.cpp -O3 -O2 # dumps yayayada "-O2" yadamore 

を:しかし、あなたはドライバーが実際にあなたはそれがない願って何ないことを確認することができます。したがって、実際には最後に-Oというオプションが有効です。どのコンパイラドライバでも期待される動作です。

4

clangオプションは左から右に処理されます。従って、最後の-Oオプションが "勝つ"。これは正確にあなたが尋ねる理由のための機能です:だから、他の人が設定したデフォルトを上書きする可能性があります(例えばビルドシステム、ソフトウェア開発者など)。はい、それは完全に受け入れられ、あなたは十分な会社です。ボックスの外側を考える

究極の参照はLLVMのソースコードになります( を扱うオプションは、ファイルlib/Support/CommandLine.cppcl::ParseCommandLineOptions()によって実装されます。)

:でもあなたがいない変更ビルドスクリプトをことができれば、あなたはかもしれ影響あなたがしたいことをすること。例えば、最適化オプションは、オプションまたは環境から取られた変数の一部であってもよい。ビルドがMakefileを使用した場合、変数はCFLAGSまたはCOPTSと呼ばれることができ、ビルドはシェルスクリプトを使用している場合は、多分

CFLAGS="-O3" ./configure 

のようなものが働くだろう

make CFLAGS=-O3 

で設定します。ビルドを見ることなく、言うことはありません。