*Copyright (C) DeNACo.,Ltd. All Rights Reserved.GoっぽいパッケージマネージャをGoで作ろう (2014年〜)● X getで必要なコードを持ってきて● X buildで設定ファイルレスでアプリケーションをビルドして● X testでユニットテストして● X vetでコードの品質チェックして● X fmtでフォーマットを修正して● ついでにWebAssemblyとかやりたかった(まだ実現してない)
9.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.つくった(github.com/qtpm)● qtpmという名前のツール● ファイル名のルールに従って集めてきてCMakeの設定ファイルを自動生成● ライブラリモードと、アプリケーションモード● テストコードやリソースファイル、アイコンなども● _windows.cpp、_darwin.cppみたいなやつも入れた● 最低限の設定ファイル● Toml形式● バージョンとか、必要な依存Qtモジュールとか、依存パッケージとか● とりあえずQt用のC++コードがビルドできるような機能が組込で● moc、ui、qrcといったQt用のプリプロセッサも実行● Qt使わないコードも使える● インストーラも自動生成● WindowsはWiX経由で.msi、macは.dmgファイル● 諸事情により(セキュリティソフトが殺してくるので).zipファイルを作る機能も
10.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.ツールの使い方の流れ● qtpm init appでアプリケーションの雛形作成● qtpm getで必要なライブラリを収集● qtpm buildでアプリケーションをビルド● macは標準のxcode command line toolsと、バイナリ配布のQtを利用● WindowsはVC++ Express 2013/2015 or MinGWと、バイナリ配布のQtを利用● インストール場所は自動探索● qtpm fmtでフォーマットを整える● clang-formatを利用。なるべくQt標準っぽい設定ファイルをデフォルトで利用するが・・・たまにフォーマット後にビルド通らなくなることが・・・● qtpm vetで文法チェック● clang-tidyを利用● qtpm testでテスト● CTest(ランナー)とQTest(フレームワーク)を利用● qtpm packでインストーラ作成
11.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.仕事はだいぶ楽になった● CMakeファイルベースの開発は徒手空拳でCMakeLists.txtと戦う必要がある● IDEはこのファイルを読み込んで初めてファイルをリストに出してくれる● Qt CreatorとCLionがサポートしている● コマンド一発でCMakeLists.txtが最新化されるのでファイル追加が楽● ビルドスクリプトの試行錯誤が激減● インストーラまで一括作成● Goで作ったので、各種タスク実行がWindows(MinGW, コマンドプロンプト)、macOS環境でもすべて同じように動く● パッケージは自分で追加しないといけない・・・● 今のところそこまでガンガン作っているわけではないので困ってない● モジュール化は進むので、コードは分かりやすくなっているはず・・・
12.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.補助ツールを作る時の退路を用意● 補助ツールのメンテがコストになってしまっては元も子もない● SPOFになってしまってもいけない● それが依存している何かがEOLになって使用不可能になるとか● 中間生成物として完動するCMakeLists.txtを生成する● 最悪、qtpmがなくても、このファイルさえあれば後工程が正しく動くようにしてあるqtpm pack設定ファイルを読むCMakeLists.txt生成CMake実行macdeployqtwindeployqt CPack実行
13.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.もしこれから作り直すならこうしたい● C/C++は主に超定番ライブラリと、それを使うユーザーライブラリで大きく2つに分けられる● zlibとかlibpngとか● 超定番ライブラリは高確率でOSにも入っていたり● 超定番ライブラリだけは特別扱いしてあげても良かったのでは● Microsoftのvcpkgはそうなっている。このコードをまるごと頂いてもよさそう● https://github.com/Microsoft/vcpkg● ユーザーパッケージとフラットに扱う仕組みじゃなくてもいい● クロスコンパイル● いろんな処理系全部入りのDockerイメージが最近ある
14.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.WebAssembly対応● WebAssemblyが今後普及するならパッケージマネージャが必要とされるはず!● ・・・と3年前に考えた● QtとともにWebAsmもサポートしたら面白そうだなと思っていた● 進捗● 処理系のダウンロード● Emscriptenの処理系を自動でダウンロードしてくる機能が入っていたりもするが、長らくEmscriptenのビルド済みバイナリが古いままだったので放置してた● 最近WebAsm対応のビルド済みバイナリがダウンロードできるようになったらしい● ビルド● 趣味で使おうと思ったぐらいでほとんどテストしてない・・・● そのうちまた興味が湧いたらやってみようかと
15.
*Copyright (C) DeNACo.,Ltd. All Rights Reserved.まとめ● C++は今時の言語と比べるともろもろ頑張る必要がある● ビルドツールいろいろ● パッケージマネージャのデファクトはなかった● Goを使ってGoっぽくC++ができるビルドツール兼パッケージマネージャ作った● CMakeベース● とりあえず便利に使ってます● 退路もきちんと用意してる● 作ってみての課題も見えた● 定番ライブラリのサポートをまるっとやりたかった● クロスコンパイルもやりたいよね・・・● WebAssembly対応も一応考えていた● Emscriptenの安定版がなかなか出ないのですっかり忘れてた