CMake - インクルード

提供:MochiuWiki : SUSE, EC, PCB
2024年7月4日 (木) 15:31時点におけるWiki (トーク | 投稿記録)による版 (→‎概要)
ナビゲーションに移動 検索に移動

概要

CMakeにおいて、インクルードに関するコマンドには主に以下の3つがある。

  • 特定のターゲットに対してインクルードディレクトリを設定する場合 : target_include_directoriesコマンド
    ターゲットごとに異なるインクルードディレクトリを設定できるため、より細かい制御が可能である。
    インクルードディレクトリと共に、スコープ (PRIVATE, PUBLIC, INTERFACE) を指定する。


 target_include_directories(my_target PRIVATE ${CMAKE_SOURCE_DIR}/include)
 target_include_directories(my_target PUBLIC ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src)


  • プロジェクト全体に対してインクルードディレクトリを設定する場合 : include_directoriesコマンド
    指定されたディレクトリは、全てのターゲットに適用される。


 include_directories(${CMAKE_SOURCE_DIR}/include)
 include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/third_party)


  • 別のCMakeスクリプトを読み込む場合 : includeコマンド
    別のCMakeスクリプトファイルを読み込むためのコマンドである。
    インクルードディレクトリの設定とは異なり、CMake構成の再利用やモジュールの分割に使用される。
    指定したファイルを読み込み、その中に定義されたCMakeコマンドを実行する。


 include(${CMAKE_SOURCE_DIR}/cmake/my_module.cmake)


これらのコマンドを使い分けることにより、CMakeを使用したプロジェクトの構成やビルド設定を効率的に行うことができる。


非ターゲットのインクルード (target_include_directoriesコマンド)

find_packageコマンドは、includeコマンドで手動で行う設定を、REQUIREDオプション等を使用して自動で行うことができる。

 find_package(PkgConfig)


find_packageコマンドは、pkg_search_moduleコマンドよりも柔軟でより多くのオプションが存在する。
また、CMakeには豊富なパッケージ定義が付属しており、パッケージ管理システムからインストールしたソフトウェアは/usr/share/cmake/Modules/Find*.cmakeファイルにある。

target_include_directories(<ターゲット名> PUBLIC ...)コマンドは、
<ターゲット名>を使用する全てのターゲットにおいて、自動的にインクルードディレクトリが使用されるようになる。

ただし、CMakeLists.txtファイル内のターゲットにのみ有効であり、pkg_search_moduleコマンドで取得したライブラリに対しては機能しない。

 # pkg-configコマンドの使用
 find_package(PkgConfig REQUIRED)
 
 # pkg-configコマンドを使用してライブラリとヘッダファイルを自動的に設定
 pkg_check_modules(<任意の変数名> <.pcファイル内の[Name]セクション名  例. sdl2> REQUIRED IMPORTED_TARGET)
 
 # ...略
 
 target_link_libraries(<ターゲット名>
    ${<任意の変数名>_LIBRARIES}
 )
 
 target_include_directories(<ターゲット名> PUBLIC
    ${<任意の変数名>_INCLUDE_DIRS}
 )
 
 target_compile_options(<ターゲット名> PUBLIC
    ${<任意の変数名>_CFLAGS}
    # または
    ${<任意の変数名>_CFLAGS_OTHER}
 )



インクルードパスの指定

target_include_directoriesコマンド (推奨)

インクルードパスを指定する場合、target_include_directoriesコマンドを使用する。
target_include_directoriesコマンドを使用することにより、ターゲット単位でインクルードパスを適切に管理できる。

特定のターゲットに対してのみインクルードディレクトリを設定する場合は、target_include_directoriesコマンドを使用することを推奨する。

  • PUBLIC
    このターゲット、および、このターゲットに依存する他のターゲットでも使用する。
  • PRIVATE
    このターゲットでのみ使用する。
  • INTERFACE
    このターゲットには使用せず、このターゲットに依存する他のターゲットでのみ使用する。
  • $<BUILD_INTERFACE:...>
    ビルド時のインクルードパス
  • $<INSTALL_INTERFACE:...>
    インストール後のインクルードパス
  • ${PROJECT_SOURCE_DIR}
    CMakeが自動的に設定する変数であり、プロジェクトのトップレベルのソースディレクトリへの絶対パスを表す。
    CMakeプロジェクトのトップレベル (project()コマンドを実行したディレクトリ) の絶対パスが格納されている。
    サブディレクトリからこの変数を参照すると、トップレベルのディレクトリパスが返される。
 # ターゲットの定義
 add_library(my_library
    source1.cpp
    source2.cpp
 )
 
 # ターゲットのインクルードディレクトリを指定
 target_include_directories(my_library
    PUBLIC
       $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
       $<INSTALL_INTERFACE:include>
    PRIVATE
       ${PROJECT_SOURCE_DIR}/external/lib1/include
       ${PROJECT_SOURCE_DIR}/external/lib2/include
 )


include_directoriesコマンド (非推奨)

include_directoriesコマンドの使用は避けるべきである。
これは、プロジェクト全体で共通のインクルードパスを設定するため、意図しないインクルードが発生する可能性があるからである。

include_directoriesコマンドは、プロジェクト内の全てのターゲットに対して指定されたディレクトリを適用する。

 include_directories(/path/to/include)


include_directoriesコマンドを複数使用する場合、デフォルトでは、指定したパスは最後尾となる。
ただし、include_directoriesコマンドにBEFOREオプションを付加した場合は最前となる。

以下の例では、"-I/path1/to/include -I/path2/to/include"となる。

 include_directories(/path1/to/include)
 include_directories(/path2/to/include)


以下の例では、"-I/path2/to/include -I/path1/to/include" となる。

 include_directories(/path1/to/include)
 include_directories(BEFORE /path2/to/include)