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 のドキュメントをよく読んで理解しておくことが重要です。