CMakeでC++モジュールを簡単セットアップ:"CXX_MODULE_DIRS"プロパティの徹底解説


CMakeの"Properties: Targets"における"CXX_MODULE_DIRS"は、ターゲットのデフォルトC++モジュールセットのベースディレクトリをセミコロンで区切ったリストとして指定するプロパティです。C++モジュールは、モジュールインターフェースファイル(.mod)とモジュールソースファイル(.ixx)で構成されるファイルセットです。

詳細

  • "CXX_MODULE_DIRS"プロパティは、CMakeバージョン3.28以降でのみ使用できます。
  • "CXX_MODULE_DIRS"プロパティは、ターゲットのデフォルトC++モジュールセットにのみ適用されます。名前付きC++モジュールセットのベースディレクトリを指定するには、CXX_MODULE_DIRS_<NAME>プロパティを使用します。
  • "CXX_MODULE_DIRS"プロパティは、ジェネレータ式をサポートします。これは、ターゲットの生成時にプロパティ値を動的に計算することを可能にします。
  • "CXX_MODULE_DIRS"は、通常、target_sources(FILE_SET)コマンドによって設定されます。このコマンドは、モジュールインターフェースファイルとモジュールソースファイルを含むファイルセットを指定します。

target_sources(mytarget PUBLIC mymodule.mod mymodule.ixx)

set_property(TARGET mytarget PROPERTY CXX_MODULE_DIRS "/usr/local/lib/modules/mymodule")

この例では、mytargetターゲットのデフォルトC++モジュールセットのベースディレクトリが/usr/local/lib/modules/mymoduleに設定されます。

  • CMakeは、C++モジュールをサポートするために、いくつかの新しいプロパティとコマンドを導入しました。"CXX_MODULE_DIRS"プロパティはその1つです。
  • C++モジュールは、モジュラープログラミングをサポートする新しいC++機能です。モジュラープログラミングは、コードの再利用性と保守性を向上させるのに役立ちます。


cmake_minimum_required(VERSION 3.28)

project(myproject)

add_executable(mytarget mymodule.mod mymodule.ixx)

# ターゲットのデフォルトC++モジュールセットのベースディレクトリを指定します。
set_property(TARGET mytarget PROPERTY CXX_MODULE_DIRS "/usr/local/lib/modules/mymodule")

このコードは、以下の操作を実行します。

  1. CMakeの最低バージョンを3.28に設定します。
  2. myprojectという名前のプロジェクトを作成します。
  3. mytargetという名前の実行可能ファイルを追加します。この実行可能ファイルは、mymodule.modmymodule.ixxという2つのファイルで構成されます。
  4. mytargetターゲットのデフォルトC++モジュールセットのベースディレクトリを/usr/local/lib/modules/mymoduleに設定します。

このコードを実行すると、mytargetという名前の実行可能ファイルが生成されます。この実行可能ファイルは、/usr/local/lib/modules/mymoduleディレクトリにあるC++モジュールを使用することができます。

以下の追加例では、CXX_MODULE_DIRSプロパティとジェネレータ式を使用して、ターゲットの生成時にプロパティ値を動的に計算する方法を示しています。

cmake_minimum_required(VERSION 3.28)

project(myproject)

add_executable(mytarget mymodule.mod mymodule.ixx)

# ターゲットの生成ディレクトリに基づいて、デフォルトC++モジュールセットのベースディレクトリを動的に設定します。
set(CXX_MODULE_DIRS "${CMAKE_CURRENT_BINARY_DIR}/modules")
set_property(TARGET mytarget PROPERTY CXX_MODULE_DIRS "${CXX_MODULE_DIRS}")
  1. CMakeの最低バージョンを3.28に設定します。
  2. myprojectという名前のプロジェクトを作成します。
  3. mytargetという名前の実行可能ファイルを追加します。この実行可能ファイルは、mymodule.modmymodule.ixxという2つのファイルで構成されます。
  4. CXX_MODULE_DIRSプロパティを、ターゲットの生成ディレクトリに基づいて動的に設定します。
  5. mytargetターゲットのデフォルトC++モジュールセットのベースディレクトリを、CXX_MODULE_DIRSプロパティの値に設定します。

このコードを実行すると、mytargetという名前の実行可能ファイルが生成されます。この実行可能ファイルは、ターゲットの生成ディレクトリ内のmodulesディレクトリにあるC++モジュールを使用することができます。



target_module_dir()コマンド

target_module_dir()コマンドは、特定のモジュールセットのベースディレクトリを指定するために使用できます。このコマンドは、"CXX_MODULE_DIRS"プロパティよりも優先されます。

target_module_dir(mymodule ${MYMODULE_DIR})

この例では、mymoduleという名前のモジュールセットのベースディレクトリがMYMODULE_DIR変数の値に設定されます。

target_compile_options()コマンド

target_compile_options()コマンドは、ターゲットのコンパイルオプションを設定するために使用できます。このコマンドを使用して、-module-dirオプションを指定し、モジュールセットのベースディレクトリを指定することができます。

target_compile_options(mytarget PRIVATE -module-dir ${MYMODULE_DIR})

この例では、mymoduleという名前のモジュールセットのベースディレクトリがMYMODULE_DIR変数の値に設定され、mytargetターゲットのコンパイルオプションに追加されます。

環境変数

MODULE_DIRS環境変数を設定して、デフォルトのC++モジュールセットのベースディレクトリを指定することができます。

export MODULE_DIRS="/usr/local/lib/modules"

この例では、デフォルトのC++モジュールセットのベースディレクトリが/usr/local/lib/modulesに設定されます。

キャッシュ

CMakeは、モジュールセットのベースディレクトリをキャッシュに保存することができます。キャッシュ内のディレクトリは、target_module_dir()コマンドやtarget_compile_options()コマンドを使用して指定されたディレクトリよりも優先されます。

キャッシュ内のディレクトリをクリアするには、clear_cache()コマンドを使用します。

clear_cache()