JHBuild の基本的な使い方
[履歴] [最終更新] (2018/11/07 18:34:51)
1
作品
407
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

概要

JHBuild は複数のソースパッケージの依存関係等を定義して、何らかの成果物をビルドするためのツールです。各ソースパッケージはモジュールとよばれます。モジュールのソースコードは Git や Subversion、FTP/Web サーバ上の zip、tar 等様々なものが利用できます。モジュールのビルドシステムとしては cmakemake といった様々なものが利用できます。ここでは特にバージョン 3.15 を利用して、簡単な使い方をまとめます。

インストール方法

ソースコードからインストールする場合は以下のようにします。2.3 以上の python が必要です。インストールされていることを確認します。

$ python --version
Python 2.7.13

ソースコードをダウンロードしてビルドします。

git clone https://gitlab.gnome.org/GNOME/jhbuild.git
cd jhbuild/
./autogen.sh
make
make install
echo 'PATH=$PATH:~/.local/bin' >> ~/.bashrc
source ~/.bashrc

以下の場所にインストールされます。

...
Creating /home/vagrant/.local/bin/jhbuild
Creating /home/vagrant/.local/share/applications/jhbuild.desktop

$ which jhbuild
/home/vagrant/.local/bin/jhbuild

あるいは、apt コマンド等によってもインストールできます。

sudo apt install jhbuild

サンプル設定

jhbuild 設定

既定では ~/.config/jhbuildrc の設定が読み込まれます。特定の設定を読み込むためには -f で指定します。

jhbuild -f /path/to/your/jhbuildrc build

設定ファイルでは python の記法を利用します。例えば、以下のように設定します。

mkdir -p ~/jhbuild_home/modulesets
touch ~/jhbuild_home/jhbuildrc

~/jhbuild_home/jhbuildrc

# -*- mode: python -*-
# -*- coding: utf-8 -*-

# 便宜的に、今回のビルドを以下のディレクトリで行います。JHBuild 自体の設定ではありません。
jhhome = os.path.join(os.environ['HOME'], 'jhbuild_home')

# モジュール定義ファイルが格納されたディレクトリを指定します。
modulesets_dir = os.path.join(jhhome, 'modulesets')
use_local_modulesets = True

# `modulesets_dir` に格納されているモジュール定義ファイルのうち、特に今回ビルドする
# モジュールが含まれているものを指定します。
moduleset = 'my_moduleset_1'

# `moduleset` に記載されているモジュールのうち、今回
# `jhbuild build` したいものを指定します。`buildone` でない場合は
# 依存関係にあるモジュールも再帰的にビルドされます。
modules = ['my_module_a', 'my_module_b']

# モジュール定義で指定されている先からソースコードをダウンロードして
# 展開するディレクトリを指定します。
checkoutroot = os.path.join(jhhome, 'checkoutroot')
tarballdir = os.path.join(jhhome, 'downloads')

# `checkoutroot` ではなく特定のディレクトリでビルドしたい場合
buildroot = os.path.join(jhhome, 'build')

# ビルド結果である成果物を格納する先を指定
prefix = os.path.join(jhhome, 'install')

# ディレクトリが存在しなければ作成します。
for dirname in [checkoutroot, tarballdir, buildroot, prefix]:
    if not os.path.isdir(dirname):
        os.makedirs(dirname)

モジュール定義

本ページでビルドした jhbuid コマンドを、モジュールとしてビルドしてみます。autotools を設定します。

~/jhbuild_home/modulesets/my_moduleset_1.modules

<?xml version="1.0"?>
<moduleset>

  <!-- module includes -->

  <include href="my_moduleset_2.modules"/>

  <!-- meta packages -->

  <metamodule id="my_module_a">
    <dependencies>
      <dep package="my_module_c"/>
    </dependencies>
  </metamodule>

  <metamodule id="my_module_b">
    <dependencies>
      <dep package="my_module_c"/>
    </dependencies>
  </metamodule>

</moduleset>

~/jhbuild_home/modulesets/my_moduleset_2.modules

<?xml version="1.0"?>
<moduleset>

  <!-- repositories -->

  <repository type="git" name="mygit" href="https://gitlab.gnome.org/GNOME/"/>

  <!-- make packages -->
  <autotools id="my_module_c">
    <branch repo="mygit" module="jhbuild" tag="f04471954daf066ab088d0b3d7fb0d66ce4bfe81" />
  </autotools>

</moduleset>

コマンド例

必要なツールの確認およびインストール

jhbuild -f ./jhbuildrc sanitycheck
jhbuild -f ./jhbuildrc sysdeps --install

jhbuildrc で指定したモジュールをビルド

jhbuild -f ./jhbuildrc build

$ ls ./install/bin
jhbuild

個別に指定してモジュールをビルド

jhbuild -f ./jhbuildrc build my_module_a

依存先はビルド済みであるとして、指定したモジュールのみをビルド

jhbuild -f ./jhbuildrc buildone my_module_a

ビルドに失敗したモジュールを、ローカルで修正してから、再ダウンロードせずにビルドし直す。

jhbuild -f ./jhbuildrc buildone my_module_a -nfc

リビジョン情報付きで全モジュールをリスト表示

jhbuild -f ./jhbuildrc list -r
my_module_c (f04471954daf066ab088d0b3d7fb0d66ce4bfe81)
my_module_a
my_module_b

モジュール情報を確認

jhbuild -f ./jhbuildrc info my_module_a

最新のソースコードのダウンロードとビルドを別々に行う (インターネット接続ができる環境でダウンロードだけ行っておきたい場合、あるいはダウンロードしたソースコードをローカル環境で編集してからビルドしたい場合)

jhbuild -f ./jhbuildrc update
jhbuild -f ./jhbuildrc build --no-network

デバッグ等の情報を得るために jhbuild と同じ環境のシェルを開始

jhbuild -f ./jhbuildrc shell
echo $PATH

依存関係を可視化

sudo apt install xdot
jhbuild -f ./jhbuildrc dot | dot -Tpng > dependencies.png
jhbuild -f ./jhbuildrc dot --clusters | dot -Tpng > dependencies.png (metamodule 内のモジュールをグルーピング)

Uploaded Image

あるモジュールに依存するモジュール一覧を確認 (直近のみ、すべて、依存情報付きすべて)

jhbuild -f ./jhbuildrc rdepends my_module_c --direct
jhbuild -f ./jhbuildrc rdepends my_module_c
jhbuild -f ./jhbuildrc rdepends my_module_c --dependencies

アンインストール

jhbuild -f ./jhbuildrc uninstall my_module_c

モジュール情報について

$ jhbuild info my_module_c
Name: my_module_c
Module Set: my_moduleset_2
Type: distutils
Install version: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  ← jhbuild build すると書き変わります (jhbuild update だけでは書き変わりません)
Install date: 2018-01-01 00:00:00
Git Module: zzzzzzzzzz
Git Branch: master
Git Tag: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy  ← モジュール定義で指定されている git tag です。
Tree-ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  ← jhbuild update すると checkoutroot にダウンロードされて、ここが書き変わります。
関連ページ