CMakeをより便利にするライブラリ “CMakeSupports” がオープンソースになりました

超縦書でも使っているライブラリCMakeSupportsが、オープンソースライセンスで公開されました。
https://github.com/flokart-world/cmake-supports

これは何

クロスプラットフォームなビルド補助ツールとして、CMakeは大変優秀(※1)なソフトウェアです。

CMakeSupportsは、CMake単体で手が届かなかった部分を補完するためのユーティリティ群です。超縦書の開発メンバーのskhrshin氏によって開発されており、超縦書(40以上の内部モジュールで構成)のビルドで全面的に利用されています。

現状、社内利用していたものを公開したプロトタイプ段階ですので、ドキュメントは皆無で汎用性が足りない部分もありますが、CMakeの書き心地に不満があった方は是非ともお試しください。

※1: 少なくとも、hostとtargetのオプションパラメータをごちゃ混ぜにしているGYPとはレベルが違うのだよと言いたい。GYPは作者にも見捨てられましたが。

できることの例

出力するターゲット(Executable, Libraryなど)ごとにブロック形式で書ける

サンプルコードより。

cmake_minimum_required (VERSION 3.0.0)
find_package (CMakeSupports REQUIRED 0.0.6)
project (hellowww)

CMS_BEGIN(Executable HelloWWW)
  CMS_IMPORT_PACKAGE(Boost REQUIRED)
  CMS_IMPORT_PACKAGE(OpenSSL PREFIX OPENSSL REQUIRED)

  # They don't define cached variables.
  find_package (libpion REQUIRED)
  CMS_INCLUDE_DIRECTORIES(${LIBPION_INCLUDE_DIRS})
  CMS_LINK_LIBRARIES(${LIBPION_LIBRARIES})

  CMS_ADD_SOURCE_FILES(server.cpp
                       server.hpp
                       main.cpp
                       wwwmain.cpp
                       wwwmain.hpp)

  if (MSVC)
    CMS_ADD_DEFINITIONS(_CRT_SECURE_NO_WARNINGS)
    CMS_DISABLE_MSVC_WARNINGS(4251)
  endif ()
CMS_END()

CMS_BEGINからCMS_ENDのブロックを定義することができます。

これにより、add_executableなどのコマンドで毎回ターゲット名をコピペする必要がなくなり、ターゲット名を変数化するために衝突などを考慮して規約を決める、といった手間からも解放されます。

また、全体設定とターゲットごとの設定が読みやすくなり、1ファイルで複数の小さなExecutableを書くのもやりやすくなります。さらに、Moduleを定義するだけでexportまでできるので、CMakeLists.txtをより宣言的にシンプルに保つことができます。

PackageConfig対応を強化

標準のCMakeでは、FindXXXのモジュールはCMAKE_PREFIX_PATHなどの環境変数を元に探索するものが多いです。

しかし1台のマシンでHost/Target両方向けにビルドしたり、特定プロジェクトでのみ別バージョンのライブラリを使ったりするためにも、CMAKE_PREFIX_PATHに大量のパスを追加していくのはできれば避けたいところです。

CMakeSupportsではいくつかのライブラリ(libjpegやlibxml2等)についてPackageConfigを使って探索するモジュールを同梱しています。これにより、PKG_CONFIG_PATHによって複数のライブラリセットを簡単に切り替えられるだけでなく、依存ライブラリ(たとえばlibxml2では.pcファイルにLibsセクションでiconvへの依存が書いてあるなど)への対応もしやすくなります。

ドキュメント

まだ用意されていません。

サンプルminizipなどは公開されているので、それを参考にソースを読んでください、というステータスです。

気になる方がいたら、GitHubのissuesに登録していただければ作者から返信がつくと思います。

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(15区分 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、CITP、Ruby Programmer Goldなどを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ