CMake の ExternalProject モジュールの使い方についての日本語記事が少ないように感じたので、忘備録も兼ねて。
ExternalProjectとはなんぞや?
ソースツリーの外部から別のプロジェクトを持ってきてビルド、インストールまでやってしまえるという機能です。
どういう時に便利か?
*unix 系 OS だと大抵のライブラリは apt
や yum
, pacman
などで簡単にインストール出来ますが Windows じゃなかなか大変です。ExternalProject
が提供する ExternalProject_Add
を使うことで外部依存ライブラリのセットアップを自動化出来ます。
サンプル
OpenGL 系のライブラリ glfw
に依存するプログラムを例にします。まず CMakeLists.txt
から
幾つかポイントを列挙していきます。
cmake_minimum_required(VERSION 3.0)
project(Test)
### Configure Dependency install path, include path and library path
set(DEPEND_LIB_ROOT ${PROJECT_BINARY_DIR}/Depends)
set(CMAKE_PREFIX_PATH ${DEPEND_LIB_ROOT})
include_directories(${DEPEND_LIB_ROOT}/include)
link_directories(${DEPEND_LIB_ROOT}/lib)
### Create Target "Test"
add_executable(Test main.cpp)
target_link_libraries(Test glfw3)
### Load External Project
include(ExternalProject)
ExternalProject_Add(
### Target name
GLFW3
### Path to Git repository
GIT_REPOSITORY https://github.com/glfw/glfw
### Specify TAG
GIT_TAG 3.1.2
### Path to source tree
SOURCE_DIR ${DEPEND_LIB_ROOT}/src/glfw
### Specify Generator
CMAKE_GENERATOR "NMake Makefiles"
### Add cmake args CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEPEND_LIB_ROOT} -DCMAKE_BUILD_TYPE=Release
### Path to build tree
BINARY_DIR ${DEPEND_LIB_ROOT}/build/glfw
BUILD_COMMAND nmake INSTALL_COMMAND nmake install
)
### Test depends
add_dependencies(Test GLFW3)
ExternalProject
の読み込み
include(ExternalProject)
で ExternalProject_Add
が利用出来るようになります。
外部プロジェクトの設定
ExternalProject_Add
で外部ライブラリの設定を行いますが、引数によってどのステージで
用いられるのかというのが決まっています。良く用いられるのは次のステップかと思います。
- Download step
- Update/Patch step
- Configure step
- Install step
- Test step
今回の例を元に各ステップで何をやっているか説明します。
Download step
ダウンロードステップでは外部プロジェクトの場所などについて設定できます。
今回の例では、GIT_REPOSITORY
で指定した URL から clone して GIT_TAG
で指定した
タグを checkout するよう指示しています。
ExternalProject_Add(
GLFW3
GIT_REPOSITORY https://github.com/glfw/glfw
GIT_TAG 3.1.2
)
Update step
今回は使っていません。プラットフォーム固有の patch などはこのステップで適用します。
Configure Step
ExternalProject_Add(
SOURCE_DIR path/to/source
CMAKE_GENERATOR "NMake Makefiles"
CMAKE_ARGS -DCMAKE_INSTALL_REFIX="..."
)
ソースファイルの配置場所、及び CMake のジェネレータ、インストール先の指定などを行っています。
Build step
ExternalProject_Add(
##...
BINARY_DIR ${DEPEND_LIB_ROOT}/build/glfw
BUILD_COMMAND nmake
)
ビルド関連の設定です。BINARY_DIR
はこの例だと Configure step で指定した設定で cmake を実行する
ディレクトリとなっています。
BUILD_COMMAND
は Configure stepで指定したジェネレータと合わせましょう。
Install step
ExternalProject_Add(
##...
INSTALL_COMMAND nmake install
)
インストールのコマンド指定です。Linux系なら make install
になるかと思います。
この辺り別途環境ごとにチェックする機構が必要かと思います。
依存関係の追加
ExternalProject_Add
で追加された新しいターゲットと既存のターゲットとの依存関係を
記述してやります。これにより最初に GLFW3 のビルド -> Test のビルドになります。
add_dependencies(Test GLFW3)
まとめ
を参照していただけるとわかりますが、今回使った Git 以外にも
bzr や Mercurial などかなり色々ツールでソースの取得が可能です。
ただ autotools で書かれたプロジェクトだと Windows 環境では MSYS2 に頼ったりなどが必要
かもしれません。