GoboLinuxがよく知られているのは、その一風変わったファイルシステム階層によってだろう。プログラムに付随するファイルが/etc、/usr/bin、/usr/shareなどいくつかの場所に散らばっているLinuxの従来のファイルシステム階層とは異なり、GoboLinuxでは各プログラムが独自のディレクトリツリーを持つ。
言うまでもなく、こうした階層はパッケージ管理を楽にしてくれる。ユーザは、1つのプログラムまたはシステムライブラリについて複数のバージョンをインストールして使うことができる。実際、GoboLinuxがGNU Compiler Collection(GCC)のバージョン3に移行したあとも、このファイルシステムであれば複数のバージョンのライブラリを何の問題もなく共存させられるため、以前のバージョンを実行することが可能になっている。また、アンインストールの際にも該当するプログラムのディレクトリを削除するだけで済む。
しかし、このような先進的なディレクトリ構造のもとでアプリケーションは一体どのようにインストールされるのだろうか。
ソースコードだけで十分
GoboLinuxの開発者たちには、最初からRPMやDebianパッケージのような別のパッケージ形式を加えるつもりがなかったという。そのうえ、RPMやDebianといったパッケージ形式は、アプリケーションの人気に応じて提供されたりされなかったりすることがある。しかし、どんなアプリケーションでもソースを圧縮したtarballは入手できるはずだ。
GoboLinuxをAndré Detsch氏と共に開発したHisham H. Muhammad氏は、tarballなら簡単に展開でき「configure、make、make install」という3つのコマンドを使ってインストールできる、と説明する。
依存関係がconfigureコマンドによって(解決はされないが)チェックされ、プログラムはシステム上に存在する適切なライブラリと不整合なくリンクされる。ソースのtarballをうまい具合にまとめていくつかのGNUの慣習に従ったものにすれば、どんなLinuxディストリビューションでも動作するに違いない、とGoboLinuxの開発者たちは考えた。そうなれば、理論的にはtarballさえあれば他の配布形式は一切必要なくなるはずである。また、GNUのビルドシステムなど標準のビルド環境を使ってアプリケーションをまとめれば、インストールの自動化も可能になる。
しかし、誰もがGNUのビルドシステムを使ってソースのtarballをまとめているわけではない。そこで、登場するのがGoboLinuxのCompileツールである。このCompileは、ソースがいくつかの標準的な方法で配布され、宣言によって特定可能な多数のマイナー・バリエーションが存在するという前提で動作する。そうした配布方法のそれぞれが「実行モデル」であり、それらをサポートするしくみが別々に実装されている。GoboLinuxには、主要な実行モデルが3つある。configureベースのファイルを対象とする「compileprogram」、configureなしのmake/make-installプロジェクトを対象とする「makefile」、Xのimakeツールに基づいたアプリケーションを対象とする「xmkmf」である。
ソースのtarballのダウンロード、展開、コンパイル、インストールのすべてを1つのコマンドで実行するのがCompileツールの役割だ。Compileでは、アプリケーションのコンパイル方法を記述した「レシピ(recipe)」と呼ばれる簡単なファイルが利用される。
Compileが動作するしくみ
Compileの優れている点は、ソースを取得するためにあらゆるプロジェクトのダウンロード・サイトを利用することだ。GoboLinuxのリポジトリは、レシピをダウンロードするためだけに使われる。レシピのダウンロードはGetRecipeコマンドを使って明示的に行なうこともできるが、Compileを実行すればコンパイルが必要になったときにその場で行われる。
例えば、Compileを使ってテキストエディタJoeをダウンロードするには、単純にCompile joeと実行する。これにより、まずはjoe(大文字と小文字の区別あり)という名のレシピの検索が行われる。特定のバージョンを指定したい場合はCompile joe 3.1のようにすれば、Joeのバージョン3.1用のレシピを探してくれる。レシピは圧縮されたtarballになっており、joeのレシピであればJoe-3.1-r2-recipe.tar.bz2というファイルがこれにあたる。
Compileがこのtarballを展開すると、RecipeというファイルとResourcesというディレクトリができる。Recipeファイルの内容は次のようになっている。
# Recipe (MakeRecipe) for Joe by roko, <ro.ko@mcnon.com>, on Wed Oct 27 03:01:32 BRST 2004
# Recipe for version 3.1 by roko, <ro.ko@mcnon.com>, on Wed Oct 27 03:01:32 BRST 2004
compile_version=1.8.0
url="$httpSourceforge/joe-editor/joe-3.1.tar.gz"
file_size=381201
file_md5=2a6ef018870fca9b7df85401994fb0e0
recipe_type=configure
続いて、Compileは上記のURLを参照し、このプロジェクトのホームページからソースのtarballをダウンロードする。上記のrecipe_typeオプションは、そのプログラムに必要なコンパイルの種類(この場合は./configure、make、make installという一般的な手順)を示している。同じく上記のファイルサイズとMD5シグネチャは、Compileがダウンロードしたパッケージの検証を行うのに用いられる。
次に、Compileが目を向けるのはResourcesディレクトリである。このディレクトリには2つのファイルが入っている。1つは、Joeについて簡単に説明したDescriptionファイル、もう1つはこのアプリケーションが依存するすべてのライブラリを列挙したDependenciesファイルである。Dependenciesファイルに記されたライブラリがそのシステムにない場合、足りないライブラリの取得とインストールを行うかどうかもCompileが確認してくる。
アプリケーションのダウンロードと検証、依存関係の解決が終わると、Compileはアプリケーションの設定とインストールの作業に移る。Compileには「--configure-options」という特別なフラグがある。これを使えば、追加のパラメータをCompileから設定スクリプトに渡すことができる。例えば、Compile --configure-options="--enable-debug" joeのように用いる。
プログラムのコンパイルが完了すると、/Programsの下にそのアプリケーション専用のディレクトリができる。Joeの場合は/Programs/Joe/3.1である。さらに、CompileはjoeレシピのResourcesディレクトリを/Programs/Joe/3.1/の下にコピーし、そのディレクトリの中に以下の4つのファイルを新たに作成する。
パッケージのコンパイルを行ったアーキテクチャの種類を示すArchitectureファイル、パッケージのコンパイル後にldd(動的な依存関係を列挙するアプリケーション)によって追跡した依存関係を記録するBuildInformationファイル、パッケージ内の各ファイルのmd4sumを記録するFileHashファイル、FileHashのPGPシグネチャを記したFileHash.sigファイルである。GoboLinuxの主たる開発者の1人Lucas Villa氏の説明によると、誰がどのパッケージを作ったかがインストール時にわかるように、すべての貢献者に公開鍵の「リング」をリストしてもらったことからこのアイデアが生まれたという。
すべてのファイルおよびディレクトリの作成と配置が終わると、Compileがシステムで必要になるリンクのすべてを作成し、アプリケーションが使えるようになる。現在、GoboLinuxのリポジトリにはプログラム1,709種類のレシピ5,376件が収められているとVilla氏は言う。
