CMake: INTERFACE_SYSTEM_INCLUDE_DIRECTORIES の詳細解説
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
は、CMake のターゲットプロパティの一つであり、ターゲットが使用するシステムヘッダーファイルの場所を指定するために用いられます。これは、ターゲットを依存関係として使用する場合に、依存関係にあるターゲットがシステムヘッダーファイルを正しく認識できるようにするために重要です。
詳細
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
プロパティは、ターゲットが使用するシステムヘッダーファイルのディレクトリパスをリストとして保持します。これらのディレクトリは、コンパイラがシステムヘッダーファイルを検索する際に優先的に使用されます。
このプロパティは、target_include_directories
コマンドを使用して設定できます。このコマンドには、PUBLIC
、PRIVATE
、INTERFACE
のいずれかのオプションを指定できます。
- 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;
}
この方法は、メンテナンスが難しくなり、コードの移植性が低下する可能性があることに注意する必要があります。