CMake 3.24で導入された「CMP0135」ポリシー:依存関係の再ビルドを確実に実行するために


CMakeポリシー「CMP0135」は、ExternalProject_Add()コマンドでURLダウンロード方式を使用する場合の、抽出コンテンツのタイムスタンプ設定に関するものです。このポリシーは、CMake 3.24で導入されました。

旧動作と新動作

  • 新動作(CMake 3.24以降): 抽出コンテンツのタイムスタンプは、抽出時間に設定されます。これにより、URLが変更された場合に、抽出コンテンツが確実に更新され、依存関係にあるものが正しく再ビルドされるようになります。
  • 旧動作(CMake 3.23以下): アーカイブのタイムスタンプと同じタイムスタンプが、抽出コンテンツに設定されます。URLが変更されても、抽出コンテンツのタイムスタンプは更新されない可能性があり、依存関係にあるものが再ビルドされない場合があります。

影響を受けるもの

このポリシーは、ExternalProject_Add()コマンドでURLダウンロード方式を使用するプロジェクトに影響を与えます。

設定方法

このポリシーは、以下のいずれかの方法で設定できます。

  • CMakeLists.txtファイルに以下の行を追加します。
cmake_policy(SET CMP0135 NEW)
  • CMake GUIを使用する場合は、以下の手順を実行します。

    1. CMake GUIを開きます。
    2. 左側のペインで、プロジェクトを選択します。
    3. 右側のペインで、「CMake Policy」タブを選択します。
    4. 「CMP0135」ポリシーを見つけ、ドロップダウンリストから「NEW」を選択します。
    5. 「Apply Changes」ボタンをクリックします。
  • 以前のバージョンのCMakeを使用している場合は、旧動作が適用されます。
  • このポリシーは、CMake 3.24以降でのみ使用できます。


cmake_minimum_required(VERSION 3.24)

project(MyProject)

# 外部プロジェクトを追加
externalproject_add(
  MyExternalProject
  URL https://example.com/MyExternalProject.tar.gz
  UPDATE_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/MyExternalProject/CMakeLists.txt
  INSTALL_COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/MyExternalProject/install.cmake
)

# CMP0135ポリシーをNEWに設定
cmake_policy(SET CMP0135 NEW)

例2:CMake GUIでの設定

  1. CMake GUIを開きます。
  2. プロジェクトを選択します。
  3. 「CMake Policy」タブを選択します。
  4. 「CMP0135」ポリシーを見つけ、ドロップダウンリストから「NEW」を選択します。
  5. 「Apply Changes」ボタンをクリックします。

説明

上記の例では、ExternalProject_Add()コマンドを使用して外部プロジェクトを追加し、cmake_policy()コマンドを使用してCMP0135ポリシーをNEWに設定しています。

  • CMake 3.24未満を使用している場合は、CMP0135ポリシーを使用できません。
  • 上記のコードはあくまで一例であり、プロジェクトの要件に合わせて変更する必要があります。


  1. CMakeLists.txtファイルに設定を追加する
  2. CMake GUIを使用する

しかしながら、状況によっては、以下の方法も検討することができます。

スーパービルドツールを使用する

スーパービルドツールを使用すると、CMakeLists.txtファイルに個別に設定を追加する必要がなく、一括で設定することができます。代表的なスーパービルドツールとしては、以下のものがあります。

  • Wix
  • Premake
  • CmakeLists.txt

これらのツールは、それぞれ異なる機能や利点を持っているため、プロジェクトの要件に合わせて選択する必要があります。

スクリプトを使用する

CMakeは、Pythonなどのスクリプト言語を使用して拡張することができます。スクリプトを使用すると、CMakeLists.txtファイルに直接記述できない複雑な処理を実行することができます。

CMP0135ポリシーを設定するスクリプトを作成することで、自動的に設定を適用することができます。ただし、スクリプトを作成するには、プログラミングに関する知識が必要となります。

CMakeオプションを使用する

CMakeには、様々なオプションが用意されています。これらのオプションの中には、CMP0135ポリシーの設定に関連するものもあります。

例えば、以下のオプションを使用すると、CMakeLists.txtファイルに設定を追加することなく、ポリシーを設定することができます。

-DCMAKE_POLICY_SET=CMP0135=NEW

このオプションは、コマンドラインからCMakeを実行する場合に使用することができます。

環境変数を使用する

CMakeは、環境変数を使用して設定を変更することができます。以下の環境変数を設定することで、CMP0135ポリシーを設定することができます。

CMAKE_POLICY_SET=CMP0135=NEW

この方法は、すべてのCMakeプロジェクトに一括でポリシーを設定する場合に有効です。

注意事項

上記の方法を使用する場合は、それぞれの方法の注意事項を理解した上で使用してください。

  • [CMake オプション](https://cmake.org/cmake/help/latest/ cmake_options.html)