CMake 3.7 登場の新機能: CMP0066 でコンパイラフラグ設定をもっと自由に
CMakeポリシー CMP0066 は、try_compile()
コマンドでソースファイルの署名に設定された構成固有のコンパイラフラグを処理する方法を制御します。このポリシーは、CMake 3.7 で導入されました。
旧動作と新動作
このポリシーには、以下の2つの動作モードがあります。
旧動作
- 代わりに、CMake は現在のコンパイラとプラットフォーム用の組み込みのデフォルト値のみを使用します。
- 構成固有のフラグ変数(例:
CMAKE_<LANG>_FLAGS_DEBUG
)は無視されます。
新動作
try_compile()
コマンドは、これらのフラグを使用してソースファイルをコンパイルします。- 構成固有のフラグ変数(例:
CMAKE_<LANG>_FLAGS_DEBUG
)が尊重されます。
互換性
CMake 3.6 以前のバージョンでは、try_compile()
は構成固有のコンパイラフラグをサポートしていませんでした。そのため、これらのバージョンでは、常に旧動作が使用されていました。
CMake 3.7 以降では、新動作がデフォルトで使用されます。ただし、CMP0066
ポリシーを "OLD" に設定することで、旧動作に戻すことができます。
警告
CMake 3.7 以降では、CMP0066
ポリシーが "OLD" に設定されている場合、CMake は警告を出力します。これは、互換性の問題を引き起こす可能性があるためです。
ポリシーの設定
CMP0066
ポリシーは、CMake のキャッシュで設定できます。以下の例では、ポリシーを "NEW" に設定しています。
cmake_minimum_required(VERSION 3.7)
project(myproject)
cmake_policy(SET CMP0066 NEW)
注意事項
- 構成固有のコンパイラフラグを使用する場合は、それらのフラグがプロジェクトで使用されているすべてのコンфигуレーションで定義されていることを確認する必要があります。
CMP0066
ポリシーは、try_compile()
コマンドのみを対象としています。他の CMake コマンドは、このポリシーの影響を受けません。
CMakeポリシー CMP0066 は、try_compile()
コマンドでソースファイルの署名に設定された構成固有のコンパイラフラグを処理する方法を制御します。このポリシーは、CMake 3.7 で導入され、デフォルトでは新動作が使用されます。旧動作に戻す場合は、ポリシーを "OLD" に設定する必要があります。
cmake_minimum_required(VERSION 3.7)
project(myproject)
set(CMAKE_C_FLAGS_DEBUG "-Wall -g")
try_compile(RESULT mycode main.c)
message("try_compile RESULT: ${RESULT}")
このコードを実行すると、以下の出力が表示されます。
try_compile RESULT: SUCCESS
例2:CMP0066 ポリシーの設定
この例では、CMP0066
ポリシーを "OLD" に設定して、旧動作を使用します。
cmake_minimum_required(VERSION 3.7)
project(myproject)
cmake_policy(SET CMP0066 OLD)
set(CMAKE_C_FLAGS_DEBUG "-Wall -g")
try_compile(RESULT mycode main.c)
message("try_compile RESULT: ${RESULT}")
try_compile RESULT: SUCCESS
説明
- これは、
try_compile()
コマンドが構成固有のコンパイラフラグを無視するように指示します。 - 例2 では、
cmake_policy()
コマンドを使用して、CMP0066
ポリシーを "OLD" に設定します。 try_compile()
コマンドは、main.c
ファイルをコンパイルし、RESULT
変数に結果を格納します。- 例1 では、
CMAKE_C_FLAGS_DEBUG
変数を使用して、debug
構成用のコンパイラフラグを定義します。
- 実際のプロジェクトでは、より複雑な構成とフラグを使用する必要がある場合があります。
- これらの例は、
try_compile()
コマンドとCMP0066
ポリシーの基本的な使用方法を示しています。
"CMP0066" の代替方法はいくつかあります。以下に、そのうちのいくつかを紹介します。
構成固有のフラグを直接 try_compile() コマンドに渡す
try_compile()
コマンドには、COMPILE_FLAGS
オプションを使用して、構成固有のコンパイラフラグを直接渡すことができます。以下の例では、debug
構成用のコンパイラフラグ (-Wall -g
) を渡しています。
try_compile(RESULT mycode main.c COMPILE_FLAGS "-Wall -g")
カスタム CMake モジュールを作成する
try_compile()
コマンドの動作をカスタマイズするカスタム CMake モジュールを作成することもできます。このモジュールは、構成固有のコンパイラフラグを取得し、try_compile()
コマンドに渡すことができます。
サードパーティのライブラリを使用する
CMake には、try_compile()
コマンドの動作を拡張するサードパーティのライブラリがいくつかあります。これらのライブラリを使用して、構成固有のコンパイラフラグを処理することができます。
各方法の比較
方法 | 利点 | 欠点 |
---|---|---|
構成固有のフラグを直接 try_compile() コマンドに渡す | シンプルでわかりやすい | 冗長で、コードが散らかる可能性がある |
カスタム CMake モジュールを作成する | 柔軟性が高い | 複雑で、開発に時間がかかる |
サードパーティのライブラリを使用する | 簡単で使いやすい | 特定のニーズに合わない場合がある |
最適な方法の選択
最適な方法は、プロジェクトの要件によって異なります。以下の点を考慮して選択してください。
- プロジェクトの要件
- 開発者のスキル
- プロジェクトの複雑性
- 構成固有のコンパイラフラグを使用する場合は、それらのフラグがプロジェクトで使用されているすべてのコンфигуレーションで定義されていることを確認する必要があります。
- いずれの方法を使用する場合も、CMake のドキュメントをよく読んで理解しておくことが重要です。