7

dpkg (Debian) 制御ファイルのほとんどのフィールドは簡単です。注意が必要なのは、依存関係のリスト (Depends:) を決定することです。パッケージディレクトリ内の実行可能ファイルのldd出力を見て、dpkg-gencontrolがこれを実行できることを望んでいました。おそらくそれは可能ですが、私はそれを機能させることができません。

これdpkg-gencontrolが目的である場合、私が得ているエラーは次のとおりです。

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field.

参考までに、コマンドはdpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. control_template ファイルには次のものが含まれます。

Package: my-package
Maintainer: Joe Coder <joe@coder.com>
Description: The my-package system
 A longer description that runs to the end of one line and then 
 extends to another line.
Priority: optional

これdpkg-gencontrolが目的ではない場合、私ができることについての提案、または依存関係リストを理想的には自動的に設定する方法についてのアドバイスはありますか?

確かに、一般的な方法で依存関係を推測することは、おそらく非常に難しい問題です。検索をスクリプトや他のプログラムに拡張する場合は特にそうです。ほとんどの場合に機能するツールがいくつか存在することを願っています。

これは内部配布専用であることに注意してください。私は、Linux ディストリビューションに入れるためのパッケージや、一般の人がダウンロードするためのパッケージを作成しているわけではないので、必要に応じて標準ルールを曲げたり破ったりしても構いません。

4

2 に答える 2

12

チトンの答えに触発されて掘り下げ、試行錯誤を繰り返した後、私はついに自分の問題の解決策を見つけました。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)

それだけです。この回答が、他の人が私よりも早く進歩するのに役立つことを願っています。

于 2011-11-10T08:59:51.977 に答える
1

実際、含まれているライブラリのリストを見ることは、C プログラムではかなり一般的であり、shlibs ヘルパー ( dpkg-shlibdeps) の仕事にすぎません。ヘルプについてはマンページを参照してください。基本的に${shlibs:Depends}は、依存関係の行で使用することになります。

于 2011-11-06T16:48:33.200 に答える