コンパイラにフラグを取得するためにCMakeによって提供される複数のメカニズムがあります。
現代の使用で他よりも好まれる方法はありますか?もしそうなら、なぜですか?また、この方法をMSVCなどの複数の構成システムでどのように使用できますか?
コンパイラにフラグを取得するためにCMakeによって提供される複数のメカニズムがあります。
現代の使用で他よりも好まれる方法はありますか?もしそうなら、なぜですか?また、この方法をMSVCなどの複数の構成システムでどのように使用できますか?
回答:
最新のCMake(バージョン2.8.12以降)target_compile_options
では、ターゲットプロパティを内部的に使用するを使用する必要があります。
CMAKE_<LANG>_FLAGS
はグローバル変数であり、最もエラーが発生しやすい変数です。また、非常に便利なジェネレータ式もサポートしていません。
add_compile_options
これはディレクトリプロパティに基づいています。これは状況によっては問題ありませんが、通常、オプションを指定する最も自然な方法ではありません。
target_compile_options
ソースファイルのコンパイルオプションは、ファイルが配置されているディレクトリではなく、ファイルが属するプロジェクトによって決定されるため、ターゲットごとに(COMPILE_OPTIONS
およびINTERFACE_COMPILE_OPTIONS
ターゲットプロパティを設定することで)機能します。これにより、通常、最もクリーンなCMakeコードが生成されます。ハードディスクに)。これには、要求された場合に依存するターゲットへのオプションの受け渡しを自動的に処理するという追加の利点があります。
それらはもう少し冗長ですが、ターゲットごとのコマンドを使用すると、さまざまなビルドオプションを適度にきめ細かく制御でき、(私の個人的な経験では)長期的には頭痛の種になる可能性が最も低くなります。
理論的には、を使用してそれぞれのプロパティを直接設定することもできますがset_target_properties
、target_compile_options
通常はより読みやすくなります。
たとえば、foo
ジェネレータ式を使用して構成に基づいてターゲットのコンパイルオプションを設定するには、次のように記述できます。
target_compile_options(foo PUBLIC "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>")
target_compile_options(foo PUBLIC "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
target_compile_options
追加して、このように最後の行を変更して読みやすくすることに注意してください)
COMPILE_OPTIONS
directoryプロパティがこれを行います。add_compile_options
コマンドを使用してこれを設定できます。これが適切なアプローチであるオプションは、通常、ほとんどありません。
PUBLIC
inの用途は何target_compile_options
ですか?