ふつう、プログラムは自分自身を /usr/local 以下のディレクトリに
インストールするようになっています。しかし、Debian システムにおいては、
/usr/local 以下はシステム管理者(とユーザ)の個人的利用のために
予約されているので、Debian パッケージはこのディレクトリを使っては
いけないことになっています。 このため、(通常は Makefile に始まる)
プログラムを生成するための 仕組を調べる必要があります。 Makefile というのは
make(1)
がこのプログラムを
自動生成するために利用するスクリプトです。 Makefile についての詳細は、「rules」ファイル, 第 4.4
節を参照してください。
もしあなたのプログラムが GNU automake(1)
や
autoconf(1)
を使っているのでしたら、ソースに それぞれ Makefile.am
や Makefile.in などのファイルが含まれているはずです。
このような場合には、Makefile ではなく、これらのファイルを変更する必要が
あります。何故なら、automake を実行すると Makefile.am から生成された
情報によって Makefile.in が上書きされ、また ./configure を実行すると
Makefile.in から生成した情報によって Makefile が上書きされるからです。
Makefile.am の編集には、automake の知識がすこしばかり必要になります。
これについては info automake で調べることができます。 一方、Makefile.in
の編集は普通の Makefile の編集とほぼ同じです。
ただちょっと変数に気をつければいいだけです。変数というのは例えば @CFLAGS@ や
@LN_S@ などのように「@」で囲まれた文字列のことです。 これらの変数は ./configure
を実行した際に実際の内容に置き換えられます。
修正の具体的なやり方について何から何まで説明するにはとても 紙面が足りませんが、よくあるパターンとしては大体以下のようなものでしょう。
ほとんどのプログラムは自分自身をシステムの既存のディレクトリ構造に インストールするための仕組を備えています。これによってインストールされた バイナリがユーザの $PATH に含まれるようになり、また附属文書やマニュアル ページをシステムに共通の場所で見ることができるわけです。 しかし、もしこのようにしてしまうと、新しくインストールされた プログラムはシステム上に既に存在している他のすべてのプログラムの 中に混ざってしまい、パッケージ作成のためのツールにとって あなたのパッケージに含まれるファイルとそうでないファイルを 見分けることが非常に難しくなります。
従って、何か別の、例えば以下のような方法を採用する必要があります。 プログラムを作業用の一時的なサブディレクトリ以下にインストールし、 メンテナー用ツールを使ってそのサブディレクトリの内容をちゃんと 動作する .deb パッケージに仕立て上げる、という方法です。 このディレクトリ以下にあるファイルは、パッケージをインストール した際にすべてユーザのシステムへとインストールされます。 唯一の違いは dpkg がファイルをルートディレクトリ以下に インストールするということだけです。
通常、この一時的なディレクトリは、展開されたソースツリーの 中にある debian/
ディレクトリの下に作成されます。 またこのサブディレクトリは
debian/tmp
とか debian/パッケージ名
といった名前で呼ばれる ことが多いです。
パッケージを作成するためにはプログラムを debian/パッケージ名 に インストールすることが必要ですが、一方 .deb パッケージをインストール した後は、ルートディレクトリ以下に展開されるため、その状態で正しく 動作できるようにしなければならない、ということを覚えておいてください。 このため、ビルドシステムが /home/me/deb/gentoo-0.9.12/usr/share/gentoo といった特定のパスを示す文字列をパッケージファイルの中に 記録してしまわないよう、注意しなければなりません。
GNU autoconf を使用するプログラムの場合は、これはとても 簡単な作業です。こうしたプログラムでは、 (例えば) /usr が本当の置き場所だということを残したままで、 任意のサブディレクトリにインストールできるような makefile が デフォルトで作成されます。 あなたのプログラムが autoconf を使っている場合、dh_make が それを検出して、こうした作業を行なうコマンドを自動的に設定 してくれるため、このセクションを読み飛ばしてしまってもいい くらい非常に簡単な作業です。 しかし、その他のプログラムについては、おそらく自分で Makefile を調べて 編集する必要があるでしょう。
以下は gentoo の Makefile 中の関連する部分です。
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? ICONS = /usr/local/share/gentoo
オリジナルの設定では、それぞれのファイルを /usr/local
以下に
インストールするようになっていることがわかります。
これらのパスを以下のように変更してください:
# Where to put binary on 'make install'? BIN = $(DESTDIR)/usr/bin # Where to put icons on 'make install'? ICONS = $(DESTDIR)/usr/share/gentoo
しかしなぜこのディレクトリなんでしょう。他の所じゃだめでしょうか? だめです。
なぜなら Debian パッケージの場合、/usr/local
以下へファイルを
インストールすることは絶対に無いと決まっているからです。このディレクトリ
以下は個別のシステムの管理者が使うために予約されています。 Debian
システム上でパッケージからインストールされるファイルは その代わりに
/usr
へインストールされます。
バイナリ、アイコン、文書など、それぞれのファイルを 保存すべき場所については、 「ファイルシステム体系基準」 (/usr/share/doc/debian-policy/fhs を参照) の中でより正確に規定されています。もしまだ読んだことが無ければ、 ざっと目を通して、あなたのパッケージに関係しそうな箇所をきちんと 読んでおくことをお勧めします。
そういうわけで、バイナリは /usr/local/bin ではなく /usr/bin へ インストールしなければなりませんし、マニュアルページは /usr/local/man/man1 の代わりに /usr/share/man/man1 へ インストールする必要があります。 ここで gentoo の makefile にはマニュアルページに関する記述が まったく無いことに注意してください。Debian ポリシーでは すべてのプログラムがそれぞれマニュアルを用意しなければならないと 定めていますから、後で gentoo のマニュアルを作成して、それを /usr/share/man/man1 以下へインストールすることにします。
プログラムの中には、このようなパスを定義するための makefile 変数を 使っていないものもあります。このような場合、C のソースそのものを いじって、指定された場所を使うように修正しなければなりません。 でもどこを、そして何を探せばよいのでしょうか? 以下のコマンドを実行すれば該当箇所を見つけることができます。
grep -rn usr/local/lib *.[ch]
これを使うと、grep がソースツリーを再帰的に検索し、 該当箇所を見つけたらそのファイルの名前と検索対象の文字列 (ここでは usr/local/lib)を含む行とを表示します。
見つかったファイルを編集して usr/local/ という部分を usr/ に 置き換えてください。これでもう作業完了です。 他の部分をいじってぐちゃぐちゃにしないよう気をつけましょう。:-)
修正が終ったら、インストールターゲットを探しましょう(「install:」 で始まる行を探してください。この方法でたいていうまくいきます)。 Makefile の先頭で直接定義されているものを除いて、ディレクトリへの参照を すべて変更してください。 gentoo の元々のインストールターゲットはこんな感じでした。
install: gentoo install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
修正後はこんな風になります。
install: gentoo-target install -d $(BIN) $(ICONS) $(DESTDIR)/etc install ./gentoo $(BIN) install -m644 icons/* $(ICONS) install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
たぶんお気づきになったでしょうが、変更後はこのルールの 先頭に install -d コマンドが追加されています。 普通「make install」を実行するようなシステムなら /usr/local/bin や その他のディレクトリは既にシステム上に存在しているでしょうから、 もともとの makefile ではこのコマンドは使われていませんでした。 しかし、Debian パッケージを作成する場合には、空っぽの(あるいは まだ存在さえしていない)ディレクトリにインストールするわけですから、 これらのディレクトリのそれぞれを毎回作成する必要があります。
ルールの最後には、上流作者が省略することの多い付加的な資料の インストールなど、他の作業を追加することもできます。
install -d $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
鋭い人なら私が「install:」の行の「gentoo」を「gentoo-target」に変えた のに気づくでしょう。 こういうのをバグフィックスというのですな。:-)
今のような、特に Debian パッケージだけに限定されない変更を行った場合、 毎回その内容を上流メンテナに報告し、プログラムの次のリビジョンに反映して もらうことで、他のすべての利用者にとっても有益な結果をもたらすように しましょう。 また、あなたの修正を送る前に、Debian や Linux (あるいは Unix でさえも!) だけに通用するものでなく、できるだけ広範囲に通用するよう心がけることで、 上流の開発者があなたの変更を採用しやすくなるように努めましょう。
上流開発者に debian/ 以下のファイルを送る必要はありません。 注意してください。
よくある問題としてもう一つ、ライブラリの問題があります。 ライブラリはしばしばプラットフォームごとに異なります。 例えば、 Makefile は Debian システム上に存在しない ライブラリへの参照すら含んでいるかもしれません。 その場合には、Debian 上に存在する互換のライブラリを 指すように変更してやらなければなりません。
そんなわけで、もしあなたのプログラムの Makefile (または Makefile.in) に以下のような部分があったら(そしてうまくコンパイルできなかったら)、
LIBS = -lcurses -lなんとか -lかんとか
こういう風に変えましょう。今度はきっと大丈夫です。
LIBS = -lncurses -lなんとか -lかんとか
Debian 新メンテナガイド
version 1.2, 6 April 2002.joy-mg@debian.org
mhatta@debian.or.jp
sano@debian.org