前回までに,Plamo Linuxで使っているビルドスクリプトや,ビルドスクリプトを作るためのメタビルドスクリプトについて紹介しました。
これらのスクリプトを使えば大量のパッケージを効率よく作ることができます。しかし,実際のパッケージビルドの際には予想外のトラブルが発生することも多々あります。そのような例として,今回と次回に渡ってX Window Systemの最新版であるX11R7.5をビルドした時の話を紹介しましょう。
X11R7.5について
X11R7.5はX Window Systemの最新リリース版で,11がXのプロトコルバージョン,7.5がリリースバージョンを示します。
X Window Systemは,もともとマサチューセッツ工科大学(MIT)がキャンパス中のコンピュータをネットワークで結んで,どこからでも自由にコンピュータ環境を利用できることを目指したアテナ・プロジェクトのウィンドウ環境として開発されたウィンドウシステムです。
そのような由来を持つため,当初からネットワーク透過性(ネットワーク上の別のマシンで起動したコマンドを手元に表示できる)と特定の機種に依存しない移植性の高さ(当時のMITのキャンパスにはさまざまなメーカのコンピュータがあった)を念頭に置いて開発されました。
また,自由な利用を許可するMIT Licenseで ソースコードを公開したこともあり,80年代後半のワークステーションブームの波に乗って,XはみるみるうちにUNIX系OSのウィンドウシステムとして事実上の標準の地位を獲得しました。
その後,アテナ・プロジェクトが完成し,MITが開発から身を引くことで,X Window Systemの開発主体はさまざまに変わっていきました。また,元々のX Window Systemはワークステーション用に開発されていましたが,広く普及してきたPC UNIX用にXの開発を続けようというXFree86プロジェクトが立ちあがったりと,さまざまな紆余曲折を経て,現在ではX.Org Foundationが開発主体となり,freedesktop.orgの元でオープンソースソフトウェアとしての開発が進められています。
上述のように,X Window Systemはネットワーク透過性を重視した設計になっており,画面描画等の機能は全てプロトコルとして定義されています。X11とはそのプロトコルの基本部分がバージョン11であることを示し、このプロトコルは1987年に完成して,X11という名称はその当時から変っていません。その後,このプロトコルに従ったサーバやクライアントの開発が進むと,それらはまとめてR2(X11R2),R3(X11R3)として公開されていきました。
X11R7.5はX11プロトコルを採用したメジャーバージョン7,マイナーバージョン5を意味します。なお,Xプロトコルの基本部分は1987年に完成したと述べましたが,動画処理や解像度の動的変更といった新しい機能は拡張プロトコルとして定義され,新機能の追加は現在も続いています。
元々のXのソースコードは,MITを中心とした開発チームが全てを管理していたため,画面描画を担当するXサーバから,xeyeやxcalcといったクライアント,各種フォントやアイコンデータ,kinput2等のインプットメソッドまでが1つのディレクトリ以下にまとめられ,"make World" 一発でビルドできるようになっていました(一枚岩的設計)。
しかし,開発者が世界中に分散してバザールモデルの開発スタイルへ移行するに伴い,分散開発が困難な一枚岩的設計から,アプリケーションごとにソースコードを細かく分割していくモジュール的設計に全体構成が変更されました。モジュール的設計への全面的な移行はX11R7の公開時に行われ,当初はチグハグな部分も散見されてかなり戸惑いましたが,5度目のリリースとなる最近ではようやく落ちついてきたようです。
ビルドの準備
X Window Systemのソースコードはftp.x.orgやそのミラーサイト(今回はftp.kddlabs.co.jpを利用しました)で公開されています。
前節で紹介したように,現在のX Window Systemのソースコードは細かく分割されており,X11R7.5として公開されたソースコードは395個に達しています。これらを一々手動でダウンロードしようとすると結構手間なので,今回は以下のような処理で一括ダウンロードしてみました。
$ mkdir X11R7.5 ; cd X11R7.5 $ for i in app data doc driver font lib proto util xserver ; do > mkdir $i > pushd $i > wget --retr-symlink ftp://ftp.kddlabs.co.jp/pub/X/ftp.x.org/pub/X11R7.5/src/$i/'*.tar.bz2' > popd > done
最近のXのソースコードは,FTPサイトの/pub/individual/の下にapp/やdata/,doc/といった種類ごとのディレクトリに分割して配置され,各ディレクトリには,その分類に属するソフトウェアのソースコードが過去に公開されたバージョンも含めて置かれています。"X11R7.5"としてのリリースは,/pub/X11R7.5/src/ 以下に app/ や data/, doc/ といった同様のディレクトリを配置して,それぞれのソースコードのうち,このリリースに含まれるバージョンへのシンボリックリンクをこれらディレクトリに配置する,といった構造で公開されています。
そのため,上記のスクリプトではwgetに--retr-symlinkオプションを指定してリンク先の実体を入手するようにしました。また,ソースコードはgzipで圧縮したものとbzip2で圧縮したものの2種が用意されているので,'*tar.bz2'を指定してbzip2で圧縮したもののみをダウンロードするように指示しています。
X11R7.5/src/everything/以下には、このリリースに含まれる全てのソースコードへのシンボリックリンクが含まれていますが,後述するようにX Window Systemのビルドには順番が重要なので,分類されたディレクトリを利用しています。
これらのソースコードに対して,前回紹介したメタビルドスクリプトを用いてPlamoBuildスクリプトを作っていくわけですが,util/ディレクトリにあるutil-macrosとmakedependは,他のソースコードを configure する時に必要なマクロ定義等が含まれているので,まず最初にインストールしておく必要があります。そのため,まずそれらをパッケージ化しインストールしておいた上で,残りのソースコードに対して,まとめてメタビルドスクリプトを適用しました。
$ for i in app data doc driver font lib proto xserver ; do > pushd $i > for j in *.tar.bz2 ; do > ../make_PlamoBuild.py -t X $j > done > popd > done ~/X11R75/app ~/X11R75 dirname = bdftopcf-1.0.2 making PlamoBuild.bdftopcf-1.0.2 ... ...
このループもやっていることは簡単で,ダウンロードしてきたソースコードを保存しているそれぞれのディレクトリに移動して,そのディレクトリにあるソースコード全てに対してメタビルドスクリプトを実行しているだけです。
なお,今回用いたメタビルドスクリプトは,URL行も自動的に生成するために,以下のような処理を追加したカスタマイズ版を用いました。このように試しながら修正を簡単に行えるのが,Python等のスクリプト言語の魅力です。
リスト1 make_PlamoBuild.pyの修正部分
current_dir = os.getcwd()
dir_name = os.path.basename(current_dir)
url = 'ftp://ftp.kddlabs.co.jp/pub/X/ftp.x.org/pub/X11R7.5/src/' + dir_name + '/' + filename + '-' + vers + '.tar.bz2'
header = make_headers(url, filename, vers, READMEs, patches)

