[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Packaging Manual 第12章
早瀬です。Packaging Manual 第12章 です。
チェックをよろしくお願いします。
--
早瀬 茂規 (shayase@xxxxxxxxxxxxxxx)
<!-- ORIG
<chapt id="sharedlibs"><heading>Shared libraries
ORIG -->
<chapt id="sharedlibs"><heading>共有ライブラリ
</heading>
<p>
<!-- ORIG
Packages containing shared libraries must be constructed with
a little care to make sure that the shared library is always
available. This is especially important for packages whose
shared libraries are vitally important, such as the libc.
ORIG -->
共有ライブラリを含むパッケージの場合、その共有ライブラリがつねに
使用可能となるように多少の注意を払って作成しなければなりません。
とりわけ、libc などの重要な共有ライブラリのときは特に重要です。
</p>
<p>
<!-- ORIG
Firstly, your package should install the shared libraries
under their normal names. For example, the
<prgn>libgdbm1</prgn> package should install
<tt>libgdbm.so.1.7.3</tt> as
<tt>/usr/lib/libgdbm.so.1.7.3</tt>. The files should not be
renamed or relinked by any prerm or postrm scripts;
<prgn>dpkg</prgn> will take care of renaming things safely
without affecting running programs, and attempts to interfere
with this are likely to lead to problems.
ORIG -->
初めに、パッケージは、共有ライブラリを正しい名前で
インストールしなくてはなりません。例えば、パッケージ
<prgn>libgdbm1</prgn> は、<tt>libgdbm.so.1.7.3</tt> を、
<tt>/usr/lib/libgdbm.so.1.7.3</tt> としてインストールしなくては
なりません。prerm や postrm スクリプトからこれらのファイルの
名前を変更したり、再リンクしたりしてはいけません;
<prgn>dpkg</prgn> は、実行中のプログラムに影響がないように、
注意してファイル名の変更などの作業を実行しますし、これと
競合するような処理は,おそらく問題を起こすでしょう。
</p>
<p>
<!-- ORIG
Secondly, your package should include the symlink that
<prgn>ldconfig</prgn> would create for the shared libraries.
For example, the <prgn>libgdbm1</prgn> package should include
a symlink from <tt>/usr/lib/libgdbm.so.1</tt> to
<tt>libgdbm.so.1.7.3</tt>. This is needed so that
<prgn>ld.so</prgn> can find the library in between the time
<prgn>dpkg</prgn> installs it and <prgn>ldconfig</prgn> is run
in the <prgn>postinst</prgn> script. Futhermore, and <em>this
is very important</em>, the library must be placed before the
symlink pointing to it in the <tt>.deb</tt> file. This is so
that by the time <prgn>dpkg</prgn> comes to install the
symlink (overwriting the previous symlink pointing at an older
version of the library) the new shared library is already in
place. Currently the way to ensure the ordering is done
properly is to install the library in the appropriate
<tt>debian/tmp/.../lib</tt> directory before creating the
symlink, by putting the commands in the <tt>debian/rules</tt>
in the appropriate order.
ORIG -->
次に、パッケージは、<prgn>ldconfig</prgn> が、共有ライブラリ用に
作成するシンボリックリンクを含まなければいけません。例えば、
<prgn>libgdbm1</prgn> パッケージは、<tt>/usr/lib/libgdbm.so.1</tt>
から <tt>libgdbm.so.1.7.3</tt> へのシンボリックリンクを含んで
いなければいけません。これは、<prgn>dpkg</prgn> がパッケージを
インストールする時と、<prgn>ldconfig</prgn> が postinst から
実行されるときとの間に、<prgn>ld.so</prgn> が、そのライブラリを
見つけることができるようにするためです。さらに、
<em>これは重要なことですが</em>、ライブラリは、<tt>.deb</tt>
ファイル中のシンボリックリンクがはられる前に置かれていなければ
いけません。これは、<prgn>dpkg</prgn> が、すでに設置ずみの
新しい共有ライブラリを指すシンボリックリンクをインストールする
(古いバージョンのライブラリを指すシンボリックリンクを上書きします)
ことが問題なく行われるためです。現在のところ、
<tt>debian/rules</tt> に適切な順序でコマンドを書くことによって、
シンボリックリンクを作成するまえに、ライブラリを適切な
<tt>debian/tmp/.../lib</tt> に置くことで、この順序を保証します。
</p>
<!--
next Paragraph added to close Bug #5299, Guy Maor
-->
<p>
<!-- ORIG
Thirdly, the development package should contain a symlink for
the shared library without a version number. For example, the
<tt>libgdbm1-dev</tt> package should include a symlink from
<tt>/usr/lib/libgdm.so</tt> to <tt>libgdm.so.1.7.3</tt>. This
symlink is needed by <prgn>ld</prgn> when compiling packages
as it will only look for <tt>libgdm.so</tt> and
<tt>libgdm.a</tt> when compiling dynamically or statically,
respectively.
ORIG -->
三番目に、開発版 (development) パッケージは、バージョン番号なしの
共有ライブラリへのシンボリックリンクを含んでいなければいけません。
例えば、<tt>libgdbm1-dev</tt> パッケージは、
<tt>/usr/lib/libgdm.so</tt> から <tt>libgdm.so.1.7.3</tt> への
シンボリックリンクを含んでいなければいけません。
このシンボリックリンクは、パッケージをコンパイルするときに、
動的にリンクされるか静的にリンクされるかによって、
<tt>libgdm.so</tt> か <tt>libgdm.a</tt> を、<prgn>ld</prgn>が
探すことができるように必要となります。
</p>
<!--
next paragraph changed by Christian Schwarz (see policy weekly #6)
-->
<p>
<!-- ORIG
Any package installing shared libraries in a directory that's listed
in <tt>/etc/ld.so.conf</tt> or in one of the default library
directories of <prgn>ld.so</prgn> (currently, these are <tt>/usr/lib</tt>
and <tt>/lib</tt>) must call <prgn>ldconfig</prgn> in its <prgn>postinst</prgn>
script if and only if the first argument is `configure'. However, it
is important not to call <prgn>ldconfig</prgn> in the postrm or preinst
scripts in the case where the package is being upgraded (see <ref
id="unpackphase">), as <prgn>ldconfig</prgn> will see the temporary names
that <prgn>dpkg</prgn> uses for the files while it is
installing them and will make the shared library links point
to them, just before <prgn>dpkg</prgn> continues the
installation and removes the links!
ORIG -->
共有ライブラリを、<tt>/etc/ld.so.conf</tt> に書かれてある
ディレクトリか、<prgn>ld.so</prgn> によるデフォルトの
検索ディレクトリ (現在のところ、<tt>/usr/lib</tt> と
<tt>/lib</tt> です) のいずれかにインストールするパッケージは、
最初の引数が 'configure' であったとき,かつそのときのみ
<prgn>postinst</prgn> スクリプトの中で <prgn>ldconfig</prgn>
を呼ばなければなりません。しかし、パッケージを
アップグレードしようとしたときに、postrm と preinstの中で
<prgn>ldconfig</prgn> を呼ばないようにすることも重要です。
(インストール時、アップグレード時のパッケージ展開作業の
詳細については <ref id="unpackphase"> を参照ください)
それは、その場合には <prgn>dpkg</prgn> がインストール時に使う
一時的なファイル名を <prgn>ldconfig</prgn> が見てしまい、
それらへの共有ライブラリに対するリンクポイントを作ってしまう
ためです。そして、その直後、<prgn>dpkg</prgn> はインストールを
続行し、そのリンク先を削除してしまいます !
</p>
<!--
moved from section 2.2 , DMorris
-->
<!-- ORIG
<sect id="shlibs"><heading>The <tt>shlibs</tt> File Format
ORIG -->
<sect id="shlibs"><heading><tt>shlibs</tt> ファイルの書式
</heading>
<p>
<!-- ORIG
This file is for use by <prgn>dpkg-shlibdeps</prgn> and is
required when your package provides shared libraries.
ORIG -->
このファイルは、<prgn>dpkg-shlibdeps</prgn> によって使用され、
パッケージが共有ライブラリをインストールするときに必要と
なります。
</p>
<p>
<!-- ORIG
Each line is of the form:
ORIG -->
それぞれの行はつぎのものから構成されます。
<example>
<var>library-name</var> <var>version-or-soname</var> <var>dependencies ...</var>
</example>
</p>
<p>
<!-- ORIG
<var>library-name</var> is the name of the shared library,
for example <tt>libc5</tt>.
ORIG -->
<var>library-name</var> は、共有ライブラリの名前です。
例えば、<tt>libc5</tt> です。
</p>
<p>
<!-- ORIG
<var>version-or-soname</var> is the soname of the library -
ie, the thing that must exactly match for the library to be
recognised by <prgn>ld.so</prgn>. Usually this is major
version number of the library.
ORIG -->
<var>version-or-soname</var> は、ライブラリの
.so ファイル名です。これは、<prgn>ld.so</prgn> によって
認識されるためのライブラリと正確に一致していなければ
いけません。ふつうは、ライブラリのメジャーバージョン番号です。
</p>
<p>
<!-- ORIG
<var>dependencies</var> has the same syntax as a dependency
field in a binary package control file. It should give
details of which package(s) are required to satisfy a binary
built against the version of the library contained in the
package. See <ref id="depsyntax">.
ORIG -->
<var>dependencies</var> は、バイナリパッケージ制御ファイル中の
dependency フィールドと同じ書式です。これは、パッケージに
含まれるライブラリのバージョンに対してバイナリを構築した
ときに、どのパッケージが必要とされるのか、詳細を
記してあります。<ref id="depsyntax"> をご覧になってください。
</p>
<p>
<!-- ORIG
For example, if the package <tt>foo</tt> contains
<tt>libfoo.so.1.2.3</tt>, where the soname of the library is
<tt>libfoo.so.1</tt>, and the first version of the package
which contained a minor number of at least <tt>2.3</tt> was
<var>1.2.3-1</var>, then the package's <var>shlibs</var>
could say:
ORIG -->
例えば、パッケージ <tt>foo</tt> が、<tt>libfoo.so.1.2.3</tt>
を含むとします。この時、ライブラリの .so ファイル名は、
<tt>libfoo.so.1</tt> となります。そして、
マイナーバージョンが、<tt>2.3</tt> であるような最初の
パッケージのバージョンは、<var>1.2.3-1</var> となります。
そこで、このパッケージの、<var>shlibs</var> には以下のように
書かれます。
<example>
libfoo 1 foo (>= 1.2.3-1)
</example>
</p>
<p>
<!-- ORIG
The version-specific dependency is to avoid warnings from
<prgn>ld.so</prgn> about using older shared libraries with
newer binaries.</p>
ORIG -->
特定のバージョン番号への依存関係は、古いバージョンの
共有ライブラリで新しいバイナリを実行しようとした際に、
<prgn>ld.so</prgn> が出力するウォーニングを回避するのに
役立ちます。</p>
</sect>
<!-- ORIG
<sect><heading>Further Technical information on
<tt>shlibs</tt></heading>
ORIG -->
<sect><heading><tt>shlibs</tt> に関する技術情報の詳細</heading>
<!--
following section mostly provided by Heiko Schlittermann
edited by DMorris
-->
<!-- ORIG
<sect1><heading><em>What</em> are the <tt>shlibs</tt> files?
ORIG -->
<sect1><heading><tt>shlibs</tt> ふぁいるとは<em>何か</em> ?
</heading>
<p>
<!-- ORIG
The <tt>debian/shlibs</tt> file provides a way of checking
for shared library dependencies on packaged binaries.
They are intended to be used by package maintainers to
make their lives easier.
ORIG -->
バイナリパッケージの共有ライブラリへの依存性のチェックを
行うとき、<tt>debian/shlibs</tt> ファイルを用いて行うことが
できます。これを使えば、パッケージメンテナは、より快適な
生活が送れるでしょう。
</p>
<p>
<!-- ORIG
Other <tt>shlibs</tt> files that exist on a Debian system are
ORIG -->
Debian システム上にある他の <tt>shlibs</tt> ファイルを以下に
列挙します。
<list>
<item> <p><tt>/etc/dpkg/shlibs.default</tt></p></item>
<item> <p><tt>/etc/dpkg/shlibs.override</tt></p></item>
<item> <p><tt>/var/lib/dpkg/info/*.shlibs</tt></p></item>
<item> <p><tt>debian/shlibs.local</tt></p></item>
</list>
<!-- ORIG
These files are used by <prgn>dpkg-shlibdeps</prgn> when
creating a binary package.</p>
ORIG -->
バイナリパッケージの構築時、<prgn>dpkg-shlibdeps</prgn> が
これらのファイルを使います。</p>
</sect1>
<!-- ORIG
<sect1><heading><em>How</em> does <prgn>dpkg-shlibdeps</prgn>
work?
ORIG -->
<sect1><heading><prgn>dpkg-shlibdeps</prgn> は、
<em>どのようにして</em>働くのか ?
</heading>
<p>
<!-- ORIG
<prgn>dpkg-shlibdeps</prgn> calls <prgn>ldd</prgn> to
determine the shared libraries used by the compiled
binaries passed through its command line.
ORIG -->
<prgn>dpkg-shlibdeps</prgn> は、<prgn>ldd</prgn>
を呼び出します。そして、コマンドラインから入力された
コンパイル済のバイナリがどの共有ライブラリを使っているか
調べます。
</p>
<p>
<!-- ORIG
For each shared library, <prgn>dpkg-shlibdeps</prgn> needs to know
<list compact="compact">
<item><p>the package containing the library, and</p></item>
<item><p>the library version number,</p></item>
</list> <p>
it scans the following files in this order.
ORIG -->
各共有ライブラリに対して、<prgn>dpkg-shlibdeps</prgn> は
以下の情報を把握する必要があり、
<list compact="compact">
<item><p>ライブラリを含んでいるパッケージ、および</p></item>
<item><p>ライブラリのバージョン番号、</p></item>
</list> <p>
そのために以下のファイルを記述順に走査します。
<enumlist compact="compact">
<item><p><tt>debian/shlibs.local</tt></p></item>
<item><p><tt>/etc/dpkg/shlibs.override</tt></p></item>
<item><p><tt>/var/lib/dpkg/info/*.shlibs</tt></p></item>
<item><p><tt>/etc/dpkg/shlibs.default</tt></p></item>
</enumlist></p>
</sect1>
<!-- ORIG
<sect1><heading><em>Who</em> maintains the various
<tt>shlibs</tt> files?
ORIG -->
<sect1><heading>多くの <tt>shlibs</tt> ファイルを<em>誰が</em>
管理しているのか ?
</heading>
<p>
<list compact="compact">
<item>
<!-- ORIG
<p><tt>/etc/dpkg/shlibs.default</tt> - the maintainer
of dpkg</p>
ORIG -->
<p><tt>/etc/dpkg/shlibs.default</tt> - dpkg の管理者</p>
</item>
<item>
<p>
<tt>/var/lib/dpkg/info/<var>package</var>.shlibs</tt>
<!-- ORIG
- the maintainer of each package</p>
ORIG -->
- それぞれのパッケージ開発者</p>
</item>
<item>
<p>
<!-- ORIG
<tt>/etc/dpkg/shlibs.override</tt> - the local
system administrator</p>
ORIG -->
<tt>/etc/dpkg/shlibs.override</tt> - ローカルの
システム管理者</p>
</item>
<item>
<!-- ORIG
<p><tt>debian/shlibs.local</tt> - the maintainer of
the package
ORIG -->
<p><tt>debian/shlibs.local</tt> - パッケージ開発者
</p>
</item>
</list>
<!-- ORIG
The <tt>shlibs.default</tt> file is managed by
<prgn>dpkg</prgn>. The entries in <tt>shlibs.default</tt>
that are provided by <prgn>dpkg</prgn> are just there to
fix things until the shared library packages all have
<tt>shlibs</tt> files.
ORIG -->
<tt>shlibs.default</tt> は、<prgn>dpkg</prgn> によって
管理されています。<prgn>dpkg</prgn> によって提供される
<tt>shlibs.default</tt> の各エントリは、
共有ライブラリパッケージすべてが、それぞれの <tt>shlibs</tt>
ファイルを持つようになるまで、デフォルトの決定のために
置かれています。
</p>
</sect1>
<!-- ORIG
<sect1><heading><em>How</em> to use <prgn>dpkg-shlibdeps</prgn> and
the <tt>shlibs</tt> files?
ORIG -->
<sect1><heading><prgn>dpkg-shlibdeps</prgn> と <tt>shlibs</tt>
ファイルを<em>どのようにして</em>使うか ?
</heading>
<!-- ORIG
<sect2><heading>If your package doesn't provide a shared
library
ORIG -->
<sect2><heading>あなたのパッケージが共有ライブラリを含んで
いないとき
</heading>
<p>
<!-- ORIG
Put a call to <prgn>dpkg-shlibdeps</prgn> into your
<tt>debian/rules</tt> file. If your package contains
only binaries (e.g. no scripts) use:
ORIG -->
<tt>debian/rules</tt> ファイル中に <prgn>dpkg-shlibs</prgn>
の呼出しルーチンを置いてください。バイナリだけを含んだ
パッケージ (つまり、スクリプトを含まない) の場合、以下を
使用してください。
<example>
dpkg-shlibdeps debian/tmp/usr/bin/* debian/tmp/usr/sbin/*
</example>
<!-- ORIG
If <prgn>dpkg-shlibdeps</prgn> doesn't complain, you're
done. If it does complain you might need to create your
own <tt>debian/shlibs.local</tt> file.</p>
ORIG -->
<prgn>dpkg-shlibdeps</prgn> が何も文句を言って
こなかったなら、成功です。もし、エラーやウォーニングなどが
出力されたのであれば、たぶん、それ用の
<tt>debian/shlibs.local</tt> を作成する必要が
あるでしょう。</p>
</sect2>
<!-- ORIG
<sect2><heading>If your package provides a shared library
ORIG -->
<sect2><heading>あなたのパッケージが共有ライブラリを
含んでいるとき
</heading>
<p>
<!-- ORIG
Create a <tt>debian/shlibs</tt> file and let
<tt>debian/rules</tt> install it in the control area:
ORIG -->
<tt>debian/shlibs</tt> ファイルを作成して、
<tt>debian/rules</tt> によってそれを制御領域に
インストールしてください。
<example>
install -m644 debian/shlibs debian/tmp/DEBIAN
</example>
<!-- ORIG
If your package contains additional binaries see above.
ORIG -->
もし、あなたのパッケージが他のバイナリを含んでいるので
あれば、上の記述を参照してください。
</p>
</sect2>
</sect1>
<!-- ORIG
<sect1><heading><em>How</em> to write
<tt>debian/shlibs.local</tt>
ORIG -->
<sect1><heading><tt>debian/shlibs.local</tt> を
<em>どのように</em>書くのか
</heading>
<p>
<!-- ORIG
This file is intended only as a <em>temporary</em> fix if
your binaries depend on a library which doesn't provide
its own <tt>/var/lib/dpkg/*.shlibs</tt> file yet.
ORIG -->
あなたの作ったパッケージが、自身の
<tt>/var/lib/dpkg/*.shlibs</tt> をまだ提供していない
ライブラリに依存しているとき、この問題の
<em>一時的</em>解決のためにこのファイルはあります。
</p>
<p>
<!-- ORIG
Let's assume you are packaging a binary <tt>foo</tt>. Your
output in building the package might look like this.
ORIG -->
バイナリ <tt>foo</tt> をパッケージ構築中だとします。
構築中のメッセージが、例えば以下のようになっていて、
<example>
$ ldd foo
libbar.so.1 => /usr/X11R6/lib/libbar.so.1.0
libc.so.5 => /lib/libc.so.5.2.18
libX11.so.6 => /usr/X11R6/lib/libX11.so.6.0
</example>
<!-- ORIG
And when you ran <prgn>dpkg-shlibdeps</prgn>
ORIG -->
そして、 <prgn>dpkg-shlibdeps</prgn> を実行すると、
以下のようになります。
<example>
$ dpkg-shlibdeps -o foo
dpkg-shlibdeps: warning: unable to find dependency information
for shared library libbar
(soname 1, path /usr/X11R6/lib/libbar.so.1.0, dependency field Depends)
shlibs:Depends=elf-x11r6lib, libc5 (>= 5.2.18)
</example>
<!-- ORIG
The <prgn>foo</prgn> binary depends on the
<prgn>libbar</prgn> shared library, but no package seems
to provide a <tt>*.shlibs</tt> file in
<tt></tt>var/lib/dpkg/info/. Let's determine the package
responsible:
ORIG -->
<prgn>foo</prgn> バイナリは、<prgn>libbar</prgn>
共有ライブラリに依存していますが、
<tt>var/lib/dpkg/info/</tt> にある <tt>*.shlibs</tt>
ファイルには、このライブラリを提供したパッケージの名前は
ありません。というわけで、責任をとるパッケージを
決定しましょう。
</p>
<p>
<example>
$ dpkg -S /usr/X11R6/lib/libbar.so.1.0
bar1: /usr/X11R6/lib/libbar.so.1.0
$ dpkg -s bar1 | grep Version
Version: 1.0-1
</example>
<!-- ORIG
This tells us that the <prgn>bar1</prgn> package, version
1.0-1 is the one we are using. Now we can create our own
<tt>debian/shlibs.local</tt> to temporarly fix the above
problem. Include the following line into your
<tt>debian/shlibs.local</tt> file.
ORIG -->
どうやら、<prgn>bar1</prgn> のバージョン 1.0-1 が
現在我々の使用しているものということのようです。
ここで、この問題を一時的に解決するために、自分専用の
<tt>debian/shlibs.local</tt> を作ります。以下の行を、
<tt>debian/shlibs.local</tt> 中に含めてください。
<example>
libbar 1 bar1 (>= 1.0-1)
</example>
<!-- ORIG
Now your package build should work. As soon as the
maintainer of <prgn>libbar1</prgn> provides a
<tt>shlibs</tt> file, you can remove your
<tt>debian/shlibs.local</tt> file.
ORIG -->
さあ、これであなたのパッケージ構築作業はうまくいくはずです。
<prgn>libbar1</prgn> のパッケージメンテナが、それ用の
<tt>shlibs</tt> ファイルを提供したときには、あなたの
<tt>debian/shlibs.local</tt> ファイルは削除してもよいです。
</p>
</sect1>
</sect>
</chapt>