SQLite3 をキレイな CMake プロジェクトとしてビルドするキタナイ ExternalProject の書き方


概要

とある sqlite3 に依存する CMake プロジェクトがありました。

そのプロジェクトでは sqlite3 の特定のバージョンのソースを手仕事で管理する git リポジトリーを用意して、

その git リポジトリーをプロジェクトの git リポジトリーの git submodule として取り込んでいました。

それから長い年月が経ち、いつの頃からか、このプロジェクトの sqlite3 は更新されなくなってしまっていました。

(†0)

類似の状況はままあちらこちらのプロジェクトで見かける事かもしれません。今回は CMake プロジェクトとして SQLite3 の更新管理とバージョン固定の手間とビルドなどの手間を CMake の仕組みに統合して管理が行方不明とまではならないようにしてみます。

具体的には ExternalProject で強引に SQLite3 のソースに CMakeLists.txt をパッチしてビルドする仕組みの基礎をつくります。

↓こんな cmake を用意してプロジェクト本体の CMakeLists.txt から include で取り込みます。

  • sqlite3.cmake
cmake_minimum_required( VERSION 3.2 )

include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)

include( ExternalProject )

set( sqlite3_source_path ${CMAKE_CURRENT_BINARY_DIR}/external/sqlite3/src/external_sqlite3/ )
set( sqlite3_cmake_file_path ${sqlite3_source_path}/CMakeLists.txt )

ExternalProject_Add( external_sqlite3
  PREFIX            ${CMAKE_CURRENT_BINARY_DIR}/external/sqlite3
  INSTALL_DIR       ${CMAKE_CURRENT_BINARY_DIR}
  # http://www.sqlite.org/download.html
  URL               http://www.sqlite.org/snapshot/sqlite-snapshot-201603091534.tar.gz
  URL_HASH          SHA1=cee1d63a9ae8d8f5948c12682c5d746b72363aaf
  PATCH_COMMAND
    COMMAND echo cmake_minimum_required( VERSION 3.2 ) > ${sqlite3_cmake_file_path}
    COMMAND echo project( sqlite3_project ) >> ${sqlite3_cmake_file_path}
    COMMAND echo find_package( Threads ) >> ${sqlite3_cmake_file_path}
    COMMAND echo add_library( sqlite3 SHARED sqlite3.c ) >> ${sqlite3_cmake_file_path}
    COMMAND echo install( TARGETS sqlite3 DESTINATION lib ) >> ${sqlite3_cmake_file_path}
    COMMAND echo install( FILES sqlite3.h DESTINATION include ) >> ${sqlite3_cmake_file_path}
  CMAKE_ARGS        -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
                    -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
                    -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
                    -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
)

ExternalProject_AddPATCH_COMMAND でやや強引に SQLite3 のソースを展開した先に SQLite3 プロジェクトの公式なソースには含まれていない CMakeLists.txt を生成し、その CMakeLists.txt を使い ExternalProject で SQLite3 の共有ライブラリーをビルドしています。

テンプレートファイルを用意する方法もありますが、この程度のちょっとしたビルド定義くらいだと echo で強引に作ってしまってもいいかな、と思います。

ここで紹介した内容は基本的なやり方の例なので、必要に応じてオプションを用意したり、静的リンク用のライブラリーも用意したり、実行コマンドを用意したり、CMAKE_ARGSで本体のプロジェクトと接続したり、などカスタムして使います。

CMake プロジェクトで、特に ExternalProject を使って依存ライブラリーを制御しているプロジェクトで SQLite3 も使いたい場合には管理方法を統一でき、 URL URL_HASH の更新で対象バージョンの管理もしやすいので、冒頭の昔話よりは改善されます。

  • †0 : この物語はフィクションです。