[ 前のページ ] [ 目次 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 次のページ ]


Debian 新メンテナガイド
第 3 章 - ソースコードの変更


開発元のソースを修正する具体的なやり方について、何から何まで説明するにはとても紙面が足りませんが、よくあるパターンとしては大体以下のようなものでしょう。


3.1 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を参照してください。


3.2 開発元のバグを修正する

開発元の 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
     ... パッチの詳細

3.3 指定した場所へファイルをインストールする

通常、プログラムは自分自身を /usr/local サブディレクトリにインストールします。システム管理者 (もしくはユーザ) の個人用に予約されているため、Debian パッケージではそのディレクトリを使わず、Filesystem Hierarchy Standard (FHS/usr/share/doc/debian-policy/fhs/fhs-2.3.html) に従って /usr/bin/ サブディレクトリのようなシステムディレクトリを使わなくてはなりません。

プログラムのビルドを自動化するには、通常 make(1) が使われており、make install を実行すると、Makefileinstall ターゲットによって希望する場所へ直接インストールされます。Debian でバイナリパッケージを提供するために、ビルドシステムは実際のインストール先のかわりに、一時ディレクトリの下に作成されたファイルツリーのイメージへプログラムをインストールします。

(1) 普通のプログラムインストールと、(2) Debian パッケージ作成のこれら二つの違いは、次の条件を満たす場合には、debhelper パッケージが dh_auto_configuredh_auto_install のコマンドを使ってあまり意識せずに対応することができます。

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 といった特定のパスを示す文字列をパッケージファイルの中に記録しないようにしなければなりません。

gentooMakefile で該当する部分はこれです[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 へインストールする必要があります。ここで gentooMakefile には、マニュアルページに関する記述がまったく無いことに注意してください。Debian ポリシーでは、すべてのプログラムがそれぞれマニュアルを用意しなければならないと定めていますから、後で gentoo のマニュアルを作成して、それを /usr/share/man/man1 以下へインストールすることにします。

プログラムの中には、このようなパスを定義するための Makefile 変数を使っていないものもあります。このような場合、C のソースそのものをいじって、指定された場所を使うように修正しなければなりません。でもどこを探し、何を確認すればよいのでしょうか? 以下のコマンドを実行すれば該当箇所を見つけることができます。

     $ grep -nr -e 'usr/local/lib' --include='*.[c|h]' .

grep がソースツリーを再帰的に検索し、該当箇所を見つけたらそのファイルの名前と検索対象の文字列が含まれる行番号とを表示します。

それらのファイルを編集し、該当行の usr/local/libusr/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
     ... パッチの詳細

これで、一連のパッチができました。

  1. 上流のバグ修正: debian/patches/fix-gentoo-target.patch

  1. Debian 固有のパッケージ上の変更: debian/patches/install.patch

debian/patches/fix-gentoo-target.patch のような、特に Debian パッケージだけに限定されない変更を行った場合、その内容を開発元のメンテナに報告するようにしてください。そうすれば、プログラムの次版に反映してもらうことができ、他のすべての利用者にとっても有益な結果をもたらすことになります。また、あなたの修正を送る前に、Debian や Linux (あるいは Unix でさえも!) に特化した修正にせず、移植性をもたせることも忘れないでください。そうすれば、あなたの変更はずっと採用されやすくなります。

開発元の作者へ debian/* ファイルを送らなくてもよいことに注意してください。


3.4 ライブラリの差異

よくある問題がもう一つあります: ライブラリはしばしばプラットフォームごとに異なります。例えば、Makefile は Debian システム上に存在しないライブラリへの参照を含んでいるかもしれません。その場合には、Debian 上に存在する互換ライブラリを指すように変更し、同じ用を足すようにしてやらなければなりません。

そのため、プログラムの Makefile (もしくは Makefile.in) にこのような感じになっている行があった (そしてプログラムがコンパイルできない) 場合 [16] は:

     LIBS = -lcurses -lなんとか -lかんとか

これを debian/patches/ncurse.patch として修正し、cursesncurses に変更しましょう。

     $ 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 UTC

Josip Rodin joy-mg@debian.org

翻訳:倉澤 望 nabetaro@debian.or.jp
翻訳:八津尾 雄介 yyatsuo@gmail.com
翻訳:佐々木 洋平 uwabami@gfd-dennou.org
翻訳:倉敷 悟 lurdan@gmail.com
翻訳:青木 修 osamu@debian.org