もう迷わない!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
モジュールを使用するのがおすすめです。 - 小規模なプロジェクトの場合は、環境変数を手動で設定するのが最も簡単です。