CMake 3.15 の新機能:ポリシー CMP0094 で Python インタープリター検索を強化
CMakeポリシー CMP0094 は、FindPython3
、FindPython2
、および FindPython
モジュールにおける Python インタープリターの検索戦略に影響を与えます。このポリシーは CMake 3.15 で導入され、古い動作は非推奨となり、将来のバージョンで削除される可能性があります。
変更内容
このポリシーが導入される以前は、上記のモジュールは PYTHON_PATH
環境変数と CMAKE_PREFIX_PATH
キャッシュを使用して Python インタープリターを検索していました。しかし、この方法は必ずしも信頼できるとは限りません。
CMP0094 を有効にすると、これらのモジュールは代わりに LOCATION
キーワードを使用して Python インタープリターを検索します。これは、より信頼性の高い方法であり、Python インタープリターがインストールされている場所をより正確に特定できます。
影響
このポリシーの変更により、以下の影響があります。
LOCATION
キーワードを使用して Python インタープリターを指定する必要があります。これは、CMAKE_MODULE_PATH
キャッシュ内にあるFindPython3.cmake
、FindPython2.cmake
、またはFindPython.cmake
モジュールのLOCATION
プロパティを設定することで行うことができます。PYTHON_PATH
環境変数とCMAKE_PREFIX_PATH
キャッシュは、Python インタープリターの検索に使用されなくなります。
例
以下の例は、LOCATION
キーワードを使用して Python 3 インタープリターを指定する方法を示しています。
cmake_minimum_required(VERSION 3.15)
project(MyProject)
find_package(Python3 3.6 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
この例では、FindPython3
モジュールの LOCATION
プロパティが CMAKE_MODULE_PATH
キャッシュ内に設定されていることを前提としています。
- 古い動作を使用する必要がある場合は、
CMP0094_OLD
ポリシーをOLD
に設定できます。ただし、これは非推奨であり、将来のバージョンで削除される可能性があります。 - このポリシーは、CMake 3.15 以降でのみ使用できます。
例 1:LOCATION
キーワードを使用して Python 3 インタープリターを指定する
cmake_minimum_required(VERSION 3.15)
project(MyProject)
find_package(Python3 3.6 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
この例では、FindPython3
モジュールの LOCATION
プロパティが CMAKE_MODULE_PATH
キャッシュ内に設定されていることを前提としています。LOCATION
プロパティは、Python インタープリターがインストールされている場所を指定します。
この例では、Python3
モジュールのバージョン 3.6 が必要であることを指定しています。
cmake_minimum_required(VERSION 3.15)
project(MyProject)
cmake_policy(SET CMP0094_OLD)
find_package(Python3 3.6 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
説明
この例では、CMP0094_OLD
ポリシーを OLD
に設定することで、古い動作を使用しています。この場合、FindPython3
モジュールは PYTHON_PATH
環境変数と CMAKE_PREFIX_PATH
キャッシュを使用して Python インタープリターを検索します。
- 古い動作を使用する必要がある場合は、このポリシーを使用する前に、その影響を慎重に検討する必要があります。
CMP0094_OLD
ポリシーは非推奨であり、将来のバージョンで削除される可能性があります。
CMP0094 の代替方法として、以下の方法が考えられます。
PYTHON_PATH 環境変数と CMAKE_PREFIX_PATH キャッシュを使用する
これは、CMP0094 が導入される以前のデフォルトの動作です。この方法は、必ずしも信頼できるとは限りませんが、単純で簡単です。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
find_package(Python3 3.6 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
CMAKE_MODULE_PATH キャッシュに FindPython3.cmake、FindPython2.cmake、または FindPython.cmake モジュールの LOCATION プロパティを設定する
これは、CMP0094 の推奨される方法です。この方法は、より信頼性の高い方法であり、Python インタープリターがインストールされている場所をより正確に特定できます。
cmake_minimum_required(VERSION 3.15)
project(MyProject)
list(APPEND CMAKE_MODULE_PATH "/path/to/FindPython3.cmake")
find_package(Python3 3.6 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
カスタムモジュールを作成する
これは、最も複雑な方法ですが、最も柔軟な方法です。カスタムモジュールを作成することで、Python インタープリターの検索方法を完全に制御できます。
CMakeLists.txt ファイルを直接編集する
これは、最も直接的な方法ですが、最も推奨されない方法です。CMakeLists.txt ファイルを直接編集することで、Python インタープリターへのパスをハードコーディングできます。
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(PYTHON_EXECUTABLE "/path/to/python3")
find_package(Python3 REQUIRED)
add_executable(MyProgram MyProgram.cpp)
target_link_libraries(MyProgram Python3::Python)
- 古い動作を使用する必要がある場合は、
CMP0094_OLD
ポリシーを使用する必要があります。ただし、これは非推奨であり、将来のバージョンで削除される可能性があります。 - 使用する方法は、プロジェクトの要件と CMake のバージョンによって異なります。
- 上記の方法は、すべて互いに排他的です。