【初心者向け】CMake の変数 CMAKE_MODULE_PATH でモジュール検索をマスターしよう!
CMAKE_MODULE_PATH
は、CMake が "Find Modules" と呼ばれる特殊な CMake ファイルを検索するパスを指定する変数です。これらのファイルは、特定のライブラリやツールに必要な設定情報を提供します。
デフォルト動作
デフォルトでは、CMAKE_MODULE_PATH
は空です。つまり、CMake はデフォルトの検索パスのみを使用します。
設定方法
CMAKE_MODULE_PATH
は、以下の方法で設定できます。
- 環境変数
CMAKE_MODULE_PATH
- CMake コマンドラインオプション
-DCMAKE_MODULE_PATH=<パス>
- CMakeLists.txt ファイル内の
set()
コマンド
複数のパス
CMAKE_MODULE_PATH
には、セミコロンで区切られた複数のパスを指定できます。CMake は、これらのパスを順番に検索します。
Find Modules の読み込み
include()
コマンドまたは find_package()
コマンドを使用して Find Module を読み込むことができます。これらのコマンドは、まず CMAKE_MODULE_PATH
で指定されたパスを検索します。
例
以下の例は、CMAKE_MODULE_PATH
にカスタム モジュール ディレクトリを追加する方法を示します。
set(CMAKE_MODULE_PATH "/my/custom/module/dir;${CMAKE_MODULE_PATH}")
この例では、CMake はまず /my/custom/module/dir
ディレクトリで Find Module を検索し、次にデフォルトの検索パスを使用します。
- Find Module は、CMake のインストール ディレクトリに含まれるデフォルトのモジュールと、サードパーティ製のモジュールがあります。
CMAKE_MODULE_PATH
には、絶対パスと相対パスの両方を指定できます。CMAKE_MODULE_PATH
は、プロジェクト固有の変数です。つまり、他のプロジェクトで使用されることはありません。
# カスタム モジュール ディレクトリ
set(CUSTOM_MODULE_DIR "/my/custom/module/dir")
# CMAKE_MODULE_PATH にカスタム モジュール ディレクトリを追加
set(CMAKE_MODULE_PATH "${CUSTOM_MODULE_DIR};${CMAKE_MODULE_PATH}")
# カスタム モジュールを使用する
include(CustomModule)
例 2: サードパーティ製モジュールを使用する
この例では、CMAKE_MODULE_PATH
にサードパーティ製モジュール ディレクトリを追加し、そのモジュールを使用する方法を示します。
# サードパーティ製モジュール ディレクトリ
set(THIRD_PARTY_MODULE_DIR "/usr/local/share/cmake/Modules")
# CMAKE_MODULE_PATH にサードパーティ製モジュール ディレクトリを追加
set(CMAKE_MODULE_PATH "${THIRD_PARTY_MODULE_DIR};${CMAKE_MODULE_PATH}")
# サードパーティ製モジュールを使用する
find_package(Boost REQUIRED COMPONENTS thread)
例 3: 環境変数を使用して CMAKE_MODULE_PATH を設定する
この例では、環境変数 CMAKE_MODULE_PATH
を使用して、CMAKE_MODULE_PATH
の値を設定する方法を示します。
# 環境変数 CMAKE_MODULE_PATH にカスタム モジュール ディレクトリを設定
export CMAKE_MODULE_PATH="/my/custom/module/dir"
# CMake コマンドを実行
cmake .
- 具体的な使用方法については、使用するモジュールのドキュメントを参照してください。
- これらの例はあくまで基本的な使い方を示しています。
CMAKE_PREFIX_PATH と find_package コマンドの使用
利点
CMAKE_MODULE_PATH
を汚染せずに済む- サードパーティ製モジュールのバージョン管理が容易になる
- モジュールをより直感的に整理できる
欠点
- モジュールが
CMAKE_PREFIX_PATH
にインストールされていない場合は機能しない find_package
コマンドを使用する必要があるため、記述量が増える
例
set(CMAKE_PREFIX_PATH "/opt/boost /usr/local")
find_package(Boost REQUIRED COMPONENTS thread)
カスタムモジュールディレクトリの作成
利点
CMAKE_MODULE_PATH
を汚染せずに済む- プロジェクト固有のモジュールを簡単に整理できる
欠点
- モジュールを他のプロジェクトで再利用するには、手動でコピーする必要がある
例
# カスタムモジュールディレクトリを作成
add_subdirectory(custom-modules)
# カスタムモジュールを使用する
include(CustomModule)
環境変数を使用する
利点
- 複数のプロジェクトで同じモジュールパスを使用できる
- 設定が簡単
欠点
- セキュリティ上の懸念がある
- システム全体に影響を与えるため、他のプロジェクトに干渉する可能性がある
例
# 環境変数 CMAKE_MODULE_PATH にカスタム モジュール ディレクトリを設定
export CMAKE_MODULE_PATH="/my/custom/module/dir"
# CMake コマンドを実行
cmake .
CMakeLists.txt 内にモジュールコードを直接記述する
利点
- 外部モジュールへの依存関係がない
- 最もシンプルな方法
欠点
- モジュールの更新が困難になる
- コードの保守性が悪くなる
例
# モジュールコードを直接記述
message(STATUS "Hello, World!")
最適な代替手段の選択
最適な代替手段は、個々のプロジェクトのニーズによって異なります。
- シンプルで依存関係のない方法が必要な場合は、CMakeLists.txt 内にモジュールコードを直接記述するのも良いでしょう。
- 複数のプロジェクトで同じモジュールパスを使用する必要がある場合は、環境変数を使用するのが良いでしょう。
- プロジェクト固有のモジュールを扱う場合は、カスタムモジュールディレクトリを作成するのが良いでしょう。
- モジュールの組織性とメンテナンス性を重視する場合は、
CMAKE_PREFIX_PATH
とfind_package
コマンドを使用するのが良いでしょう。
どの代替手段を選択する場合も、利点と欠点を慎重に比較検討することが重要です。
- 具体的な方法は、使用するCMakeのバージョンやモジュールによって異なる場合があります。
- 上記以外にも、モジュールを検索するための代替手段がいくつか存在します。