CMake の Variables に関連する CMAKE_SCRIPT_MODE_FILE のプログラミング

2024-04-02

CMakeの変数 CMAKE_SCRIPT_MODE_FILE の詳細解説

CMAKE_SCRIPT_MODE_FILE は、CMake の "Variables" における特別な変数です。これは、現在実行中の CMake スクリプトファイルのフルパスを格納します。この変数は、以下の状況でのみ使用できます。

  • cmake -P スクリプトモード
  • include() コマンドで CMake スクリプトファイルをインクルードしている場合

使用方法

CMAKE_SCRIPT_MODE_FILE 変数は、以下の目的で使用できます。

  • 現在のスクリプトファイルの場所を取得する
  • スクリプトファイルの場所に基づいて、条件付きの処理を行う
  • 他のスクリプトファイルへのパスを生成する

以下の例は、CMAKE_SCRIPT_MODE_FILE 変数の使い方を示しています。

# 現在のスクリプトファイルの場所を取得
message("Current script file: ${CMAKE_SCRIPT_MODE_FILE}")

# スクリプトファイルの場所に基づいて、条件付きの処理を行う
if(CMAKE_SCRIPT_MODE_FILE MATCHES "/path/to/my/script.cmake")
    # 特定の処理を行う
endif()

# 他のスクリプトファイルへのパスを生成する
set(other_script_file "${CMAKE_SCRIPT_MODE_FILE}/../other_script.cmake")

# 他のスクリプトファイルをインクルードする
include(${other_script_file})

注意事項

  • CMAKE_SCRIPT_MODE_FILE 変数は、CMakeLists.txt ファイル内では使用できません。
  • include() コマンドでインクルードされたスクリプトファイル内では、CMAKE_SCRIPT_MODE_FILE 変数は、インクルードされたファイルのパスではなく、インクルード元のファイルのパスを指します。

補足

  • CMAKE_SCRIPT_MODE_FILE 変数は、CMake のバージョン 3.0 以降で利用可能です。
  • 以前のバージョンの CMake では、CMAKE_CURRENT_LIST_FILE 変数を使用して、現在の CMakeLists.txt ファイルの場所を取得できました。


CMake の CMAKE_SCRIPT_MODE_FILE 変数を使ったサンプルコード

message("Current script file: ${CMAKE_SCRIPT_MODE_FILE}")

出力例:

Current script file: /path/to/my/script.cmake

スクリプトファイルの場所に基づいて、条件付きの処理を行う

if(CMAKE_SCRIPT_MODE_FILE MATCHES "/path/to/my/script.cmake")
    # 特定の処理を行う
else()
    # 別の処理を行う
endif()

他のスクリプトファイルへのパスを生成する

set(other_script_file "${CMAKE_SCRIPT_MODE_FILE}/../other_script.cmake")

# 他のスクリプトファイルをインクルードする
include(${other_script_file})

スクリプトファイル内の相対パスを解決する

# 現在のスクリプトファイルと同じディレクトリにあるファイルへのパスを取得
set(data_file "${CMAKE_SCRIPT_MODE_FILE}/data.txt")

# ファイルを読み込む
file(READ ${data_file} CONTENTS data)

message("Data: ${data}")

出力例:

Data: This is data from the data.txt file.

サブディレクトリ内の CMakeLists.txt ファイルを実行する

# サブディレクトリ内の CMakeLists.txt ファイルへのパスを取得
set(subdir_cmakelists "${CMAKE_SCRIPT_MODE_FILE}/subdir/CMakeLists.txt")

# サブディレクトリ内の CMakeLists.txt ファイルを実行する
add_subdirectory(subdir)

複数の CMake スクリプトファイル間で変数を共有する

# 共有変数を定義する
set(shared_variable "This is a shared variable")

# 他のスクリプトファイルに共有変数を渡す
set(other_script_file "${CMAKE_SCRIPT_MODE_FILE}/../other_script.cmake")
include(${other_script_file})

other_script.cmake

# 共有変数を使用する
message("Shared variable: ${shared_variable}")

出力例:

Shared variable: This is a shared variable

これらのサンプルコードは、CMAKE_SCRIPT_MODE_FILE 変数の使い方を理解するのに役立ちます。



CMake の CMAKE_SCRIPT_MODE_FILE 変数を使う以外の方法

CMAKE_CURRENT_LIST_FILE 変数は、現在実行中の CMakeLists.txt ファイルのフルパスを格納します。ただし、この変数は cmake -P スクリプトモードでは使用できません。

例:

message("Current CMakeLists.txt file: ${CMAKE_CURRENT_LIST_FILE}")

出力例:

Current CMakeLists.txt file: /path/to/my/CMakeLists.txt

file() コマンドを使用して、現在のスクリプトファイルのパスを取得することができます。

例:

file(RELATIVE_PATH script_path ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SCRIPT_MODE_FILE})

message("Current script file: ${script_path}")

出力例:

Current script file: my_script.cmake

get_filename_component() コマンドを使用して、現在のスクリプトファイルの名前とディレクトリパスを取得することができます。

例:

get_filename_component(script_name ${CMAKE_SCRIPT_MODE_FILE} NAME)
get_filename_component(script_dir ${CMAKE_SCRIPT_MODE_FILE} DIRECTORY)

message("Current script file: ${script_name} (in directory ${script_dir})")

出力例:

Current script file: my_script.cmake (in directory /path/to/my)

これらの方法は、CMAKE_SCRIPT_MODE_FILE 変数を使うよりも汎用性がありますが、状況によってはより複雑になることがあります。

CMAKE_SCRIPT_MODE_FILE 変数は、cmake -P スクリプトモードで現在のスクリプトファイルの場所を取得する最も簡単な方法です。ただし、CMAKE_CURRENT_LIST_FILE 変数や file() コマンドなど、他の方法も利用可能です。