コンパイラにフラグを取得するために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_OPTIONSdirectoryプロパティがこれを行います。add_compile_optionsコマンドを使用してこれを設定できます。これが適切なアプローチであるオプションは、通常、ほとんどありません。
PUBLICinの用途は何target_compile_optionsですか?