私は現在、C、C++、Pythonなどのいくつかの言語で書かれたソースを含む大規模なプロジェクトを構築しています。私は最近、autotoolsを(苦痛に)処理して適切にインストールすることに成功しました。私たちのプロジェクトはdebianストレッチで実行することを目的としているため、次のステップは.debを作成することです。
私はこれを行うためにいくつかの方法を試しましたが、その方法かどうかにかかわらず、それを機能させることができません。
Checkinstallによって生成されたツリー.deb:
unpack/
├── etc
│ └── nina
│ ├── auto_blacklist.txt
│ ├── blacklist.txt
│ ├── conf
│ ├── keywords.txt
│ ├── rubbish_links.txt
│ └── whitelist.txt
└── usr
├── local
│ ├── bin
│ │ ├── geckodriver
│ │ └── nina
│ ├── lib
│ │ └── python2.7
│ │ └── dist-packages
│ │ ├── nina.py
│ │ ├── nina_py_installed_files.txt
│ │ ├── Uinput_wrapping_module-2.0.Egg-info
│ │ └── uinput_wrapping_module.so
│ └── share
│ └── man
│ └── man1
│ └── nina.1.gz
└── share
└── doc
└── nina
├── COPYING
├── doc
│ ├── Doxyfile
│ └── nina.1
├── README
└── README.md
Debhelper(v9)によって生成されたツリー.deb:
unpack/
├── etc
│ └── nina
│ ├── auto_blacklist.txt
│ ├── blacklist.txt
│ ├── conf
│ ├── keywords.txt
│ ├── rubbish_links.txt
│ └── whitelist.txt
└── usr
├── bin
│ └── nina
├── lib
│ └── python2.7
│ └── dist-packages
│ └── nina.py
└── share
├── doc
│ └── nina
│ ├── changelog.Debian.gz
│ └── copyright
└── man
└── man1
└── nina.1.gz
ご覧のとおり、まったく同じではありません(原文のまま)。私は多かれ少なかれcheckinstall
が何をするのか理解しています:それはmake installコマンドを実行し、ファイル出力を取得してインストール先に配置します[〜#〜] my [〜#〜] =マシン。 debhelper
は、ここではより適切なツールのようです。 (/usr/lib
ではなく/usr/local/lib
にインストールすると、パッケージなどに署名できるようになります。)使用したいのですが、期待どおりに機能しません。
そしてhuge plus on debhelperの方法は、debian/controlなどで指定された依存関係を実際に処理しているということです。しかし、checkinstallはそうではありません。
Debhelperが行っていないこと:
インターネットソースからバイナリ(geckodriver)を取得し、/ usr/binに配置します
自家製のインストールpythonモジュール
これらのアクションは、Makefile.amで、install-exec-local:
(およびそれぞれuninstall-local:
)メソッドをオーバーライドし、いくつかのbashコマンドを実行することによって実行されます。
---
だから私の質問は:それを「完璧」にするためにこれらの2つのパッケージング方法の最良の部分をどのように保つことができますか?
インターネットから物をダウンロードすることは、Debianパッケージビルドが行うべきではないことです。 'build in clean chroot'ヘルパーを使用すると、それができない場合もあります。ただし、プレーンなdpkg-buildpackage
はそうすることができるはずです。 autotoolsビルドシステムが正しいことをするなら、何も必要ないはずです。それ以外の場合は、必要なコマンドをoverride_dh_foo
コマンドに追加する必要があります(「mandh」を参照)。
Pythonモジュールの場合、$ DESTDIRを尊重して、ビルドシステムから.pyファイルもインストールする必要があります。そうする場合は、dh
モードのdebhelperをインストールする必要があります。 DTRTだけです。
それでもうまくいかない場合は、問題が発生する最小限のバージョンのパッケージを作成してください。そうでなければ、これは非常に水晶玉の問題です。
あなたのおかげでMakefile.am
を再考しました。そして最終的には何かを手に入れることができました。
スクリプトを実行して./configure
ステップで取得し、次のようなパッキングシステム上にあると想定して、.debパッケージにファイル依存関係として配置します。
bindeptsdir = \
$(prefix)/bin
bindepts_DATA = \
/usr/local/bin/geckodriver
$(DESTDIR)は確かにここでの解決策でした、今私のpythonモジュールはこのようにインストールされます:
$(PYTHON) setup.py install \
--root $(DESTDIR)
そして、これをdebian/rulesに配置する必要があるという事実からうまく機能します:override_dh_usrlocal:
それ以外の場合は、/usr/local
にファイルをインストールしているので、私に怒鳴ります
私はしたくないのですが、pythonはそれ自体でインストールを処理していて、インストールパスを指定できません。他の解決策は--root...
の代わりに--prefix $(DESTDIR)$(prefix)
を指定することでしたが、インストールしていますpythonpathにない/usr/lib/python2.7/site-packages
のファイル。
---
Appart from pythonトラブル最終結果は、dpkg-buildpackageで問題なく動作します。