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でテストを実行する3つのステップ: ctest_test() コマンドから始める

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



CMake の if() コマンド: デバッグとトラブルシューティング

構文条件式if() コマンドの引数には、条件式を指定します。条件式は、以下のいずれかの形式で記述できます。変数の比較: <variable> <operator> <value>コマンドの存在チェック: COMMAND <command-name>


CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する


CMake: find_library()とtarget_link_directories()の連携

target_link_directories()コマンドは、CMakeプロジェクト内のターゲットに対して、リンカがライブラリを検索するディレクトリを指定するために使用されます。これは、ターゲットがリンクするライブラリが標準の検索パスに存在しない場合に特に重要です。


CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。



CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。


Objective-C++コンパイラフラグチェックのサンプルコード

CheckOBJCXXCompilerFlag は、CMake の Modules に含まれるマクロで、C++ コンパイラが特定の Objective-C++ コンパイラフラグをサポートするかどうかを検出するために使用されます。これは、プロジェクトが特定の機能を使用するかどうかを判断したり、コンパイル時に適切なフラグを設定したりするために役立ちます。


CMake で VS_GLOBAL_variable を使って Visual Studio プロパティを自在に操る

CMake は、マルチプラットフォームな C++ プロジェクトを構築するための強力なツールです。 Visual Studio と連携して使用する場合、"Properties: Targets" セクションで "VS_GLOBAL_variable" を使用することで、プロジェクト設定をさらに細かく制御できます。


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

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


CMAKE_DISABLE_PRECOMPILE_HEADERS を使用したサンプルコード

CMAKE_DISABLE_PRECOMPILE_HEADERS は、CMake でプリコンパイルされたヘッダーファイルの生成を無効にするブール型の変数です。デフォルトでは OFF に設定されており、プロジェクト内のすべてのターゲットに対してプリコンパイルされたヘッダーファイルが生成されます。