Skip to content

Instantly share code, notes, and snippets.

@shibukawa
Last active August 29, 2015 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shibukawa/cc9b3f767dfe8251d796 to your computer and use it in GitHub Desktop.
Save shibukawa/cc9b3f767dfe8251d796 to your computer and use it in GitHub Desktop.
Qtにもパッケージマネージャが欲しい

パッケージマネージャに乗っけたいライブラリ

アーカイバ

  • zlib
  • xz(xz, lzmo)
  • bzip2
  • libarchive
  • lz4
  • Snappy
  • zopfliy
  • zlibのラッパーライブラリ

データベース

  • sqlite
  • redis
  • hiredis
  • level db

ハッシュ

  • xxhash

グラフィックス

  • libpng
  • turbojpeg
  • etc1とetc2の何がしか
  • KTX
  • image magick
  • webp
  • quantizeとか系
  • 最適化系

ネットワーク

  • libssh2
  • openssl
  • libcurl
  • wslay
  • h2o
  • protocol buffer
  • 認証系とか欲しい

文字列処理・ファイルIO

  • regex
  • regexのラッパーライブラリ
  • hogan.jsxのC++版(作る)
  • libyaml
  • qrintf

バージョン管理

  • libgit2
  • libqgit2

プログラミング言語

  • Lua
  • Python

データ構造

  • shellinford
  • 簡潔データ構造系のやつ

その他

  • pthreadとかWindowsサポートライブラリ
  • QtKeychain
  • libuv

ツールの目的

  • qtpm(仮称)コマンドで、必要なライブラリを取得。--globalがなく、フラットに配置される、ライブラリ専用のnpmのような仕組み。
  • 今のところはQtに特化。
  • システムのフォルダには手を加えない。システムに影響を与えることなく、複数のバージョンを試したりできるようにする。また、システムの状態の影響をなるべく避けて、複数の場所で同じようにコーディングできるようにする。
  • 本番環境ではシステムにインストールされたライブラリを利用する、というのも選択できるようにする。
  • 既存のパッケージがあったとしても、ローカルで自前のバージョンに上書きして使えるようにする。npmだと、サードパーティの子モジュールとかに変更を加えるのは難しい。

ツールの動作

  • システムライブラリと、ユーザライブラリ、ソースライブラリの3種類

開発用ライブラリ(dev)

  • システムライブラリはzlibなどapt-getとかで取得できそうなもの
  • インストールをスキップする機能をつける
  • deps以下にバイナリとヘッダを配置
  • 静的・動的の2種類ある
  • リンクするライブラリとインクルードパスの書かれた.priを提供

挙動としては以下の5つ。環境ごとに選択できるようにする。

  • configureスクリプト
  • CMake(someday)
  • SCons(someday)
  • qmake(someday)
  • バイナリ

バンドルビルドライブラリ(bundle) - someday

  • 開発時も、本番環境ビルドも利用する
  • 静的・動的の2種類ある
  • リンクするライブラリとインクルードパスの書かれた.priを提供
  • third_party以下にダウンロードして、必要なら事前にビルドを実行
  • deps以下にバイナリとヘッダを配置

挙動としては以下の5つ。環境ごとに選択できるようにする。

  • configureスクリプト
  • CMake(someday)
  • SCons(someday)
  • qmake(someday)
  • バイナリ

バンドルソースライブラリ(src)

  • 開発時も、本番環境ビルドも利用する
  • 本番のプログラムにソース一覧情報の書かれた.priで組み込む。親プログラムと同時にビルドされる。
  • third_party以下に配置。

共通の動作

  • qtpackage.iniファイルがあり、ライブラリ情報が入る
  • このファイルでは著者やURL、説明などが入る
  • 依存関係情報を持つ
  • パッケージは基本的にgithubに置く。ブランチやタグで指定が可能
  • 開発ライブラリはqtpackage.iniだけというのを許容する。アーカイブの場所のURLをiniファイルに書く。もしくはリポジトリに入れてしまう。
  • .priは、../プロジェクトフォルダ/deps、もしくは../プロジェクトフォルダ/third_party/ロジェクト名 みたいにする。テスト各手時に楽なように。
  • ソースリポジトリはgit cloneさせてもいいかも。pull-request出しやすい。これを使う http://qiita.com/yuya_presto/items/dcebbebc6b3d9cf6f542
  • git ls-remoteで、cloneしなくてもリポジトリのタグとかブランチ情報は取ってこれる。これを利用する。
  • --save-devで開発ライブラリとして登録。--saveでバンドルライブラリ
  • 使うユーザからすると、bundleとdevしかない。ライブラリ側の設定で、ソースとビルドがある。
  • インストール時に--debug(デフォルト)と--release、--static、--sharedが設定できて、ビルド時のコンパイラオプションとして渡される。
  • 必要なライブラリ情報の取得は深さ優先探索で行われる。一番ルートのモジュールでローカルにおいてあるパッケージを指定することで、子や孫で使うライブラリを上書きできる。
  • パッケージ名は以下の書き方を許容する
    • ローカルフォルダ
    • ローカルのアーカイブファイル(.tar.gz, .tgz, .tar.bz2, .tbz, .tar.xz, .tar.lzmo, .zip)
    • 登録されたパッケージ名(まずはwiki?)
    • 登録されたパッケージ名#ブランチ
    • 登録されたパッケージ名#タグ
    • 登録されたパッケージ名@semver
    • github.com/ユーザ名/リポジトリ名
    • github.com/ユーザ名/リポジトリ名#ブランチ
    • github.com/ユーザ名/リポジトリ名#タグ
    • github.com/ユーザ名/リポジトリ名@semver
  • どのパッケージも、物理的な場所(URL, パス)をエイリアスとして、qtpackage.iniに書かれた名前がパッケージ名。

既存ツールとの比較

clib

  • 基本的にソースパッケージ相当しかなさそう。

初期リリースで目指すもの

  • devライブラリ(configureとバイナリ)のインストール
  • ソースライブラリのインストール
  • git連携(外部コマンド経由)
  • tar.gzの展開
  • semver

コマンド

インストール

  • qtpm install

    qtpackage.iniに記録されているモジュールをインストール。qtpackage.iniがなければエラー。

  • qtpm install --bundle

    qtpackage.iniに記録されているバンドルモジュールのみをインストール。qtpackage.iniがなければエラー。

  • qtpm install モジュール名[@バージョン/ブランチ]

    指定されたモジュールをローカルのdeps以下にダウンロード

  • qtpm install モジュール名[@バージョン/ブランチ] --save

    指定されたモジュールをローカルのdeps以下にダウンロードしつつ、qtpackage.iniのバンドルセクションに登録。qtpackage.iniがなければエラー。

  • qtpm install モジュール名[@バージョン/ブランチ] --save-dev

    指定されたモジュールをローカルのdeps以下にダウンロードしつつ、qtpackage.iniの開発セクションに登録。qtpackage.iniがなければエラー

  • qtpm uninstall モジュール名

    指定されたモジュールを削除(ただしパッケージがヘッダとライブラリを知っている必要あり)

  • qtpm uninstall モジュール名 --remove

    指定されたモジュールを削除(ただしパッケージがヘッダとライブラリを知っている必要あり)しつつ、qtpackage.iniのバンドルセクションから削除。qtpackage.iniがなければエラー

  • qtpm install モジュール名[@バージョン/ブランチ] --save-dev

    指定されたモジュールをローカルのdeps以下にダウンロードしつつ、qtpackage.iniの開発セクションに登録。qtpackage.iniがなければエラー

  • qtpm update

    qtpackage.iniに記録されているすべてのライブラリをアップグレードする。qtpackage.iniがなければエラー

  • qtpm update モジュール名[@バージョン/ブランチ]

    指定されたモジュールをローカルのdeps以下にダウンロード。インストールされていなければエラー。

  • qtpm update モジュール名[@バージョン/ブランチ] --save

    指定されたモジュールをローカルのdeps以下にダウンロードしつつ、qtpackage.iniのセクションのバージョンを更新。qtpackage.iniがなければエラー。

  • qtpm update モジュール名[@バージョン/ブランチ] --save-dev

    指定されたモジュールをローカルのdeps以下にダウンロードしつつ、qtpackage.iniの開発セクションのバージョンを更新。qtpackage.iniがなければエラー

  • qtpm init プロジェクト名

    qtpackage.iniのひな形を作成

  • qtpm init-lib プロジェクト名

    qtpackage.iniのひな形を作成

パッケージのバージョンの解決

  • エイリアスを処理できる必要がありそう
  • localmodule.tgzやローカルフォルダのをインストールしたときに、中に書かれているパッケージの名前をエイリアスとしてとっておく
  • ローカルからインストールしたものは常に最優先で利用される
  • これによって、利用しているパッケージのバージョンアップのテストがローカルで行える。
  • テストするときは、qtpm installでインストールしたあとに、qtpm install [localmodule]で上書きする。
  • インストール前にローカルのフォルダを一度スキャンして、インストール済みのモジュールの情報を知る必要がありそう。プリインストールでバージョンが古い場合は
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment