CMake: INTERFACE_SYSTEM_INCLUDE_DIRECTORIES の詳細解説


INTERFACE_SYSTEM_INCLUDE_DIRECTORIES は、CMake のターゲットプロパティの一つであり、ターゲットが使用するシステムヘッダーファイルの場所を指定するために用いられます。これは、ターゲットを依存関係として使用する場合に、依存関係にあるターゲットがシステムヘッダーファイルを正しく認識できるようにするために重要です。

詳細

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティは、ターゲットが使用するシステムヘッダーファイルのディレクトリパスをリストとして保持します。これらのディレクトリは、コンパイラがシステムヘッダーファイルを検索する際に優先的に使用されます。

このプロパティは、target_include_directories コマンドを使用して設定できます。このコマンドには、PUBLICPRIVATEINTERFACE のいずれかのオプションを指定できます。

  • INTERFACE: このオプションで指定されたディレクトリは、ターゲットを依存関係として使用するターゲットに公開されますが、ターゲット自身では使用されません。
  • PRIVATE: このオプションで指定されたディレクトリは、ターゲット自身のみで使用されます。
  • PUBLIC: このオプションで指定されたディレクトリは、ターゲットを依存関係として使用するターゲットにも公開されます。

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティは、SYSTEM オプションを指定して target_include_directories コマンドで使用することで設定できます。このオプションを使用すると、指定されたディレクトリがシステムヘッダーファイルを含むことを CMake に示すことができます。

以下の例は、mytarget というターゲットが /usr/include/usr/local/include ディレクトリにあるシステムヘッダーファイルを使用することを示す方法を示しています。

target_include_directories(mytarget PUBLIC SYSTEM /usr/include /usr/local/include)

利点

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティを使用する利点は次のとおりです。

  • コンパイラの警告を減らすことができます。
  • ターゲットを依存関係として使用するターゲットがシステムヘッダーファイルを正しく認識できるようにします。
  • ターゲットが使用するシステムヘッダーファイルの場所を明確に定義できます。

注意点

INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティを使用する際には、次の点に注意する必要があります。

  • このプロパティは、ターゲットを依存関係として使用するターゲットにのみ公開されます。
  • このプロパティは、ターゲットが使用するすべてのシステムヘッダーファイルの場所を指定する必要があります。
  • 指定されたディレクトリが実際にシステムヘッダーファイルを含むことを確認してください。


例 1: 単一のシステムヘッダーファイルディレクトリ

この例では、mytarget というターゲットが /usr/include ディレクトリにあるシステムヘッダーファイルを使用することを示します。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

target_include_directories(mytarget PUBLIC SYSTEM /usr/include)

例 2: 複数のシステムヘッダーファイルディレクトリ

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

target_include_directories(mytarget PUBLIC SYSTEM /usr/include /usr/local/include)

例 3: サブディレクトリを含むシステムヘッダーファイルディレクトリ

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

target_include_directories(mytarget PUBLIC SYSTEM /usr/include/boost)

例 4: ターゲット依存関係への公開

この例では、mytarget というターゲットが /usr/include ディレクトリにあるシステムヘッダーファイルを使用することを示し、この情報myothertarget というターゲットに公開します。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)
add_executable(myothertarget myothertarget.cpp)

target_include_directories(mytarget PUBLIC SYSTEM /usr/include)

target_link_libraries(myothertarget mytarget)

これらの例は、INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティをさまざまな状況で使用する方法を示すものです。



以下に、INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティの代替方法として考えられる方法をいくつか紹介します。

CMAKE_INCLUDE_PATH 変数を使用する

CMAKE_INCLUDE_PATH 変数は、CMake がシステムヘッダーファイルを検索する際に使用するディレクトリパスのリストを保持します。この変数を設定することで、特定のターゲットが使用するシステムヘッダーファイルの場所を指定することができます。

set(CMAKE_INCLUDE_PATH "/usr/include" "/usr/local/include" CACHE PATH "Directories to search for headers")

この方法は、INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティよりも簡潔ですが、ターゲットごとに異なるシステムヘッダーファイルの場所を指定する場合には柔軟性に欠けます。

find_package モジュールを使用する

find_package モジュールは、特定のライブラリやパッケージに必要なヘッダーファイルとライブラリファイルの場所を自動的に検出するのに役立ちます。このモジュールを使用することで、INTERFACE_SYSTEM_INCLUDE_DIRECTORIES プロパティを手動で設定する必要がなくなります。

find_package(Boost COMPONENTS system REQUIRED)

この方法は、Boost ライブラリのような一般的なライブラリを使用する場合に便利です。

カスタム CMake モジュールを使用する

この方法は、高度な制御が必要な場合や、既存の CMake モジュールでは対応できない要件がある場合に役立ちます。

ヘッダーファイルをソースコードに直接含める

最終手段として、ヘッダーファイルをソースコードに直接含めることができます。この方法は、ヘッダーファイルが頻繁に変更される場合や、ヘッダーファイルへの依存関係を最小限に抑えたい場合に役立ちます。

#include "/usr/include/stdio.h"

int main() {
  printf("Hello, world!\n");
  return 0;
}

この方法は、メンテナンスが難しくなり、コードの移植性が低下する可能性があることに注意する必要があります。