もう迷わない!CMakeのポリシー「CMP0132」の疑問を徹底解説


CMake のポリシー CMP0132 は、CMake 3.24 以降で導入された新しい動作に関するものです。このポリシーは、ビルドディレクトリで初めて言語が有効化されたときに、その言語に関連する環境変数を自動的に設定するかどうかを制御します。

旧動作

CMake 3.24 より前のバージョンでは、言語が有効化されると、その言語に関連する環境変数がビルドディレクトリで初めて設定されました。これは、たとえその言語が以前のビルドで使用されていなかったとしても、常に実行されていました。

新動作

CMake 3.24 以降では、この動作が変更されました。デフォルトでは、言語が有効化されても、その言語に関連する環境変数は設定されません。これは、これらの環境変数が常に必要とは限らないためです。

ポリシーの影響

このポリシーは、CMake 3.24 以降を使用するプロジェクトに影響を与えます。以前の CMake バージョンで動作していたプロジェクトは、このポリシーの影響を受ける可能性があります。

ポリシーの設定

このポリシーは、CMakeLists.txt ファイルで次のいずれかの方法で設定できます。

  • CMAKE_POLICY_SET(CMP0132 NEW) コマンドを使用する
  • cmake_minimum_required(VERSION 3.24) コマンドを使用する

推奨事項

一般的には、このポリシーを NEW に設定することをお勧めします。これは、環境変数が常に必要とは限らないため、不要な設定を回避するのに役立ちます。

次の例は、CMakeLists.txt ファイルでポリシーを NEW に設定する方法を示しています。

cmake_minimum_required(VERSION 3.24)
CMAKE_POLICY_SET(CMP0132 NEW)

このポリシーの詳細については、以下のリソースを参照してください。

  • このポリシーは、CMake の target_link_libraries コマンドで指定されたライブラリに関連する環境変数には影響しません。
  • このポリシーは、C、C++、Fortran などの言語にのみ適用されます。


cmake_minimum_required(VERSION 3.24)
CMAKE_POLICY_SET(CMP0132 NEW)

project(myproject)

add_executable(myprogram myprogram.cpp)

この例では、cmake_minimum_required コマンドを使用して CMake バージョン 3.24 を要求し、CMAKE_POLICY_SET コマンドを使用してポリシー CMP0132 を NEW に設定します。

例 2:ポリシーを OLD に設定する

cmake_minimum_required(VERSION 3.24)
CMAKE_POLICY_SET(CMP0132 OLD)

project(myproject)

add_executable(myprogram myprogram.cpp)

この例では、CMAKE_POLICY_SET コマンドを使用してポリシー CMP0132 を OLD に設定します。

例 3:ポリシーを COMPATIBLE に設定する

cmake_minimum_required(VERSION 3.24)
CMAKE_POLICY_SET(CMP0132 COMPATIBLE)

project(myproject)

add_executable(myprogram myprogram.cpp)

この例では、CMAKE_POLICY_SET コマンドを使用してポリシー CMP0132 を COMPATIBLE に設定します。

説明

これらの例では、myproject という名前のプロジェクトを作成し、myprogram という名前の実行可能ファイルを追加します。myprogram 実行可能ファイルは myprogram.cpp ファイルからコンパイルされます。

ポリシーの影響

これらの例では、ポリシー CMP0132 の設定が myprogram 実行可能ファイルのビルド方法にどのように影響するかを示します。

  • COMPATIBLE に設定すると、CMake は使用している CMake バージョンに基づいてポリシーを自動的に設定します。CMake 3.24 以降を使用している場合は、ポリシーは NEW に設定されます。CMake 3.24 より前のバージョンを使用している場合は、ポリシーは OLD に設定されます。
  • OLD に設定すると、myprogram.cpp ファイルがコンパイルされる前に、C++ コンパイラに関連する環境変数が設定されます。
  • NEW に設定すると、myprogram.cpp ファイルがコンパイルされる前に、C++ コンパイラに関連する環境変数が設定されません。


このポリシーの代替方法として、以下の方法が考えられます。

環境変数を手動で設定する

ビルドスクリプト内で、言語に関連する環境変数を手動で設定することができます。これにより、ポリシー CMP0132 の影響を受けることなく、必要な環境変数を常に設定することができます。

次の例は、C++ コンパイラに関連する環境変数を手動で設定する方法を示しています。

export CC=gcc
export CXX=g++

CMake の target_link_libraries コマンドを使用する

target_link_libraries コマンドを使用して、ターゲットにリンクするライブラリを指定することができます。このコマンドは、ライブラリに関連する環境変数も自動的に設定します。

次の例は、target_link_libraries コマンドを使用して libfoo.so ライブラリにリンクする方法を示しています。

target_link_libraries(myprogram libfoo)

CMake の ExternalProject モジュールを使用する

ExternalProject モジュールを使用して、外部プロジェクトをビルドすることができます。このモジュールは、外部プロジェクトに必要な環境変数を自動的に設定します。

次の例は、ExternalProject モジュールを使用して Boost ライブラリをビルドする方法を示しています。

cmake_minimum_required(VERSION 3.10)

include(ExternalProject)

ExternalProject_Add(Boost
  URL https://boost.org/users/download/
  UPDATE_COMMAND ${CMAKE_BINARY_DIR}/Boost/bootstrap.sh
  CONFIGURE_COMMAND ${CMAKE_BINARY_DIR}/Boost/configure --without-python --without-mpi --without-thread
  BUILD_COMMAND ${CMAKE_BINARY_DIR}/Boost/bjam
  INSTALL_COMMAND ${CMAKE_BINARY_DIR}/Boost/bjam install
)

target_link_libraries(myprogram Boost::regex)

CMake の FindPackage モジュールを使用する

FindPackage モジュールを使用して、特定のライブラリまたはパッケージを検索することができます。このモジュールは、ライブラリまたはパッケージに必要な環境変数を自動的に設定します。

次の例は、FindPackage モジュールを使用して Eigen ライブラリを検索する方法を示しています。

cmake_minimum_required(VERSION 3.15)

find_package(Eigen REQUIRED)

target_link_libraries(myprogram Eigen::core)

推奨事項

どの代替方法を使用するかは、プロジェクトの要件によって異なります。一般的には、以下の方法が推奨されます。

  • 特定のライブラリまたはパッケージを使用する場合は、FindPackage モジュールを使用するのがおすすめです。
  • 中規模から大規模なプロジェクトの場合は、target_link_libraries コマンドまたは ExternalProject モジュールを使用するのがおすすめです。
  • 小規模なプロジェクトの場合は、環境変数を手動で設定するのが最も簡単です。