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 変数が設定されていない場合や、スクリプトファイル内から別のスクリプトファイルをインクルードする場合に役立ちます。