Tech Racho エンジニアの「?」を「!」に。
  • 開発

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に登録していただければ作者から返信がつくと思います。

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。