CMakeポリシー CMP0087 の影響を受けるコマンド

2024-04-10

CMakeポリシー CMP0087 は、install(CODE)install(SCRIPT) コマンドにおけるジェネレータ式(generator expressions)の評価方法を制御します。このポリシーは CMake 3.2 で導入されました。

旧動作と新動作

旧動作 (CMake 3.1 以前):

  • ジェネレータ式は、install(CODE)install(SCRIPT) コマンドが実行される前に評価されます。
  • つまり、インストール先のパスは、CMake のconfigure段階で決定されます。

新動作 (CMake 3.2 以降):

  • ジェネレータ式は、install() コマンドが実行される直前に評価されます。
  • つまり、インストール先のパスは、ビルド段階で決定されます。

ポリシー設定方法

以下のコマンドで、ポリシーの動作を設定できます。

cmake_policy(CMP0087 NEW)  # 新動作を有効にする
cmake_policy(CMP0087 OLD)  # 旧動作を有効にする

影響を受けるコマンド

以下のコマンドは、CMP0087 ポリシーの影響を受けます。

  • install(CODE)
  • install(SCRIPT)

以下の例は、install(CODE) コマンドでジェネレータ式を使用する例です。

set(CMAKE_INSTALL_PREFIX "/usr/local")

# 新動作の場合、インストール先のパスは "/usr/local/bin" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program\")
  install(PROGRAMS my_program DESTINATION bin)
")

# 旧動作の場合、インストール先のパスは "/usr/local" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/my_program\")
  install(PROGRAMS my_program DESTINATION .)
")

注意事項

  • CMP0087 ポリシーは、CMake 3.2 以降でのみ使用できます。
  • 新動作を使用する場合は、ジェネレータ式がビルド段階で評価されることを考慮する必要があります。
  • 上記の説明で不明な点があれば、遠慮なく質問してください。
  • CMake に関する情報は、公式ドキュメントやチュートリアルを参照することをお勧めします。


CMake ポリシー CMP0087 のサンプルコード

サンプルコード 1: インストール先のパスを取得する

# 新動作の場合、インストール先のパスは "/usr/local/bin" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program\")
  install(PROGRAMS my_program DESTINATION bin)
")

# 旧動作の場合、インストール先のパスは "/usr/local" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/my_program\")
  install(PROGRAMS my_program DESTINATION .)
")

このサンプルコードは、install(CODE) コマンドでジェネレータ式を使用して、インストール先のパスを取得する方法を示しています。

新動作の場合、ジェネレータ式は install() コマンドが実行される直前に評価されるため、インストール先のパスは ${CMAKE_INSTALL_PREFIX}/bin になります。

旧動作の場合、ジェネレータ式は CMake のconfigure段階で評価されるため、インストール先のパスは ${CMAKE_INSTALL_PREFIX} になります。

サンプルコード 2: ファイル名にビルド情報を追加する

set(BUILD_VERSION "1.0.0")

# 新動作の場合、インストールされるファイル名は "my_program-1.0.0" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program-${BUILD_VERSION}\")
  install(PROGRAMS my_program DESTINATION bin RENAME my_program-${BUILD_VERSION})
")

# 旧動作の場合、インストールされるファイル名は "my_program" になります。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program\")
  install(PROGRAMS my_program DESTINATION bin)
")

説明

このサンプルコードは、install(CODE) コマンドでジェネレータ式を使用して、ファイル名にビルド情報を追加する方法を示しています。

新動作の場合、ジェネレータ式は install() コマンドが実行される直前に評価されるため、ファイル名は "my_program-${BUILD_VERSION}" になります。

旧動作の場合、ジェネレータ式は CMake のconfigure段階で評価されるため、ファイル名は "my_program" になります。

サンプルコード 3: 条件付きインストール

set(CONDITION TRUE)

# 新動作の場合、CONDITION が TRUE の場合のみ、my_program がインストールされます。
install(CODE "
  if(${CONDITION})
    message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program\")
    install(PROGRAMS my_program DESTINATION bin)
  endif()
")

# 旧動作の場合、CONDITION に関係なく、my_program がインストールされます。
install(CODE "
  message(\"-- Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program\")
  install(PROGRAMS my_program DESTINATION bin)
")

説明

このサンプルコードは、install(CODE) コマンドでジェネレータ式を使用して、条件付きインストールを行う方法を示しています。

新動作の場合、ジェネレータ式は install() コマンドが実行される直前に評価されるため、CONDITION が TRUE の場合のみ my_program がインストールされます。

旧動作の場合、ジェネレータ式は CMake のconfigure段階で評価されるため、CONDITION に関係なく my_program がインストールされます。

上記は、CMake ポリシー CMP0087 のサンプルコードです。これらのサンプルコードを参考に、実際のプロジェクトで CMP0087 ポリシーを活用してください。

  • 上記のサンプルコードは、あくまでも参考例です。
  • ご質問やご不明な点がございましたら、遠慮なくお声掛けください。


CMake ポリシー CMP0087 の代替方法

カスタムコマンドを使用する

install(CODE)install(SCRIPT) コマンドの代わりに、カスタムコマンドを使用してインストール処理を行うことができます。カスタムコマンドでは、ジェネレータ式を自由に使用できます。

add_custom_command(
  TARGET my_program
  POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E echo "Installing executable: ${CMAKE_INSTALL_PREFIX}/bin/my_program"
  COMMAND ${CMAKE_COMMAND} -E install PROGRAMS my_program DESTINATION bin
)

説明

この例では、add_custom_command コマンドを使用して、my_program のインストール処理を定義しています。

POST_BUILD オプションにより、my_program のビルド後にインストール処理が実行されます。

-E echo コマンドにより、インストール先のパスを出力しています。

-E install コマンドにより、my_program をインストールしています。

インストールスクリプトを使用する

install(SCRIPT) コマンドの代わりに、インストールスクリプトを使用してインストール処理を行うことができます。インストールスクリプトでは、任意の言語を使用してジェネレータ式を評価できます。

# install.sh

#!/bin/bash

set -e

echo "Installing executable: /usr/local/bin/my_program"

install my_program /usr/local/bin

説明

この例では、install.sh という名前のインストールスクリプトを作成しています。

このスクリプトは、my_program/usr/local/bin ディレクトリにインストールします。

スクリプト内で、echo コマンドを使用してインストール先のパスを出力しています。

CMake 変数を使用する

ジェネレータ式で必要な情報




CMake find_file() コマンドの代替方法:もっと柔軟なファイル検索

<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)



プログラミング初心者でもわかる!CMake の "set_directory_properties()" コマンドの使い方

set_directory_properties() コマンドは、CMakeプロジェクト内のディレクトリとサブディレクトリにプロパティを設定するために使用されます。これらのプロパティは、ビルドプロセス、インストール、その他の CMake 動作を制御するために使用できます。


CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。


C++標準ライブラリ、テンプレートエンジン、シェルスクリプト... string()コマンドの代替方法を徹底比較

CMakeのstring()コマンドは、文字列処理を行うための強力なツールです。C++のstd::stringのような機能に加え、CMake特有の便利な機能も備えています。主な機能文字列の連結、分割、置換、比較大文字・小文字変換部分文字列の抽出



CMakeにおける CMAKE_MATCH_COUNT 変数の詳細解説

CMAKE_MATCH_COUNTは、CMakeのVariablesにおいて、正規表現マッチングの成功回数を格納する変数です。string(REGEX)やlist(FILTER)などのコマンドで正規表現を用いた処理を行った際に、マッチングした要素の数を取得できます。


テストの出力内容を正規表現でチェック: FAIL_REGULAR_EXPRESSION と ASSERT_THAT の比較

FAIL_REGULAR_EXPRESSION は、CMake の Properties: Tests におけるテストプロパティの一つです。テストの標準出力または標準エラー出力に指定された正規表現がマッチした場合、テストを強制的に失敗させる機能を提供します。


CMakeでVS_IOT_EXTENSIONS_VERSIONを使用する際のトラブルシューティング

VS_IOT_EXTENSIONS_VERSION は、CMake のターゲットプロパティで、Visual Studio ソリューションに含める Windows 10 IoT 拡張のバージョンを指定します。設定方法バージョンは、4 つの数字で構成される文字列で指定します。例:


CMake ポリシー CMP0007 とは? 空要素の扱いと設定方法

CMakeポリシー CMP0007 は、CMakeLists. txt ファイルにおける空要素の扱いに関する互換性維持のためのポリシーです。このポリシーは CMake 2.4 で導入されました。旧挙動 (OLD)CMake 2.4 以前では、; で区切られたリストにおいて、空要素は無視されていました。例えば、以下のリストは長さ 3 となります。


CMake の INTERFACE_SYSTEM_INCLUDE_DIRECTORIES とは?

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、他のターゲットがこのターゲットを依存関係として使用する際に、コンパイル時に自動的に追加されるシステムヘッダーディレクトリを指定します。これは、ターゲットが提供するインターフェースの一部として公開されるヘッダーファイルへのパスを指定するために使用されます。