私がやっていること:
コンパイルされたバージョンの qt の deb パッケージをビルドしようとしています。
私の現在地:
$ wget http://download.qt.io/official_releases/qt/5.10/5.10.0/single/qt-everywhere-src-5.10.0.tar.xz
$ tar -xf qt-everywhere-src-5.10.0.tar.xz ~/src/qt
$ cd ~/src/qt/qt-everywhere-src-5.10.0
$ ./configure --prefix=/opt/sim-qt --opensource --confirm-license --skip qtcharts --skip qtvirtualkeyboard --skip qtdatavis3d --silent --nomake examples --nomake tests
$ make
を実行するとsudo make install
、すべて正常にインストールされますが、組織内の他のユーザーが再コンパイルせずに同じバイナリをインストールできるように、.deb パッケージが必要です。
問題のあるステップ:
使用すべきツールは だと読みましたcheckinstall
。簡単な helloworld の例で試してみましたcheckinstall
が、問題ないようです。これは完璧な状況で、まさに私が期待していたとおりです。ただし、この Qt プロジェクトをインストールしようとすると、次のようなエラーが発生します。
$ checkinstall -D --install=no --pkgname=sim-qt --pkgversion=5.10.0 --pkgrelease=0 --pkglicense=LGPL --nodoc
...
/home/stew/src/qt/qt-everywhere-src-5.10.0/qtbase/bin/qmake -install qinstall /home/stew/src/qt/qt-everywhere-src-5.10.0/qtbase/include/QtGui/QDragLeaveEvent /opt/sim-qt/include/QtGui/QDragLeaveEvent
Error copying /home/stew/src/qt/qt-everywhere-src-5.10.0/qtbase/include/QtGui/QDragLeaveEvent to /opt/sim-qt/include/QtGui/QDragLeaveEvent: Cannot create /opt/sim-qt/include/QtGui/QDragLeaveEvent for output
Makefile:69204: recipe for target 'install_class_headers' failed
make[3]: [install_class_headers] Error 3 (ignored)
...
問題の特定:
これは古いバグcheckinstall は少なくとも 2007 年から存在しています (これが私が見つけた最も古いレポートです)。
回避策を試す:
を使用することを勧める人もいます--fstrans=no
が、それを実行すると、少なくともフォルダーをインストールできるようになりましたが、ファイルはすべて展開に失敗します。
$ checkinstall -D --install=no --pkgname=sim-qt --pkgversion=5.10.0 --pkgrelease=0 --pkglicense=LGPL --nodoc --fstrans=no
...
/home/stew/src/qt/qt-everywhere-src-5.10.0/qtbase/bin/qmake -install qinstall /home/stew/src/qt/qt-everywhere-src-5.10.0/qttranslations/translations/qtscript_en.qm /opt/sim-qt/translations/qtscript_en.qm
Error copying /home/stew/src/qt/qt-everywhere-src-5.10.0/qttranslations/translations/qtscript_en.qm to /opt/sim-qt/translations/qtscript_en.qm: Cannot create /opt/sim-qt/translations/qtscript_en.qm for output
Makefile:2841: recipe for target 'install_translations' failed
make[2]: [install_translations] Error 3 (ignored)
...
次は何ですか:
ここで誰もが止まってしまうようです。11checkinstall
年間にわたって完全に役に立たない重大なバグがあったとしたら、もう存在しないだろうと思います。しかし、実際には存在します。つまり、人々が見つけているような回避策を私は見逃しています。そうでなければ、次に何をすべきかわかりません。
deb ファイルはどのようにパッケージ化されるのでしょうか?
私はこれを見つけましたUbuntuのチュートリアルしかし、これはバージョン管理システムとして Canonical の bzr を使用していて、その操作の一部として VCS を使用していることを前提としていますか? このパッケージを Ubuntu にプッシュする予定はないので、手順に などが含まれている理由がよくわかりませんbzr commit...
。
これも見つけたデバインチュートリアル。 奇妙なバージョン管理システムに頼らずに自動的に生成してくれるので気に入っています。しかし、私が debian 化済みの tar.gz ソース アーカイブを持っていて、パッケージを debian に送信するつもりだと想定しているようです。また、 にパラメータを追加したくないと想定していますが、これは誤りです。セクションに./configure
共通行パラメータを追加しようとしましたが、コマンド プロンプトが戻る前に約 10000 行ですべてが失敗しているように見えるため、機能しているかどうかわかりません。debian/rules
override_dh_auto_configure
こちらはこのテーマに関する別のチュートリアルしかし、この方法ではgpgキーが必要です。これは、aptリポジトリにdebパッケージを再プリプロするときにaptリポジトリが処理することを期待しています。このソリューションを実行すると、ビルドが失敗するという問題もありました。何万行も出力されるため、どこで/なぜ失敗するのかわかりません。dh_auto_clean: make -j10 clean returned exit code 2
基本的に、私は checkinstall とまったく同じものを求めていましたが、実際に動作することを妨げる致命的なバグはありませんでした。私が得たのは壊れた checkinstall と 3 つの代替方法であり、そのすべてでトラブルシューティングに 1 週間を費やす必要があります (すでに数日を費やしています)。checkinstall を修正する方法、または "make" ソリューションから .deb ソリューションを取得するための 2 ~ 3 コマンド ソリューションは存在するのでしょうか?
通常、私は cpack を使用して deb パッケージを作成しますが、このソースでは autoconf が使用されているため、どのように進めればよいか少し困っています。
答え1
結局、それはcheckinstall
実際に機能していました。問題は、インストールしようとしていたプロジェクトでした。 checkinstall (dh_make のように) は、DESTDIR=some/temp/location
そのmake install
ステップで設定されます。
このプロジェクトでは が使用されていますqmake
が、 によって生成された Makefile はディレクティブqmake
を理解しませんDESTDIR
。 代わりにINSTALL_ROOT
が必要です。
最終的には、の代わりにdh_make
と をハードコードして手動でoverride_dh_auto_install
設定することになりました。INSTALL_ROOT
DESTDIR
このdh_make
コマンドは、プロジェクトの構成、ビルド、インストール、パッケージ化に必要なルール ファイルを生成します。
を実行した後dh_make
、新しく生成されたdebian/rules
ファイルを次のように編集します。
#!/usr/bin/make -f
%:
dh $@ --with autotools-dev --parallel
override_dh_auto_configure:
./configure --prefix=/opt/sim-qt --opensource --confirm-license --skip=qtcharts --skip=qtvirtualkeyboard --skip=qtdatavis3d --skip=qtwebengine --silent --nomake=examples --nomake=tests QMAKE_ARGS+=INSTALL_ROOL=/opt/sim-qt QMAKE_ARGS+=DESTDIR=
override_dh_auto_install:
dh_auto_install -Smakefile -- INSTALL_ROOT=$(CURDIR)/debian/sim-qt/
次に、1 つのコマンドで構成、ビルド、パッケージ化を実行します。
fakeroot dpkg-buildpackage -nc -j10 -us -uc