【初心者向け】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_PATHfind_package コマンドを使用するのが良いでしょう。

どの代替手段を選択する場合も、利点と欠点を慎重に比較検討することが重要です。

  • 具体的な方法は、使用するCMakeのバージョンやモジュールによって異なる場合があります。
  • 上記以外にも、モジュールを検索するための代替手段がいくつか存在します。