ふつう、プログラムは自分自身を /usr/local 以下のディレクトリに
インストールするようになっています。しかし、Debian システムにおいては、
/usr/local 以下はシステム管理者(とユーザ)の個人的利用のために
予約されているので、Debian パッケージはこのディレクトリを使っては
いけないことになっています。 このため、Makefile
に始まるプログラムを生成するための仕組を調べなければ いけません。Makefile
というのは make(1)
が
このプログラムを自動生成するために利用するスクリプトです。 Makefile
について詳しくは、「rules」ファイル, Section
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 に含まれるようになり、また附属文書やマニュアル ページをシステムに共通の場所で見ることがでるようになるわけです。 あなたがパッケージ化するプログラムがこの作業をきちんと実行できることを 確認しなければいけません。さらに、Debian パッケージを作成するためには、 プログラムを通常 debian/ ディレクトリの下に作成される 作業用のサブディレクトリ以下にインストールさせなければなりません。 この一時的なサブディレクトリには通常 debian/tmp という名前が 付けられていて、ここの中身をメンテナー用ツールがきちんとした 一つの .deb パッケージにまとめあげてくれます。 このディレクトリ以下にあるファイルは、パッケージを インストールした際にはすべてユーザのシステムへとインストールされます。 唯一の違いは dpkg がファイルをルートディレクトリ以下にインストールする ということだけです。
基本的に、パッケージを作成するためにはプログラムを debian/tmp に インストールすることが必要ですが、一方パッケージをインストールした後は ルートディレクトリ以下に置かれるため、その状態で正しく動作できるように しなければなりません。GNU autoconf を使用するプログラムの場合は、 dh_make がこの作業を行なうコマンドを自動的に設定してくれるため、 このセクションを読み飛ばしてしまってもいいくらい非常に簡単な作業です。 しかし、その他のプログラムについては、おそらく自分で Makefile を調べて 編集する必要があるでしょう。
以下は gentoo の Makefile 中の関連する部分です。
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? Note: if you change this, # gentoo will not find the icons as it starts up. You're going to # have to alter gentoo's icon path (in the config window, "Paths" # tab) to get it work. ICONS = /usr/local/lib/gentoo/
まず始めに、以下のような新しい行を 2 行挿入しましょう。
# Edited for Debian GNU/Linux. DESTDIR =
これはパッケージ構築の過程で必要になります(後の 「rules」ファイル, Section 4.4 の項で説明します)。
次に、 Makefile で最終的に生成されたバイナリがインストールされる 場所が指定されているところを探し、こんな風に変えます。
# Where to put binary on 'make install'? BIN = $(DESTDIR)/usr/X11R6/bin
しかしなぜこのディレクトリなんでしょう。他の所じゃだめでしょうか? だめです。 というのも Debian ではどこにプログラムをインストールするかいくつかの ルールが決められているからです。これは「ファイルシステム体系基準」 (/usr/share/doc/debian-policy/fhs)で指定されています。 Gentoo は X11 用のプログラムですので、/usr/local/bin ではなく /usr/X11R6/bin にインストールしなければなりません。 man ページは(大抵のプログラムには付属していますが、無い場合も あります。今回は無いのであとでひとつ書くことにします) /usr/local/man/man1 ではなく /usr/share/man/man1 にインストールしなければなりません。
さて次はちょっと厄介な問題です。例えばあなたが次の行を以下のように 変更したとします。
ICONS = $(DESTDIR)/usr/share/gentoo/
さて、ポリシーに合わせたのは良いのですが、今度は C のソースそのものを いじってアイコンを参照しているところすべてを修正しなければなりません。 でもどこを、そして何を探せばよいのでしょうか?修正すべき個所を探すには ( .c と .h という拡張子のファイルを含むすべてのディレクトリで) こんな風に実行すればよいでしょう。
grep -n usr/local/lib *.[ch]
Grep は usr/local/lib という文字列を探して、見つかったファイル名と それが何行めであるかを教えてくれるでしょう。そうしたらそれらのファイルを 編集して usr/local/lib という部分を usr/share に置き換えてやれば 良いのです。それでおしまい。usr/local/lib をあなたの指定した場所に 置き換えるだけです。 他の部分をいじってぐちゃぐちゃにしないよう気をつけましょう。 もしあなたが C プログラミングについてあまりご存知ないならば :-)
修正が終ったら、インストールターゲットを探しましょう(「install:」 で始まる行を探してみてください)。Makefile の先頭で 直接定義されているものを除いて、ディレクトリへの参照を すべて変更してください。 gentoo の元々のインストールターゲットはこんな感じでした。
# ----------------------------------------- Installation # You're going to have to be root to do this! install: gentoo install ./gentoo $(BIN) install icons $(ICONS) install gentoorc-example $(HOME)/.gentoorc
修正後はこんな風になります。
# ----------------------------------------- Installation # You're going to have to be root to do this! 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 $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
鋭い人なら私が「install:」の行の「gentoo」を「gentoo-target」に変えた のに気づくでしょう。 こういうのをバグフィックスというのですな。:-)
今のような、特に Debian パッケージだけに関係しない変更はすべて 上流メンテナに報告し、プログラムの次のリビジョンに反映してもらうように しましょう。注意すべきことは debian/* 以下のファイルを送る必要は無いと いうことです。それらを除いたパッチを用意して送りましょう。 また、あなたの修正を送る前に、Debian や Linux (あるいは Unix でさえも!) だけに通用するものでなく、できるだけ広範囲に通用するよう心がけることで、 上流の開発者にとっての負担を軽減するように努めましょう。
よくある問題としてもう一つ、ライブラリの問題があります。 ライブラリはしばしばプラットフォームごとに異なります。 例えば、 Makefile は Debian 上には、あるいはもしかしたら Linux 上 には存在しないライブラリへの参照すら含んでいるかもしれません。 その場合、その個所を探して、Debian 上に存在する互換のライブラリを 指すように変更してやらなければなりません。 一番良いのはそういう行をコメントにしておくことです。 そうしておけば、他の人が違うプラットフォーム上でコンパイルしようとして 何か問題が起こったときに、解決のヒントになるかも知れませんから。
そんなわけで、もしあなたのプログラムの Makefile (または Makefile.in) に以下のような部分があったら(そしてうまくコンパイルできなかったら)、
LIBS = -lcurses -lなんとか -lかんとか
こういう風に変えましょう。今度はきっと大丈夫です。
LIBS = -lncurses -lなんとか -lかんとか #LIBS = -lcurses -lなんとか -lかんとか
jrodin@jagor.srce.hr
mhatta@debian.or.jp