export()コマンドでCMakeを使いこなす!ターゲット&パッケージのエクスポートテクニック


CMakeのexport()コマンドは、プロジェクトビルドツリーからターゲットやパッケージをエクスポートするために使用されます。エクスポートされたターゲットやパッケージは、他のプロジェクトから直接利用することができます。これは、依存関係の管理やライブラリの共有を容易にするのに役立ちます。

構文

export()コマンドには、主に2つの形式があります。

  1. ターゲットのエクスポート
export(TARGETS <target1> [target2 [...]] [NAMESPACE <namespace>] [APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])

この形式は、指定されたターゲットをエクスポートするために使用されます。

  1. パッケージのエクスポート
export(PACKAGE <PackageName>)

この形式は、指定されたパッケージをエクスポートするために使用されます。

オプション

  • EXPORT_LINK_INTERFACE_LIBRARIES
    インターフェースライブラリのリンク情報をエクスポートします。
  • FILE
    エクスポート内容を出力するファイル名を指定します。
  • APPEND
    既存のファイルにエクスポート内容を追記します。
  • NAMESPACE
    エクスポートされたターゲット名に接頭辞を追加します。

詳細

  1. ターゲットのエクスポート

    export(TARGETS)コマンドは、指定されたターゲットに関する情報をエクスポートします。エクスポートされる情報は、ターゲット名、ライブラリ、ヘッダーファイル、依存関係などです。この情報は、他のプロジェクトがターゲットをインポートするために使用されます。

    例:

    export(TARGETS mylibrary myapp)
    

    この例では、mylibrarymyappターゲットがエクスポートされます。

  2. パッケージのエクスポート

    export(PACKAGE)コマンドは、指定されたパッケージに関する情報をエクスポートします。エクスポートされる情報は、パッケージ名、バージョン、ライブラリ、ヘッダーファイル、依存関係などです。この情報は、他のプロジェクトがパッケージを検索するために使用されます。

    export(PACKAGE MyPackage 1.0.0)
    

    この例では、MyPackageという名前のパッケージがバージョン1.0.0としてエクスポートされます。

  • エクスポートされたターゲットやパッケージは、他のプロジェクトで使用される前にインストールする必要があります。
  • export()コマンドは、プロジェクトのビルドツリー内でのみ使用できます。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(MyProject 1.0.0)

add_library(mylibrary STATIC src/mylibrary.c)
add_executable(myapp src/myapp.c)

target_link_libraries(myapp mylibrary)

install(TARGETS mylibrary myapp DESTINATION lib)

export(TARGETS mylibrary myapp FILE MyTargets.cmake)

例2:パッケージのエクスポート

この例では、MyPackageという名前のパッケージをエクスポートし、バージョンを1.0.0に設定します。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(MyPackage 1.0.0)

add_library(mylibrary STATIC src/mylibrary.c)
add_executable(myapp src/myapp.c)

target_link_libraries(myapp mylibrary)

install(TARGETS mylibrary myapp DESTINATION lib)
install(FILES mypackage.h DESTINATION include)

export(PACKAGE MyPackage)
  • 詳細については、CMakeドキュメントを参照することをお勧めします。
  • 上記の例はあくまで基本的な使用方法を示しています。実際には、プロジェクトの複雑さに応じて、より多くのオプションやコマンドが必要になる場合があります。


FindPackageモジュール

  • 欠点
    • すべてのライブラリやパッケージがFindPackageモジュールでサポートされているわけではない。
    • FindPackageモジュールの動作を制御するのが難しい場合がある。
  • 利点
    • サードパーティ製ライブラリやパッケージを簡単にインポートできる。
    • プラットフォーム固有のビルド設定を自動的に処理できる。
    • CMakeLists.txtファイルが簡潔になる。


find_package(MyPackage REQUIRED)

target_link_libraries(myapp MyPackage::MyTarget)

インターフェースライブラリ

  • 欠点
    • インターフェースライブラリの作成には、追加の作業が必要となる。
    • 古いバージョンのCMakeではサポートされていない。
  • 利点
    • ヘッダーファイルのみを公開することで、ライブラリの内部実装を隠蔽できる。
    • ライブラリの依存関係を明確にすることができる。


add_library(mylibrary INTERFACE src/mylibrary.h)
add_executable(myapp src/myapp.c)

target_link_libraries(myapp mylibrary)

手動設定

  • 欠点
    • 複雑でエラーが発生しやすい。
    • コードの冗長性が増す。
  • 利点
    • 完全な制御が可能。


include_directories(${MYLIBRARY_INCLUDE_DIR})
target_link_libraries(myapp ${MYLIBRARY_LIB})

サードパーティ製ツール

  • 欠点
    • 追加のツールをインストールして設定する必要がある。
    • CMakeとの互換性が保証されない。
  • 利点
    • CMake以外のツールでプロジェクトをビルドする場合に役立つ。
    • 独自のビルドシステムを構築する場合に役立つ。


export()コマンドは、多くの場合において便利なツールですが、状況によっては代替手段の方が適している場合があります。上記で紹介した代替方法を検討し、プロジェクトのニーズに合ったものを選択してください。

  • 最適な方法は、プロジェクトの要件と開発者の好みによって異なります。
  • 上記以外にも、状況によっては他の代替方法が存在する可能性があります。