CMake 3.15 の新機能:ポリシー CMP0094 で Python インタープリター検索を強化


CMakeポリシー CMP0094 は、FindPython3FindPython2、および FindPython モジュールにおける Python インタープリターの検索戦略に影響を与えます。このポリシーは CMake 3.15 で導入され、古い動作は非推奨となり、将来のバージョンで削除される可能性があります。

変更内容

このポリシーが導入される以前は、上記のモジュールは PYTHON_PATH 環境変数と CMAKE_PREFIX_PATH キャッシュを使用して Python インタープリターを検索していました。しかし、この方法は必ずしも信頼できるとは限りません。

CMP0094 を有効にすると、これらのモジュールは代わりに LOCATION キーワードを使用して Python インタープリターを検索します。これは、より信頼性の高い方法であり、Python インタープリターがインストールされている場所をより正確に特定できます。

影響

このポリシーの変更により、以下の影響があります。

  • LOCATION キーワードを使用して Python インタープリターを指定する必要があります。これは、CMAKE_MODULE_PATH キャッシュ内にある FindPython3.cmakeFindPython2.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 のバージョンによって異なります。
  • 上記の方法は、すべて互いに排他的です。