複数のプロジェクトツリーを一緒にして、何かのプログラムを開発 したいということがある。たとえば汎用的なライブラリモジュールをひと つのアーカイブバージョンとして開発してあり、その上位にそのライブラ リを利用した別のプロジェクトを作りたいような場合、プロジェクトを二 つの構成要素に分離して、組み合わせることができると便利だろう。ライ ブラリモジュールは別のプロジェクトでも使いまわすことができるからだ。 このようなプロジェクトをマルチツリープロジェクトと言う。
幸いなことに、マルチツリープロジェクトには良い例がある。GNU arch 自身が hackerlab というライブラリ上に作られており、hackerlab は tla とは別のアーカイブバージョンとして独立に管理されているから だ。この章では GNU arch のソースコード自身を例としてマルチツリープ ロジェクトの説明をしていく。その後、マルチツリープロジェクトの分岐 を作る方法について説明する。これがわかれば君は GNU arch 自身をハッ クすることができるようになる。
マルチツリープロジェクトはツリーの構成を記述しているだけの設 定用アーカイブバージョンと、その設定から読み込まれる要素となるアー カイブバージョンから構成される。設定用アーカイブバージョンには設定 ファイルがあり、どのアーカイブを、どのサブディレクトリに取り込むか を記述する。
GNU arch 本体の場合、アーカイブバージョン間の関係は以下のよ うになっている。
設定用アーカイブバージョン。以下のバージョンの構成方法についての 記述がある。
コンパイル/インストールするための汎用的なビルドシステム。
GNU arch 本体。必要に応じて hackerlab ライブラリを呼び出す。
GNU arch 本体から呼び出されるライブラリ。pika など他のプロジェク トでも利用される汎用的なもの。
各構成バージョンのversion 名が、1.0 とか 1.3 とかまちまちに なっていることに注意しよう。何度か言ってきたように、GNU arch は異 なるバージョン間のバージョン名には、そのままでは何の関係もない。マ ルチツリープロジェクトを展開するには、設定用アーカイブバージョンを 通常の方法で tla get する。マルチツリープロジェクトの一部として利 用されるアーカイブバージョンと言えども、単独で見た場合には普通のバー ジョンとなんら変わることはなく、バージョンに対してできるすべての操 作が可能であることに注意しよう:
$ tla get -A lord@emf.net--2004 dists--devo--1.0--patch-10 dists--devo--1.0 * from archive cached: lord@emf.net--2004/dists--devo--1.0--base-0 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-1 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-2 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-3 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-4 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-5 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-6 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-7 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-8 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-9 * patching for revision: lord@emf.net--2004/dists--devo--1.0--patch-10 * making pristine copy * tree version set lord@emf.net--2004/dists--devo--1.0 $ cd dists--devo--1.0 $ ls =ARCH-USERS-README =INSTALL =RELEASE-ID COPYING configs {arch} $
リビジョン番号は開発が進むにつれてもっと大きな番号になってい るかも知れない。設定用バージョンには、他のどのアーカイブバージョン をどのディレクトリに読み込むかについての定義ファイルがある。定義ファ イルはどのような名前にしても良いが、設定用バージョンのルートディレ クトリか、ルートディレクトリの下の ./configs ディレクトリ配下に置 かなくてはならないという決まりがある。定義ファイルは用途に応じた複 数個を用意することもでき、個数が多いようなら ./configs ディレクト リの下にまとめた方が整理しやすくなる。./configs ディレクトリの下に はサブディレクトリを作り、更に細かく定義ファイルを整理することもで きる。実際 GNU arch ではそのようにして ./configs/emf.net などのディ レクトリが作られている。
定義ファイルの内容は
ディレクトリ名 バージョン名
のような複数行からなる。空白だけの行、# で始まる行をコメント として利用することができる。GNU arch にある ./configs/emf.net/devo.tlaという定義ファイルは以下のようになってい る:
# Check out a tla arch distribution from the devo branches. Latest # revisions. # ./src lord@emf.net--2004/package-framework--devo--1.0 ./src/tla lord@emf.net--2004/tla--devo--1.3 ./src/hackerlab lord@emf.net--2004/hackerlab--devo--1.0 ./src/docs-tla lord@emf.net--2004/docs-tla--devo--1.0 ./src/docs-hackerlab lord@emf.net--2004/docs-hackerlab--devo--1.0 # tag: Tom Lord Sat Jun 14 14:54:15 2003 (emf.net/devo.tla) #
各行の意味は明らかだろう。./src というサブディレクトリの下に、 lord@emf.net--2004/package-framework--devo--1.0 というバージョンを 展開する、などの指定になる。実際の各バージョンの展開には tla build-config コマンドを使う:
$ tla build-config emf.net/devo.tla … $
余談だが、./configs ディレクトリにはこのほかにもさまざまな定義ファイル があり、Tom Lord が作った GNU arch 以外の公開されたソフトウェアは すべてこれらの定義ファイルから構築することができる。tla build-config が終了すれば、通常 tar ファイルとして配布される tla のソースコードが展開されていることがわかる。XXX 章に書いた方法を使 えばもちろんインストールできる。