[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>