Ubuntu Weekly Recipe

第244回 JHBuildでGNOMEをビルドしよう

この記事を読むのに必要な時間:およそ 4 分

はじめまして。松澤二郎と申します。GNOMEプロジェクトの日本語翻訳メンバーとして,GNOMEの翻訳と,そのためのGNOMEのビルドをする日々を過ごしています。翻訳をするためには最新のアプリケーションのUIを確認する必要がありますが,開発版のUbuntuやPPAでも提供されていないものは,自分でビルドすることになります。

今回は,JHBuildというツールを使って,最新のGNOMEをビルドする方法を紹介します。

JHBuildとは

JHBuildとは,GNOMEプロジェクトが配布する各種プログラムをビルドするための,Pythonベースのツールです。

GNOMEからはさまざまなプログラムのソースパッケージが配布されています。GNOMEでは,各ソースパッケージをモジュールと呼んでおり,それぞれGitリポジトリで管理しています。各モジュールは複雑な依存関係を持っており,ひとつひとつ手でビルドするのは至難の業です。

JHBuildは,各モジュールの依存関係を解決し,ソースの取得,ビルド,インストールまで自動実行してくれるツールです。しかも常に最新のリビジョンを追うことができます。主に,テスターや翻訳者,最新機能を試したいユーザーなどに利用されています。

JHBuildの仕組み

依存関係の解決

ファイルマネージャーのNautilusをビルドするケースを例に説明しましょう。Nautilusは,GTK+やGLibなどに依存しています。さらにGTK+はGLibやGDK-PixBufなどに依存しています。GDK-PixBufはlibpngなどにも依存しています。こういった依存関係を再帰的に解決して,もっとも土台となるモジュールから順にビルドしていきます。なお,先に示したlibpngなどはGNOMEのモジュールではありません。そうしたGNOME外部の依存物のいくつかは,システムモジュールと呼び,各ディストリビューションのパッケージ(Ubuntuではdebパッケージ)を利用して依存関係を解決します。

依存関係は,モジュールセットファイルと呼ばれる,JHBuild独自のXMLで記述しています。ファイルの例はJHBuildのリポジトリから参照できます。

ビルドの自動化

モジュールセットファイルには,依存関係だけでなく,各モジュールのGitリポジトリの場所やブランチ名などソースの取得方法,デフォルトのビルドオプションなども記載されています。この情報に基づいて,ビルドするモジュールすべてに対して,ソースの取得,ビルド,インストールを自動で行います。ビルドオプションは,ユーザーの好みに応じて変更可能です。

JHBuildでビルドしたファイルは,システム環境(/usrなど)とは独立した場所にインストールされます。JHBuildは,rootユーザーやsudoなど管理者権限で実行できないようになっており,一般ユーザーの権限で書き込み可能な場所にしかビルドしたファイルをインストールできません。インストール先はユーザーで設定できます。

JHBuildのセットアップ

今回は,JHBuildを使って最新のNautilus 3.6をビルドしてみます。Nautilus 3.6は次期12.10には搭載されませんが,検索機能の強化やワークフローの改良など多くの改善が図られています。ちょっと試してみたいというユーザーもいるのではないでしょうか。

12.10 Beta2を利用

それではJHBuildをセットアップしましょう,と行きたいところですが,残念ながら12.04のJHBuildはバージョンが古く,最新のモジュールセットファイルを解釈できません。そのため今回は12.10 Beta2を利用することにします。

VirtualBoxなど仮想環境を利用することをおすすめします。仮想環境を利用するメリットは他にもあります。先述の通りJHBuildは,システムモジュールをパッケージとしてインストールする必要があるため,仮想環境を利用すればビルドのためだけに本番環境を汚さないで済みます。なお,VirtualBoxでディスク容量を指定する場合,今回の作業を試すだけでも12GB以上は確保するようにしてください。今回のNautilusのビルド作業では,JHBuildが生成するファイルだけでも6GBは使用します。

必要パッケージのインストール

次のパッケージをインストールしてください。JHBuild以外にもいくつかのビルドツールなどをインストールしています。

$ sudo apt-get install jhbuild libtool autopoint flex bison valac libxml2-utils docbook-xml docbook-xsl libxml-simple-perl xsltproc apt-file

上記でapt-fileもインストールしています。apt-fileをインストールすると,apt-fileのデータベースをアップデートするようダイアログが表示されます。ダイアログ上の「このアクションをすぐに実行する」というボタンを押してください。

図1 apt-fileのアップデートダイアログ

図1 apt-fileのアップデートダイアログ

コンフィグファイル

ビルドしたファイルのインストール先などを指定するためのコンフィグファイルを用意します。コンフィグファイルのパスは,~/.config/jhbuildrcです。今回は次の内容とします。

import os
moduleset = ['gnome-world-3.8', 'gnome-apps-3.8', 'gnome-suites-core-3.8', 'gnome-suites-core-deps-3.8', 'gnome-suites-core-deps-base-3.8', 'gnome-sysdeps-3.8']
checkoutroot = os.path.expanduser('~/jhbuild/checkout')
prefix = os.path.expanduser('~/jhbuild/install')

コンフィグファイルはPythonの構文で記述します。と言ってもPythonを知らなくてもまったく問題ありません。基本的には「コンフィグ名 = コンフィグ値」のようにシンプルな記述だけで済みます。今回は動的な設定をしているのでPythonコードがほんの少しだけ見えます。

コンフィグファイルの内容を簡単に説明すると,⁠import os」の行は,Pythonのosモジュールをインポートします。今回は,以下でユーザーのホームディレクトリを動的に取得するためにPythonライブラリを利用します。⁠moduleset」は,参照するモジュールセットファイルの一覧を指定します。今回は,GNOMEの最新版に関わるものを指定しています。3.8と見えますが,本稿執筆時点では3.6に毛の生えた程度のバージョンとなります。⁠checkoutroot」は,チェックアウトしたソースツリーを保存するディレクトリを指定します。今回は ~/jhbuild/checkout としました。絶対パスで指定する場合は,os.path.expanduser()の部分を消しても問題ありません。⁠prefix」は,ビルドしたファイルをインストールするディレクトリを指定します。今回は,~/jhbuild/install としました。ディレクトリはお好みの場所でかまいませんが,書き込み可能である必要があります。

ディレクトリの作成

コンフィグファイルに指定したディレクトリを作成します。

$ mkdir -p ~/jhbuild/checkout ~/jhbuild/install

システムモジュールのインストール

システムモジュールに対応するUbuntuパッケージは,JHBuildを通じてインストールできます。内部では,apt-fileでパッケージを特定し,apt-getでインストールします。インストール時は認証が必要になります。次のコマンドを実行します。

$ jhbuild sysdeps --install

コマンドを実行すると,パッケージが既にインストール済みのモジュールや,まだインストールされていないモジュールなどの情報が表示されるとともに,必要なパッケージをインストールするための認証ダイアログが表示されます。認証を済ませパッケージのインストールを行なってください。なお,JHBuild側の問題で,一部のシステムモジュールを上記のsysdepsサブコマンドでインストールできません注1)⁠今回は必要になるものを手動でインストールすることにします。

$ sudo apt-get install libjpeg-dev libtiff5-dev libacl1-dev gperf libcrack2-dev libpam0g-dev libdb-dev libnl-dev libcanberra-gtk3-dev libtasn1-3-bin ppp-dev bogofilter spamassassin ruby libicu-dev
注1
この問題については,JHBuildの開発者もバグとして認識しているので,いずれ修正されると思われます。

セットアップの確認

セットアップが正しくできたか,sanitycheckサブコマンドで確認できます。

$ jhbuild sanitycheck

何も出力されなければOKです。何か問題があれば(たとえばチェックアウト先のディレクトリが書き込み可能でない等)⁠その旨エラー内容が表示されます。

著者プロフィール

松澤二郎(まつざわじろう)

GNOME Foundationメンバー,GNOME日本語翻訳メンバー,Ubuntu Japanese Translator。

コメント

コメントの記入