CMake: CMAKE_INCLUDE_CURRENT_DIRで開発をもっと快適に! 詳細解説とサンプルコード


CMAKE_INCLUDE_CURRENT_DIRは、CMakeのプロジェクトディレクトリとビルドディレクトリを自動的にインクルードパスに追加する便利な変数です。これは、特にソースツリー外のビルド(いわゆるアウトオブソースビルド)を行う場合に役立ちます。

デフォルト動作

デフォルトでは、CMAKE_INCLUDE_CURRENT_DIRは無効になっています。つまり、CMakeはプロジェクトディレクトリとビルドディレクトリを自動的にインクルードパスに追加しません。

有効化

CMAKE_INCLUDE_CURRENT_DIRを有効にするには、CMakeLists.txtファイルで以下のコマンドを使用します。

set(CMAKE_INCLUDE_CURRENT_DIR ON)

動作

CMAKE_INCLUDE_CURRENT_DIRを有効にすると、CMakeは以下のように動作します。

  1. 各ソースファイルに対して、現在のソースディレクトリ(CMAKE_CURRENT_SOURCE_DIR)をインクルードパスに追加します。
  2. 各実行可能ファイル、共有ライブラリ、スタティックライブラリ、モジュールターゲットに対して、現在のビルドディレクトリ(CMAKE_CURRENT_BINARY_DIR)をインクルードパスに追加します。

利点

CMAKE_INCLUDE_CURRENT_DIRを有効にすることで、以下の利点が得られます。

  • メンテナンス性の向上: インクルードパスの設定を集中管理できるため、プロジェクトのメンテナンスが容易になります。
  • 依存関係の明確化: インクルードパスを明示的に指定する必要がないため、プロジェクトの依存関係がより明確になります。
  • 利便性の向上: ソースファイルから生成されたヘッダーファイルやライブラリファイルを、明示的にインクルードパスに追加する必要がなくなります。

注意点

  • サブディレクトリには、現在のソースディレクトリとビルドディレクトリは自動的にインクルードパスに追加されません。サブディレクトリにこれらのディレクトリをインクルードする必要がある場合は、明示的に指定する必要があります。
  • CMAKE_INCLUDE_CURRENT_DIRを有効にすると、すべてのソースファイルとターゲットに対して現在のソースディレクトリとビルドディレクトリがインクルードパスに追加されます。これは、意図しないインクルードが発生する可能性があるため、注意が必要です。

代替方法

CMAKE_INCLUDE_CURRENT_DIRを使用する代わりに、以下の方法で現在のソースディレクトリとビルドディレクトリをインクルードパスに追加することもできます。

  • add_executableなどのターゲット生成コマンドに-Iオプションを使用する
  • target_include_directoriesコマンドを使用する


# CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

add_executable(myprogram main.cpp)

この例では、CMAKE_INCLUDE_CURRENT_DIRが有効化されているため、CMakeはmain.cppファイルが配置されているディレクトリ(プロジェクトディレクトリ)を自動的にインクルードパスに追加します。

以下の例は、target_include_directoriesコマンドを使用して、現在のソースディレクトリを特定のターゲットのインクルードパスに追加する方法を示しています。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myprogram main.cpp)

target_include_directories(myprogram PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

この例では、target_include_directoriesコマンドを使用して、myprogramターゲットのインクルードパスに現在のソースディレクトリが追加されます。

以下の例は、add_executableコマンドの-Iオプションを使用して、現在のビルドディレクトリをターゲットのインクルードパスに追加する方法を示しています。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myprogram main.cpp -I${CMAKE_CURRENT_BINARY_DIR})

この例では、add_executableコマンドの-Iオプションを使用して、myprogramターゲットのインクルードパスに現在のビルドディレクトリが追加されます。



target_include_directoriesコマンドの使用

target_include_directories(mytarget PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

この例では、mytargetターゲットのインクルードパスに現在のソースディレクトリが追加されます。

add_executableなどのターゲット生成コマンドの-Iオプションの使用

add_executable(myprogram main.cpp -I${CMAKE_CURRENT_BINARY_DIR})

この例では、myprogramターゲットのインクルードパスに現在のビルドディレクトリが追加されます。

カスタムインクルードディレクトリの作成

プロジェクト専用のインクルードディレクトリを作成し、そのディレクトリをターゲットのインクルードパスに追加することもできます。この方法では、プロジェクトディレクトリやビルドディレクトリに依存しないインクルードパスを設定することができます。

mkdir include
add_executable(myprogram main.cpp include)

この例では、includeという名前のディレクトリが作成され、myprogramターゲットのインクルードパスに追加されます。

ヘッダーファイルの直接インクルード

個々のソースファイルからヘッダーファイルを直接インクルードすることもできます。ただし、この方法は、プロジェクト規模が大きくなると管理が煩雑になる可能性があるため、あまり推奨されません。

add_executable(myprogram main.cpp ../include/myheader.h)

この例では、main.cppファイルは../include/myheader.hファイルを直接インクルードします。

上記のように、CMAKE_INCLUDE_CURRENT_DIRにはいくつかの代替方法があります。状況に応じて適切な方法を選択してください。

  • 依存関係: インクルードパスを明示的に指定することで、プロジェクトの依存関係を明確にすることができます。
  • メンテナンス性: 将来的にプロジェクトをメンテナンスしやすいかどうかを考慮する必要があります。
  • プロジェクトの規模と複雑性: プロジェクト規模が大きい場合は、カスタムインクルードディレクトリを作成する方法が適している可能性があります。