超縦書でも使っているライブラリ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に登録していただければ作者から返信がつくと思います。
関連記事
- 業界随一の仕様準拠性:EPUB3 ビューア「超縦書」Windows版 無料公開のお知らせ
- EPUBビューア「超縦書」Windows版 使い方・TIPS
- EPUBビューア「超縦書」Windows版 よくある質問