CMake: サブディレクトリ内のCMakeLists.txtファイルを正しく実行する
- 用途
- 現在実行されている CMake スクリプトファイルの場所を特定する
- スクリプト内の相対パスを処理する
- スクリプト固有の設定や情報をロードする
- 説明
現在の CMake スクリプトファイルのフルパスを格納します。 - カテゴリ
CMake変数 - 変数名
CMAKE_SCRIPT_MODE_FILE
詳細説明
CMAKE_SCRIPT_MODE_FILE
変数は、cmake -P
オプションを使用して CMake スクリプトを実行する場合にのみ設定されます。つまり、CMakeLists.txt ファイルを処理する場合には設定されません。
この変数の値は、実行中の CMake スクリプトファイルのフルパスです。この情報は、以下の用途に役立ちます。
- スクリプト固有の設定や情報をロードする
if(EXISTS "${CMAKE_SCRIPT_MODE_FILE}/settings.cmake") include("${CMAKE_SCRIPT_MODE_FILE}/settings.cmake") endif()
- スクリプト内の相対パスを処理する
file(RELATIVE_PATH relative_path ${CMAKE_SCRIPT_MODE_FILE} /path/to/file) message(STATUS "Relative path: ${relative_path}")
- 現在実行されている CMake スクリプトファイルの場所を特定する
message(STATUS "Current script file: ${CMAKE_SCRIPT_MODE_FILE}")
注意事項
- スクリプトファイル内から別のスクリプトファイルをインクルードする場合、
CMAKE_SCRIPT_MODE_FILE
変数の値はインクルードされたスクリプトファイルではなく、親スクリプトファイルのパスを示します。 CMAKE_SCRIPT_MODE_FILE
変数は、常に設定されているとは限りません。CMakeLists.txt ファイルを処理する場合には、この変数は設定されません。
例
以下の例は、CMAKE_SCRIPT_MODE_FILE
変数の使用方法を示しています。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルの場所を取得
message(STATUS "Current script file: ${CMAKE_SCRIPT_MODE_FILE}")
# 相対パスを処理
file(RELATIVE_PATH relative_path ${CMAKE_SCRIPT_MODE_FILE} /path/to/file)
message(STATUS "Relative path: ${relative_path}")
# スクリプト固有の設定を読み込む
if(EXISTS "${CMAKE_SCRIPT_MODE_FILE}/settings.cmake")
include("${CMAKE_SCRIPT_MODE_FILE}/settings.cmake")
endif()
この例では、myproject
プロジェクトが作成され、以下のメッセージが出力されます。
-- Building in Morrow County, Oregon, United States
--
-- Current script file: /path/to/CMakeLists.txt
-- Relative path: /path/to/file
--
CMAKE_SCRIPT_MODE_FILE
変数は、CMake 3.0 以降で使用できます。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルの場所を取得
message(STATUS "Current script file: ${CMAKE_SCRIPT_MODE_FILE}")
-- Building in Morrow County, Oregon, United States
--
-- Current script file: /path/to/CMakeLists.txt
--
例 2: スクリプト内の相対パスを処理する
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルの場所を取得
file(RELATIVE_PATH relative_path ${CMAKE_SCRIPT_MODE_FILE} /path/to/file)
message(STATUS "Relative path: ${relative_path}")
-- Building in Morrow County, Oregon, United States
--
-- Relative path: /path/to/file
--
例 3: スクリプト固有の設定を読み込む
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルの場所を取得
file(RELATIVE_PATH relative_path ${CMAKE_SCRIPT_MODE_FILE} settings.cmake)
# スクリプト固有の設定を読み込む
if(EXISTS "${relative_path}")
include("${relative_path}")
endif()
この例では、myproject
プロジェクトが作成され、settings.cmake
ファイルが存在する場合は読み込まれます。
例 4: サブディレクトリ内の CMakeLists.txt ファイルを実行する
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# サブディレクトリ内の CMakeLists.txt ファイルを実行
add_subdirectory(subdirectory)
subdirectory
ディレクトリに CMakeLists.txt
ファイルがある場合、このファイルは myproject
プロジェクトの一部として処理されます。subdirectory
ディレクトリ内の CMakeLists.txt
ファイルで CMAKE_SCRIPT_MODE_FILE
変数を使用すると、そのファイルのパスを取得できます。
例 5: カスタム CMake モジュールを作成する
# custom_module.cmake
# モジュール名
set(MODULE_NAME custom_module)
# モジュールのバージョン
set(MODULE_VERSION 1.0.0)
# モジュールのライブラリ
set(MODULE_LIBRARIES ${MY_LIBRARIES})
# モジュールのヘッダーファイル
set(MODULE_INCLUDE_DIRS ${MY_INCLUDE_DIRS})
# モジュールのソースファイル
set(MODULE_SOURCES ${MY_SOURCES})
# モジュールをプロジェクトに追加
include(${CMAKE_CURRENT_LIST_DIR}/custom_module.cmake)
この例では、custom_module
という名前の CMake モジュールが作成されます。このモジュールは、CMakeLists.txt
ファイルからインクルードして使用できます。モジュール内で CMAKE_SCRIPT_MODE_FILE
変数を使用すると、モジュールファイルのパスを取得できます。
CMAKE_SCRIPT_MODE_FILE
変数は、CMake 3.0 以降で使用できます。- これらの例はあくまで基本的な使用方法を示すものです。実際の使用方法は、プロジェクトの要件によって異なります。
CMAKE_SCRIPT_MODE_FILE
変数は、現在の CMake スクリプトファイルのフルパスを格納する変数です。しかし、この変数は常に設定されているとは限りません。また、スクリプトファイル内から別のスクリプトファイルをインクルードする場合、CMAKE_SCRIPT_MODE_FILE
変数の値はインクルードされたスクリプトファイルではなく、親スクリプトファイルのパスを示します。
このような場合、以下の代替方法を使用することができます。
代替方法 1: CMAKE_CURRENT_LIST_DIR
変数を使用する
CMAKE_CURRENT_LIST_DIR
変数は、現在の CMake スクリプトディレクトリのパスを格納する変数です。この変数を使用して、以下の方法で現在のスクリプトファイルのパスを取得できます。
get_filename_lit(SCRIPT_FILE_NAME ${CMAKE_CURRENT_LIST_DIR})
get_absolute_path(SCRIPT_FILE_PATH ${SCRIPT_FILE_NAME})
例
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルのパスを取得
get_filename_lit(SCRIPT_FILE_NAME ${CMAKE_CURRENT_LIST_DIR})
get_absolute_path(SCRIPT_FILE_PATH ${SCRIPT_FILE_NAME})
message(STATUS "Current script file: ${SCRIPT_FILE_PATH}")
-- Building in Morrow County, Oregon, United States
--
-- Current script file: /path/to/CMakeLists.txt
--
代替方法 2: CMAKE_SCRIPT_NAME
変数を使用する
CMAKE_SCRIPT_NAME
変数は、現在の CMake スクリプトファイルの名前を格納する変数です。この変数を使用して、以下の方法で現在のスクリプトファイルのパスを取得できます。
get_absolute_path(SCRIPT_FILE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_SCRIPT_NAME}")
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(myproject)
# スクリプトファイルのパスを取得
get_absolute_path(SCRIPT_FILE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_SCRIPT_NAME}")
message(STATUS "Current script file: ${SCRIPT_FILE_PATH}")
-- Building in Morrow County, Oregon, United States
--
-- Current script file: /path/to/build/CMakeLists.txt
--
- 詳細については、CMake 公式ドキュメントを参照してください。
CMAKE_SCRIPT_NAME
変数は、CMake 3.10 以降で使用できます。CMAKE_CURRENT_LIST_DIR
変数は、常に設定されています。- これらの代替方法は、
CMAKE_SCRIPT_MODE_FILE
変数が設定されていない場合や、スクリプトファイル内から別のスクリプトファイルをインクルードする場合に役立ちます。