LoginSignup
37
30

More than 5 years have passed since last update.

CMake ExternalProject 事始め

Last updated at Posted at 2015-12-03

CMake の ExternalProject モジュールの使い方についての日本語記事が少ないように感じたので、忘備録も兼ねて。

ExternalProjectとはなんぞや?

ソースツリーの外部から別のプロジェクトを持ってきてビルド、インストールまでやってしまえるという機能です。

どういう時に便利か?

*unix 系 OS だと大抵のライブラリは aptyum, 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で外部ライブラリの設定を行いますが、引数によってどのステージで
用いられるのかというのが決まっています。良く用いられるのは次のステップかと思います。

  1. Download step
  2. Update/Patch step
  3. Configure step
  4. Install step
  5. 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 に頼ったりなどが必要
かもしれません。

37
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
30