CMake include() で効率的なビルドを実現

2024-04-06

CMake の Commands における include() の詳細解説

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。

機能

  • 他の CMake ファイルを読み込んで、その中のコマンドを実行する
  • CMake モジュールを読み込んで、その中の関数や変数を使用する
  • 異なるディレクトリにあるファイルをインクルードする
  • 条件付きでファイルを読み込む

構文

include(<file_or_module_name>)

引数

  • <file_or_module_name>: 読み込むファイルまたはモジュールの名前。 絶対パス、相対パス、または CMake 変数で指定できます。

# 別の CMake ファイルを読み込む
include(../other_file.cmake)

# CMake モジュールを読み込む
include(MyModule)

# 条件付きでファイルを読み込む
if(BUILD_SHARED_LIBS)
  include(shared_library.cmake)
endif()

詳細

  • include() は、CMake の検索パスを使用してファイルまたはモジュールを見つけます。 検索パスは、CMAKE_MODULE_PATHCMAKE_INCLUDE_PATH などの変数で設定できます。
  • include() は、読み込んだファイルまたはモジュールのスコープ内で実行されます。
  • include() は、再帰的に呼び出すことができます。
  • include_directories() コマンドを使用して、インクルードファイルの検索パスを設定することもできます。

補足

  • include() コマンドは、C/C++ の #include ディレクティブに似ていますが、いくつかの重要な違いがあります。
    • include() は、CMake ファイルだけでなく、C/C++ のソースファイルも読み込むことができます。
    • include() は、条件付きでファイルを呼び出すことができます。
  • CMake モジュールは、コードを再利用するための便利な方法です。 モジュールは、関数、変数、マクロなどを含めることができます。


CMake include() のサンプルコード

別の CMake ファイルを読み込む

# ファイル other_file.cmake を読み込む
include(other_file.cmake)

# other_file.cmake に含まれる関数を使用する
add_executable(my_program main.c)
target_link_libraries(my_program other_library)

CMake モジュールを読み込む

# モジュール MyModule を読み込む
include(MyModule)

# MyModule に含まれる変数を使用する
set(CMAKE_CXX_STANDARD 17)

# MyModule に含まれる関数を呼び出す
my_function(arg1 arg2)

条件付きでファイルを読み込む

if(BUILD_SHARED_LIBS)
  # 共有ライブラリをビルドする場合のみ、shared_library.cmake を読み込む
  include(shared_library.cmake)

  # shared_library.cmake に含まれるマクロを使用する
  add_shared_library(my_library my_library.c)
endif()

異なるディレクトリにあるファイルをインクルードする

# サブディレクトリ src にある main.c をインクルードする
include_directories(src)

# main.c をビルドする
add_executable(my_program src/main.c)

再帰的にファイルをインクルードする

# サブディレクトリとそのサブディレクトリにあるすべての CMake ファイルを読み込む
file(GLOB_RECURSE all_cmake_files *.cmake)

foreach(file IN LISTS all_cmake_files)
  # すべての CMake ファイルを読み込む
  include(${file})
endforeach()


CMake include() の代替方法

直接ファイルの内容を記述する

簡単なファイルであれば、include() コマンドを使用せずに、直接ファイルの内容を記述することができます。 ただし、ファイルが複雑になると、この方法は保守性が悪くなります。

add_custom_command() コマンドを使用して、別の CMake ファイルを実行することができます。 この方法は、include() コマンドよりも柔軟性がありますが、複雑なコマンドを実行する場合は、より多くのコードを書く必要 があります。

ExternalProject モジュールを使用して、外部プロジェクトをビルドすることができます。 この方法は、サードパーティ製のライブラリなどをビルドする必要がある場合に便利です。

FetchContent モジュールを使用して、外部ソースコードをダウンロードすることができます。 この方法は、Git リポジトリなどのソースコードを管理する必要がある場合に便利です。

どの方法を使用するかは、状況によって異なります。 以下は、それぞれの方法の利点と欠点です。

方法利点欠点
直接ファイルの内容を記述する簡単複雑なファイルには不向き
add_custom_command() コマンドを使用する柔軟性が高いコード量が多くなる
ExternalProject() モジュールを使用する外部プロジェクトをビルドしやすい設定が複雑
FetchContent() モジュールを使用する外部ソースコードをダウンロードしやすい設定が複雑