[ 前のページ ] [ 目次 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 次のページ ]
開発元のソースを修正する具体的なやり方について、何から何まで説明するにはとても紙面が足りませんが、よくあるパターンとしては大体以下のようなものでしょう。
quilt
のセットアップ
quilt
プログラムはソースに対する Debian
パッケージ向けの修正を記録する、基本的な方法です。Debian
パッケージで使うには、多少デフォルトと違うのが望ましいので、以下のように
~/.quiltrc
を設定してください。[12]
d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then # Debian packaging case and unset $QUILT_PATCHES QUILT_PATCHES=debian/patches QUILT_PATCH_OPTS="--unified-reject-files" QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto" QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index" QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33" if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi fi
quilt
の使い方については、quilt(1)
と
/usr/share/doc/quilt/quilt.html
を参照してください。
開発元の Makefile
にエラーを見つけて、"install: gentoo"
の部分が "install: gentoo-target"
となっているべきだったとします。
install: gentoo install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
これを修正して、quilt
コマンドを使って
fix-gentoo-target.patch
として登録しましょう。[13]
$ mkdir debian/patches $ quilt new fix-gentoo-target.patch $ quilt add Makefile
Makefile
ファイルを次のように変更します。
install: gentoo-target install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
パッチを更新して debian/patches/fix-gentoo-target.patch
を作成するように quilt
に要求し、それから説明を追記します。
$ quilt refresh $ quilt header -e ... パッチの詳細
通常、プログラムは自分自身を /usr/local
サブディレクトリにインストールします。システム管理者
(もしくはユーザ) の個人用に予約されているため、Debian
パッケージではそのディレクトリを使わず、Filesystem
Hierarchy Standard (FHS
、/usr/share/doc/debian-policy/fhs/fhs-2.3.html
)
に従って /usr/bin/
サブディレクトリのようなシステムディレクトリを使わなくてはなりません。
プログラムのビルドを自動化するには、通常
make(1)
が使われており、make install
を実行すると、Makefile
のinstall
ターゲットによって希望する場所へ直接インストールされます。Debian
でバイナリパッケージを提供するために、ビルドシステムは実際のインストール先のかわりに、一時ディレクトリの下に作成されたファイルツリーのイメージへプログラムをインストールします。
(1) 普通のプログラムインストールと、(2) Debian
パッケージ作成のこれら二つの違いは、次の条件を満たす場合には、debhelper
パッケージが dh_auto_configure
と
dh_auto_install
のコマンドを使ってあまり意識せずに対応することができます。
Makefile
ファイルが GNU の規約に従って
$(DESTDIR) 変数
(/usr/share/doc/gnu-standards/standards.html#Makefile-Conventions
)
をサポートしていること。
そのソースが Filesystem Hierarchy Standard (FHS) に準拠していること。
GNU autoconf
を使っているプログラムは、自動的に GNU
規約に準拠するので、そのパッケージ作成はほとんど
自動化されます。こうしたことや他の経験からすると、debhelperl
パッケージはビルドシステムに煩わしい変更を加えることなく、約
90%
のパッケージで使えると推定されます。そのため、パッケージ作成は見かけほど複雑ではありません。
もし Makefile
ファイルを変更する必要があるなら、これら
$(DESTDIR)
変数をサポートするようにしましょう。Makefile では
$(DESTDIR)
変数は設定されておらず、プログラムのインストールに使われる各ファイルパスの前に付与されます。パッケージ作成スクリプトが
$(DESTDIR) を一時ディレクトリにセットします。
dh_auto_install
コマンドが使う一時ディレクトリは、単一バイナリパッケージでは
debian/package
のように指定されます。[14]一時ディレクトリに含まれているものはすべて、ユーザがあなたのパッケージをインストールする時に、そのシステムにインストールされます。唯一の違いは、dpkg
はファイルをルートディレクトリにインストールするということです。
パッケージの作成においては、プログラムは
debian/package
にインストールされますが、例えば .deb
パッケージからインストールされた時など、ルートディレクトリ以下に展開された場合も正しく動作できるようにしなければならない、ということを覚えておいてください。このため、ビルドシステムが
/home/me/deb/package-version/usr/share/package
といった特定のパスを示す文字列をパッケージファイルの中に記録しないようにしなければなりません。
gentoo
の Makefile
で該当する部分はこれです[15]:
# 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
へインストールされます。
バイナリ、アイコン、文書など、それぞれのファイルを保存すべきもっと正確な場所については、「Filesystem
Hierarchy Standard」 (/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 -nr -e 'usr/local/lib' --include='*.[c|h]' .
grep
がソースツリーを再帰的に検索し、該当箇所を見つけたらそのファイルの名前と検索対象の文字列が含まれる行番号とを表示します。
それらのファイルを編集し、該当行の usr/local/lib を usr/lib に置き換えてください。
$ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \ $(find . -type f -name '*.[c|h]')
他のコードを汚さないよう、注意してくださいね! :-)
修正が終ったら、インストールターゲットを探しましょう(「install:」
で始まる行を探してください。この方法でたいていうまくいきます)。Makefile
の先頭で直接定義されているものを除いて、ディレクトリへの参照をすべて変更してください。
開発元のバグ修正をした後、gentoo
の install
ターゲットはこうなっています:
install: gentoo-target install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
quilt
コマンドを使って、debian/patches/install.patch
としてこれを修正して記録しましょう。
$ quilt new install.patch $ quilt add Makefile
Debian パッケージ用に、これをエディタで次のように変更します:
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
ではこのコマンドは使われていませんでした。しかし、私たちは独自に空っぽの(あるいはまだ存在さえしていない)ディレクトリにインストールするわけですから、これらの各ディレクトリを毎回作成する必要があります。
ルールの最後には、開発元の作者が省略することの多い付加的な資料のインストールなど、他の作業を追加することもできます。
install -d $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
しっかりチェックをして、何も問題がないようであれば、quilt
でパッチを更新して debian/patches/install.patch
を作成し、パッチの説明を追記してください。
$ quilt refresh $ quilt header -e ... パッチの詳細
これで、一連のパッチができました。
上流のバグ修正: debian/patches/fix-gentoo-target.patch
Debian 固有のパッケージ上の変更:
debian/patches/install.patch
debian/patches/fix-gentoo-target.patch
のような、特に
Debian
パッケージだけに限定されない変更を行った場合、その内容を開発元のメンテナに報告するようにしてください。そうすれば、プログラムの次版に反映してもらうことができ、他のすべての利用者にとっても有益な結果をもたらすことになります。また、あなたの修正を送る前に、Debian
や Linux (あるいは Unix でさえも!)
に特化した修正にせず、移植性をもたせることも忘れないでください。そうすれば、あなたの変更はずっと採用されやすくなります。
開発元の作者へ debian/*
ファイルを送らなくてもよいことに注意してください。
よくある問題がもう一つあります:
ライブラリはしばしばプラットフォームごとに異なります。例えば、Makefile
は Debian
システム上に存在しないライブラリへの参照を含んでいるかもしれません。その場合には、Debian
上に存在する互換ライブラリを指すように変更し、同じ用を足すようにしてやらなければなりません。
そのため、プログラムの Makefile
(もしくは
Makefile.in
)
にこのような感じになっている行があった
(そしてプログラムがコンパイルできない) 場合 [16] は:
LIBS = -lcurses -lなんとか -lかんとか
これを debian/patches/ncurse.patch
として修正し、curses を ncurses
に変更しましょう。
$ quilt new ncurse.patch $ quilt add Makefile $ sed -i -e "s/-lcurses/-lncurses/g" Makefile $ quilt refresh $ quilt header -e ... パッチの詳細
[ 前のページ ] [ 目次 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 次のページ ]
Debian 新メンテナガイド
version 1.2.25, 2010-12-21 14:06:56 UTCjoy-mg@debian.org
nabetaro@debian.or.jp
yyatsuo@gmail.com
uwabami@gfd-dennou.org
lurdan@gmail.com
osamu@debian.org