2013-05-08 8 views
6

CMakeファイル(CMake 2.8.10.2)のCとC++のコンパイル行にさまざまなフラグを追加する必要があります。私はいくつかの人がadd_definitionsを使用しているのを見ていますが、それはプリプロセッサフ​​ラグ(-D)を対象としています。私はプリプロセッサに渡したくないフラグをいくつか持っています。cmake listにコンパイラフラグを追加すると偽の結果になるか?

だから私はCMAKE_C_FLAGSCMAKE_CXX_FLAGSを修正しようとしていました。私は何人かの人々のようなものに使用していたことを参照してください。

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here") 

をその後私は、これはあまり効率的であることをcmakeのドキュメントに読み込み、それを行うための正しい方法はこのように、list(APPEND ...)を使用することです:

list(APPEND CMAKE_C_FLAGS -new -flags -here) 

しかし、これを実行すると、コンパイル行にセミコロンで区切られたフラグが含まれており、構文エラーです。私はこれが今ではリストが内部的に保存されていることを読んでいますが、変数を使用したときにcmakeがこれを処理すると考えました。これはとても基本的です。私は何か間違っているのですか?セミコロンで区切られた値のリスト(そして、Windows%PATH%の設定など)以外のものが必要な場合を除き、使用できない場合には、これらのリストはどれですか?私は引用符で囲まれたバージョンを使用するべきですか?

+1

私はそれが物事などをコピーするときのvar名の不一致を取得するのは簡単ですといえセット()アプローチのためのマクロを使用します endmacro() – Trass3r

答えて

6

この場合、通常は通常set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")というテクニックを使用します。

ほとんどの他の文脈では、CMakeはセミコロンで区切られたリストをコンパイラにとって意味のあるもの(たとえば、実行可能ファイルのソースファイルのリスト)に "翻訳"できますが、この場合、CMakeはコンパイラ/リンカーに渡す単一の完全な文字列としてのフラグ。

フラグのリストをCMakeリストとして残したければ、CMakeLists.txtを終了する前にリストを単一の文字列値CMAKE_C_FLAGSに "翻訳"することができますが、これは珍しいことですこの。

+1

より簡潔なイディオムは 'string(APPEND CMAKE_C_FLAGS" -new-flags ")です。 – Chadversary

1

CMakeでは、「リスト」は、セミコロンで区切られた項目の文字列です。たとえば:CMakeので

set(FOO "a") 
list(APPEND FOO "b") # now FOO="a;b" 
list(APPEND FOO "c") # now FOO="a;b;c" 

スペース -seperated項目の文字列は単なる文字列ではなく、リストです。追加するにはstring(APPEND)コマンドを使用します。たとえば:string(APPEND)コマンドが不足しているCMakeの古いバージョンでは

set(FOO "a") 
string(APPEND FOO " b") # now FOO="a b" 
string(APPEND FOO " c") # now FOO="a b c" 

、あなたはsetコマンドにフォールバックする必要があります。たとえば: マクロ(名前の項目を追加) \tセット($ {:

set(FOO "a") 
set(FOO "${FOO} b") 
set(FOO "${FOO} c") 
関連する問題