チトンの答えに触発されて掘り下げ、試行錯誤を繰り返した後、私はついに自分の問題の解決策を見つけました。dpkg-gencontrol は、実行可能ファイルからパッケージの依存関係を推測するツールではなく、dpkg-shlibdeps であることが判明しました。ただし、2 つのプログラムがパッケージを生成できるようにするには、慎重にセットアップする必要があります。読む....
実行dpkg-shlibdeps -O <executable>
すると、その実行可能ファイルを実行するためにインストールする必要があるパッケージとバージョンのリストが表示されます。完全。ほとんど。理想的には、dpkg-gencontrol はこれを処理に使用できます。これは、変数置換機能を使用して実行できると主張しています。
これをスムーズに行うために、Debian パッケージ ツールが期待するものと一致するディレクトリ構造を作成する必要がありました。基本的には次のようになります。
my_project_directory/
main.c (or other source code, etc.)
debian/
changelog (created by hand; see below)
control (this is basically a template, created by hand; see below)
files (created by dpkg-gencontrol)
substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol)
tmp/ (tmp is the root of the target system's filesystem)
path/
to/
my/
project/
executable_1 (this will be installed at /path/to/my/project)
executable_2 (this, too)
var/
www/
index.php (this will be installed at /var/www on target systems)
DEBIAN/ (create this by hand)
control (created by dpkg-gencontrol and used in the final package)
Debian パッケージ ツールは、debian/tmp/ の下にあるすべてのファイルの所有者とグループを保持することに注意してください。したがって、インストール時にルートまたは他のユーザーが所有するファイルが必要な場合は、注意が必要です。1 つのオプションは、debian ディレクトリ ツリーをルートとして準備し、所有者を好きなように設定することです。root として実行したくない場合、または許可されていない場合は、別の方法があります。
chown などを呼び出して、好きなように所有権を調整するスクリプトを作成します。最後の行はdpkg-deb -b debian/tmp .
(.deb パッケージをビルドします。例については以下を参照してください)。次のように、別の Debian ツールである fakeroot を介して実行しますfakeroot ./fix_ownerships_and_build.sh
。Fakeroot を使用すると、root のように実際に変更を加えることなく、プログラムを root であるかのように動作させることができます。これは、まさにこのシナリオのために作成されました。
dpkg-gencontrol が「最初のブロックにソース フィールドがありません」というエラーを生成する理由を調べ、その Perl ソースを読み取るところまで調べました。よくあることですが、何をすべきかを知るのに十分なコンテキストを提供せずに、エラー コードが正確です: 制御ファイルには、最初の (2 つの) ブロックに "source" と呼ばれるフィールドが実際に必要です。
Debian パッケージには、ソースとバイナリの 2 種類があります。コンパイル済みの実行可能ファイルを入れたいだけなので、バイナリが必要だと思っていましたが、それを機能させることができませんでした。ソース パッケージを試し、コントロール ファイルにソース フィールドを追加しました。これにより、「最初のブロックにソース フィールドがありません」というエラーは解消されましたが、別のエラーが発生しました。ドキュメントをよく読んでみると、ソース パッケージの制御ファイルには2 つの「段落」が必要であることがわかりました。制御ファイルを次のように変更すると、(ほぼ) 動作するようになりました。
Source: my-package
Maintainer: Joe Coder <joe@coder.com>
Package: my-package
Priority: optional
Architecture: amd64
Depends: ${shlibs:Depends}, apache2, php5
Description: The My-Package System
A longer description that runs to the end of one line and then
extends to another line.
まだ欠けていたのは、変更ログ ファイルでした。これは、重要な変更、バージョン番号、日付、責任者など、パッケージのリリース履歴を保持するファイルです。私は通常、そのようなものを独自の形式で維持しており、これを厳密な Debian 変更ログ形式に慎重に変換しました。何らかの理由で、変更ログが最終パッケージから省略されたため、履歴ファイルをそのままにして、代わりに次のようなプレースホルダーを使用しました。
my-package (1.0) unstable; urgency=low
* placeholder changelog to satisfy dpkg-gencontrol
-- Joe Coder <joe@coder.com> Thu, 3 Nov 2011 16:49:00 -0700
* を含む行の先頭の 2 つのスペース、-- を含む行の先頭の 1 つのスペース、および電子メール アドレスと日付の間の 2 つのスペースは必須です。はい、正確である必要はありませんが、日付はタイムゾーンなどすべて正確である必要があります。
上記のように設定された debian ディレクトリ ツリーを使用してすべてをまとめると、パッケージのビルドに必要な一連のコマンドは次のようになります。
dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \
debian/tmp/path/to/my/project/executable_2
dpkg-gencontrol -v1.1 (or whatever version you are building)
fakeroot ./fix_ownerships_and_build.sh
fix_ownerships_and_build.sh は次のようになります。
chown -R root:root debian/tmp/path (or whatever user is appropriate)
chown -R www-data:www-data debian/tmp/var/www/* (same goes here)
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file)
それだけです。この回答が、他の人が私よりも早く進歩するのに役立つことを願っています。