SlideShare a Scribd company logo
1 of 15
Copyright © DeNA Co.,Ltd. All Rights Reserved.
C++ビルド支援ツール
qtpm
Golang.tokyo #7
2017/7/3
渋川よしき
DeNA Co., Ltd.
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
社内GUIツール開発
● GUIのツール作りたくなることありますよね?
● マルチプラットフォーム(mac/win)の時に何を使うのか?
● C++: Qt / GTK
● C#: Xamarin, GTK#
● JavaScript: Electron
● Java: Swing
● ラッパー系はいろいろつらいので避けたい
● メンテされなくなることが多い
● 純正でも死屍累々(Qt JambiとかQt binding for QtScript Engineとか)
● デバッグが辛い(go-qmlも謎のsegvで辛かった)
● 結局下まわりを見ないといけないとか、ラッパーの品質問題とか
● 動的言語だと型が欲しくなる
● 以前、Qt/JSのJSX(DeNAの)ラッパーを作ったりしたけど、ある日無駄なことをして
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
社内GUIツール開発
● GUIのツール作りたくなることありますよね?
● マルチプラットフォーム(mac/win)の時に何を使うのか?
● C++: Qt / GTK
● C#: Xamarin, GTK#
● JavaScript: Electron
● Java: Swing
● ラッパー系はいろいろつらいので避けたい
● メンテされなくなることが多い
● 純正でも死屍累々(Qt JambiとかQt binding for QtScript Engineとか)
● デバッグが辛い(go-qmlも謎のsegvで辛かった)
● 結局下まわりを見ないといけないとか、ラッパーの品質問題とか
● 動的言語だと型が欲しくなる
● 以前、Qt/JSのJSX(DeNAの)ラッパーを作ったりしたけど、ある日無駄なことをして
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Qtが安定している
● 歴史が長い(1990〜)し、安定している
● コード品質、後方互換性(4系から5系でもほとんど修正不要)
● OSネイティブのルック&フィール
● メモリ消費量が今となっては激少ない(〜50MBとか)
● C++は型もあるし、C++11便利だし、内製ツールの規模ならビルドも早い
● WebKit/Chromiumベースのブラウザウィジェットもある
● QML / Qt Quick Controlは試したかったが、今回は学習の時間とか下調べの時間
とか、メリット、引き継ぎとか考えてやめた
● Qtは宣言型のJSONテンプレート+JSを使って開発するQt上の動的開発環境で
、モバイルを強く意識している
● 情報が少ない。QMLは旧ASCII MWで1冊。Qt Quick Controlは薄い本しかない
● 自分でやるにはいいけど・・・
● Qt Quick Control 2になってだいぶいろんなUI部品が増えたがテーブルとか、
ツリービューはなかった
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
C++でツールをさっと作るときの課題(1)
● 今時のパッケージマネージャ完備の言語と比べるといろいろつらい
● 良い感じの共通のパッケージマネージャ基盤がない
● OSを限定すれば各OSのもろもろに頼るのはできるが・・・
● そもそもライブラリごとにビルドシステムがばらばら
● configureスクリプトやらCMakeやらSconsやらNinjaやらXCodeやらVisual Studioの
ソリューションファイルやら何やら
● 前提となるフレームワークもばらばら
● ちょっぴりGlibとか使っているコードとかあったら、必要なライブラリも全部あつめ
て来ないといけない
● マルチプラットフォーム?なにそれ?なものも・・・
● 結局、必要なライブラリを全部内包しちゃっているプロジェクトが多い
● Googleプロダクツとかも・・・
● Go言語ならgo get一発なのに・・・
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
C++でツールをさっと作るときの課題(2)
● ビルドシステムがいろいろつらい
● QtでクロスプラットフォームだとQMakeかCMakeぐらいしかない
● QMakeはQt専用で、ライブラリがこの設定ファイルを内蔵している確率は
ゼロに近い
● CMakeが最近のデファクトだけど、文法とかいろいろ難しい
● Fizzbuzzとかズンドコきよしが書けるぐらい高度な言語
● やりたいこと→どう書けばいいか、の逆引きの分かりやすい解説が少ない
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
既存のパッケージ管理ソリューション(2014年〜)
● BiiCode
● 死んだ
● CPM
● CMakeベース
● clib
● C言語のパッケージマネージャ
● sbt
● ヘッダーファイルだけの過激なソリューション
● このツールを作り始めた後にできたもの
● conan.io
● このツールを作り始めた後にできたやつ
● JFrogという会社が買収して、今のところ今後期待できそう
● qpm
● Qt用。QMakeベース
● vcpkg
● MS製。全レシピ内蔵の富豪的なやつ(ただしWindows用)
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
GoっぽいパッケージマネージャをGoで作ろう (2014年〜)
● X getで必要なコードを持ってきて
● X buildで設定ファイルレスでアプリケーションをビルドして
● X testでユニットテストして
● X vetでコードの品質チェックして
● X fmtでフォーマットを修正して
● ついでにWebAssemblyとかやりたかった(まだ実現してない)
*
Copyright (C) DeNA Co.,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ファイルを作る機能も
*
Copyright (C) DeNA Co.,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でインストーラ作成
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
仕事はだいぶ楽になった
● CMakeファイルベースの開発は徒手空拳でCMakeLists.txtと戦う必要がある
● IDEはこのファイルを読み込んで初めてファイルをリストに出してくれる
● Qt CreatorとCLionがサポートしている
● コマンド一発でCMakeLists.txtが最新化されるのでファイル追加が楽
● ビルドスクリプトの試行錯誤が激減
● インストーラまで一括作成
● Goで作ったので、各種タスク実行がWindows(MinGW, コマンドプロンプト
)、macOS環境でもすべて同じように動く
● パッケージは自分で追加しないといけない・・・
● 今のところそこまでガンガン作っているわけではないので困ってない
● モジュール化は進むので、コードは分かりやすくなっているはず・・・
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
補助ツールを作る時の退路を用意
● 補助ツールのメンテがコストになってしまっては元も子もない
● SPOFになってしまってもいけない
● それが依存している何かがEOLになって使用不可能になるとか
● 中間生成物として完動するCMakeLists.txtを生成する
● 最悪、qtpmがなくても、このファイルさえあれば後工程が正しく動くよう
にしてある
qtpm pack
設定ファイル
を読む
CMakeLists.txt
生成
CMake実行
macdeployqt
windeployqt CPack実行
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
もしこれから作り直すならこうしたい
● C/C++は主に超定番ライブラリと、それを使うユーザーライブラリで大きく2つ
に分けられる
● zlibとかlibpngとか
● 超定番ライブラリは高確率でOSにも入っていたり
● 超定番ライブラリだけは特別扱いしてあげても良かったのでは
● Microsoftのvcpkgはそうなっている。このコードをまるごと頂いてもよさそう
● https://github.com/Microsoft/vcpkg
● ユーザーパッケージとフラットに扱う仕組みじゃなくてもいい
● クロスコンパイル
● いろんな処理系全部入りのDockerイメージが最近ある
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
WebAssembly対応
● WebAssemblyが今後普及するならパッケージマネージャが必要とされるはず!
● ・・・と3年前に考えた
● QtとともにWebAsmもサポートしたら面白そうだなと思っていた
● 進捗
● 処理系のダウンロード
● Emscriptenの処理系を自動でダウンロードしてくる機能が入っていたりもするが、
長らくEmscriptenのビルド済みバイナリが古いままだったので放置してた
● 最近WebAsm対応のビルド済みバイナリがダウンロードできるようになったらしい
● ビルド
● 趣味で使おうと思ったぐらいでほとんどテストしてない・・・
● そのうちまた興味が湧いたらやってみようかと
*
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ
● C++は今時の言語と比べるともろもろ頑張る必要がある
● ビルドツールいろいろ
● パッケージマネージャのデファクトはなかった
● Goを使ってGoっぽくC++ができるビルドツール兼パッケージマネージャ作った
● CMakeベース
● とりあえず便利に使ってます
● 退路もきちんと用意してる
● 作ってみての課題も見えた
● 定番ライブラリのサポートをまるっとやりたかった
● クロスコンパイルもやりたいよね・・・
● WebAssembly対応も一応考えていた
● Emscriptenの安定版がなかなか出ないのですっかり忘れてた

More Related Content

What's hot

C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話Kinuko Yasuda
 
The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive ExtensionsYoshifumi Kawai
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...Yoshifumi Kawai
 
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話Keisuke Utsumi
 
Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発Takahiro Kubo
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6信之 岩永
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践Yoshifumi Kawai
 
A Framework for LightUp Applications of Grani
A Framework for LightUp Applications of GraniA Framework for LightUp Applications of Grani
A Framework for LightUp Applications of GraniYoshifumi Kawai
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャShiroyagi Corporation
 
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~UnityTechnologiesJapan002
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミングseanchas_t
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFrameworkTrue Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFrameworkYoshifumi Kawai
 
PySide/QtWebkitで楽々 slideshare Hack
PySide/QtWebkitで楽々 slideshare HackPySide/QtWebkitで楽々 slideshare Hack
PySide/QtWebkitで楽々 slideshare HackKazushige TAKEUCHI
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone teradaManabu Terada
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGUehara Junji
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能Yoshifumi Kawai
 

What's hot (20)

C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
 
The History of Reactive Extensions
The History of Reactive ExtensionsThe History of Reactive Extensions
The History of Reactive Extensions
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
CrystalFantasiaを支えきった技術と技術だけではどうにもならなかった話
 
Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発Pythonで始めるWebアプリケーション開発
Pythonで始めるWebアプリケーション開発
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
A Framework for LightUp Applications of Grani
A Framework for LightUp Applications of GraniA Framework for LightUp Applications of Grani
A Framework for LightUp Applications of Grani
 
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャGoji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
 
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
【Unite Tokyo 2019】大量のアセットも怖くない!~HTTP/2による高速な通信の実装例~
 
Modern .NET
Modern .NETModern .NET
Modern .NET
 
QtとC++でGUIプログラミング
QtとC++でGUIプログラミングQtとC++でGUIプログラミング
QtとC++でGUIプログラミング
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFrameworkTrue Cloud Native Batch Workflow for .NET with MicroBatchFramework
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
 
PySide/QtWebkitで楽々 slideshare Hack
PySide/QtWebkitで楽々 slideshare HackPySide/QtWebkitで楽々 slideshare Hack
PySide/QtWebkitで楽々 slideshare Hack
 
Deep Dive C# 6.0
Deep Dive C# 6.0Deep Dive C# 6.0
Deep Dive C# 6.0
 
PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone terada
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
 

Similar to Golang tokyo #7 qtpm

CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-toolNaruto TAKAHASHI
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Makoto Haruyama
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成Izumi Tsutsui
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Masahito Zembutsu
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたYou&I
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入Yu Nobuoka
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜Masaya Aoyama
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころJunya Hayashi
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)Drecom Co., Ltd.
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)NTT DATA Technology & Innovation
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Al mininum 47redmine-2nd
Al mininum 47redmine-2ndAl mininum 47redmine-2nd
Al mininum 47redmine-2ndmikoto20000
 

Similar to Golang tokyo #7 qtpm (20)

CMake multiplatform build-tool
CMake multiplatform build-toolCMake multiplatform build-tool
CMake multiplatform build-tool
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみた
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Al mininum 47redmine-2nd
Al mininum 47redmine-2ndAl mininum 47redmine-2nd
Al mininum 47redmine-2nd
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 

More from Yoshiki Shibukawa

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料Yoshiki Shibukawa
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料Yoshiki Shibukawa
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsYoshiki Shibukawa
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみたYoshiki Shibukawa
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Yoshiki Shibukawa
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Yoshiki Shibukawa
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript ProgrammingYoshiki Shibukawa
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会Yoshiki Shibukawa
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」Yoshiki Shibukawa
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。Yoshiki Shibukawa
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Yoshiki Shibukawa
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Yoshiki Shibukawa
 
1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法Yoshiki Shibukawa
 

More from Yoshiki Shibukawa (20)

技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
技術書執筆のススメ 〜Only1なエンジニアになるためのセルフブランディング〜の発表資料
 
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
GO本執筆者が語る、2064年もITで仕事し続けるためのキャリアプランの発表資料
 
Go & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and ErrorsGo & multi platform GUI Trials and Errors
Go & multi platform GUI Trials and Errors
 
Excelの話
Excelの話Excelの話
Excelの話
 
アンラーニング
アンラーニングアンラーニング
アンラーニング
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014Oktavia全文検索エンジン - SphinxCon JP 2014
Oktavia全文検索エンジン - SphinxCon JP 2014
 
Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014Oktavia Search Engine - pyconjp2014
Oktavia Search Engine - pyconjp2014
 
大規模JavaScript開発
大規模JavaScript開発大規模JavaScript開発
大規模JavaScript開発
 
Xpjug基調lt2011
Xpjug基調lt2011Xpjug基調lt2011
Xpjug基調lt2011
 
Expert JavaScript Programming
Expert JavaScript ProgrammingExpert JavaScript Programming
Expert JavaScript Programming
 
JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会JavaScriptゲーム制作勉強会
JavaScriptゲーム制作勉強会
 
Pomodoro technique
Pomodoro techniquePomodoro technique
Pomodoro technique
 
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
ドキュメントを作りたくなってしまう魔法のツール「Sphinx」
 
Bitbucket&mercurial
Bitbucket&mercurialBitbucket&mercurial
Bitbucket&mercurial
 
つまみぐい勉強法。その後。
つまみぐい勉強法。その後。つまみぐい勉強法。その後。
つまみぐい勉強法。その後。
 
Erlang and I and Sphinx.
Erlang and I and Sphinx.Erlang and I and Sphinx.
Erlang and I and Sphinx.
 
Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30Sphinx Tutorial at BPStudy#30
Sphinx Tutorial at BPStudy#30
 
Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?Who is the person whom the IT engineers should learn next to Alexander?
Who is the person whom the IT engineers should learn next to Alexander?
 
1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法1日~1週間でOSSに貢献する方法
1日~1週間でOSSに貢献する方法
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

Golang tokyo #7 qtpm

  • 1. Copyright © DeNA Co.,Ltd. All Rights Reserved. C++ビルド支援ツール qtpm Golang.tokyo #7 2017/7/3 渋川よしき DeNA Co., Ltd.
  • 2. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 社内GUIツール開発 ● GUIのツール作りたくなることありますよね? ● マルチプラットフォーム(mac/win)の時に何を使うのか? ● C++: Qt / GTK ● C#: Xamarin, GTK# ● JavaScript: Electron ● Java: Swing ● ラッパー系はいろいろつらいので避けたい ● メンテされなくなることが多い ● 純正でも死屍累々(Qt JambiとかQt binding for QtScript Engineとか) ● デバッグが辛い(go-qmlも謎のsegvで辛かった) ● 結局下まわりを見ないといけないとか、ラッパーの品質問題とか ● 動的言語だと型が欲しくなる ● 以前、Qt/JSのJSX(DeNAの)ラッパーを作ったりしたけど、ある日無駄なことをして
  • 3. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 社内GUIツール開発 ● GUIのツール作りたくなることありますよね? ● マルチプラットフォーム(mac/win)の時に何を使うのか? ● C++: Qt / GTK ● C#: Xamarin, GTK# ● JavaScript: Electron ● Java: Swing ● ラッパー系はいろいろつらいので避けたい ● メンテされなくなることが多い ● 純正でも死屍累々(Qt JambiとかQt binding for QtScript Engineとか) ● デバッグが辛い(go-qmlも謎のsegvで辛かった) ● 結局下まわりを見ないといけないとか、ラッパーの品質問題とか ● 動的言語だと型が欲しくなる ● 以前、Qt/JSのJSX(DeNAの)ラッパーを作ったりしたけど、ある日無駄なことをして
  • 4. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Qtが安定している ● 歴史が長い(1990〜)し、安定している ● コード品質、後方互換性(4系から5系でもほとんど修正不要) ● OSネイティブのルック&フィール ● メモリ消費量が今となっては激少ない(〜50MBとか) ● C++は型もあるし、C++11便利だし、内製ツールの規模ならビルドも早い ● WebKit/Chromiumベースのブラウザウィジェットもある ● QML / Qt Quick Controlは試したかったが、今回は学習の時間とか下調べの時間 とか、メリット、引き継ぎとか考えてやめた ● Qtは宣言型のJSONテンプレート+JSを使って開発するQt上の動的開発環境で 、モバイルを強く意識している ● 情報が少ない。QMLは旧ASCII MWで1冊。Qt Quick Controlは薄い本しかない ● 自分でやるにはいいけど・・・ ● Qt Quick Control 2になってだいぶいろんなUI部品が増えたがテーブルとか、 ツリービューはなかった
  • 5. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. C++でツールをさっと作るときの課題(1) ● 今時のパッケージマネージャ完備の言語と比べるといろいろつらい ● 良い感じの共通のパッケージマネージャ基盤がない ● OSを限定すれば各OSのもろもろに頼るのはできるが・・・ ● そもそもライブラリごとにビルドシステムがばらばら ● configureスクリプトやらCMakeやらSconsやらNinjaやらXCodeやらVisual Studioの ソリューションファイルやら何やら ● 前提となるフレームワークもばらばら ● ちょっぴりGlibとか使っているコードとかあったら、必要なライブラリも全部あつめ て来ないといけない ● マルチプラットフォーム?なにそれ?なものも・・・ ● 結局、必要なライブラリを全部内包しちゃっているプロジェクトが多い ● Googleプロダクツとかも・・・ ● Go言語ならgo get一発なのに・・・
  • 6. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. C++でツールをさっと作るときの課題(2) ● ビルドシステムがいろいろつらい ● QtでクロスプラットフォームだとQMakeかCMakeぐらいしかない ● QMakeはQt専用で、ライブラリがこの設定ファイルを内蔵している確率は ゼロに近い ● CMakeが最近のデファクトだけど、文法とかいろいろ難しい ● Fizzbuzzとかズンドコきよしが書けるぐらい高度な言語 ● やりたいこと→どう書けばいいか、の逆引きの分かりやすい解説が少ない
  • 7. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 既存のパッケージ管理ソリューション(2014年〜) ● BiiCode ● 死んだ ● CPM ● CMakeベース ● clib ● C言語のパッケージマネージャ ● sbt ● ヘッダーファイルだけの過激なソリューション ● このツールを作り始めた後にできたもの ● conan.io ● このツールを作り始めた後にできたやつ ● JFrogという会社が買収して、今のところ今後期待できそう ● qpm ● Qt用。QMakeベース ● vcpkg ● MS製。全レシピ内蔵の富豪的なやつ(ただしWindows用)
  • 8. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. GoっぽいパッケージマネージャをGoで作ろう (2014年〜) ● X getで必要なコードを持ってきて ● X buildで設定ファイルレスでアプリケーションをビルドして ● X testでユニットテストして ● X vetでコードの品質チェックして ● X fmtでフォーマットを修正して ● ついでにWebAssemblyとかやりたかった(まだ実現してない)
  • 9. * Copyright (C) DeNA Co.,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) DeNA Co.,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) DeNA Co.,Ltd. All Rights Reserved. 仕事はだいぶ楽になった ● CMakeファイルベースの開発は徒手空拳でCMakeLists.txtと戦う必要がある ● IDEはこのファイルを読み込んで初めてファイルをリストに出してくれる ● Qt CreatorとCLionがサポートしている ● コマンド一発でCMakeLists.txtが最新化されるのでファイル追加が楽 ● ビルドスクリプトの試行錯誤が激減 ● インストーラまで一括作成 ● Goで作ったので、各種タスク実行がWindows(MinGW, コマンドプロンプト )、macOS環境でもすべて同じように動く ● パッケージは自分で追加しないといけない・・・ ● 今のところそこまでガンガン作っているわけではないので困ってない ● モジュール化は進むので、コードは分かりやすくなっているはず・・・
  • 12. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 補助ツールを作る時の退路を用意 ● 補助ツールのメンテがコストになってしまっては元も子もない ● SPOFになってしまってもいけない ● それが依存している何かがEOLになって使用不可能になるとか ● 中間生成物として完動するCMakeLists.txtを生成する ● 最悪、qtpmがなくても、このファイルさえあれば後工程が正しく動くよう にしてある qtpm pack 設定ファイル を読む CMakeLists.txt 生成 CMake実行 macdeployqt windeployqt CPack実行
  • 13. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. もしこれから作り直すならこうしたい ● C/C++は主に超定番ライブラリと、それを使うユーザーライブラリで大きく2つ に分けられる ● zlibとかlibpngとか ● 超定番ライブラリは高確率でOSにも入っていたり ● 超定番ライブラリだけは特別扱いしてあげても良かったのでは ● Microsoftのvcpkgはそうなっている。このコードをまるごと頂いてもよさそう ● https://github.com/Microsoft/vcpkg ● ユーザーパッケージとフラットに扱う仕組みじゃなくてもいい ● クロスコンパイル ● いろんな処理系全部入りのDockerイメージが最近ある
  • 14. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. WebAssembly対応 ● WebAssemblyが今後普及するならパッケージマネージャが必要とされるはず! ● ・・・と3年前に考えた ● QtとともにWebAsmもサポートしたら面白そうだなと思っていた ● 進捗 ● 処理系のダウンロード ● Emscriptenの処理系を自動でダウンロードしてくる機能が入っていたりもするが、 長らくEmscriptenのビルド済みバイナリが古いままだったので放置してた ● 最近WebAsm対応のビルド済みバイナリがダウンロードできるようになったらしい ● ビルド ● 趣味で使おうと思ったぐらいでほとんどテストしてない・・・ ● そのうちまた興味が湧いたらやってみようかと
  • 15. * Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ ● C++は今時の言語と比べるともろもろ頑張る必要がある ● ビルドツールいろいろ ● パッケージマネージャのデファクトはなかった ● Goを使ってGoっぽくC++ができるビルドツール兼パッケージマネージャ作った ● CMakeベース ● とりあえず便利に使ってます ● 退路もきちんと用意してる ● 作ってみての課題も見えた ● 定番ライブラリのサポートをまるっとやりたかった ● クロスコンパイルもやりたいよね・・・ ● WebAssembly対応も一応考えていた ● Emscriptenの安定版がなかなか出ないのですっかり忘れてた