我在做什麼:

我在做什麼:

我在做什麼:

我正在嘗試建立 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.我嘗試了checkinstall一個簡單的 helloworld 範例,一切似乎都很好。這是完美的情況,也正是我所期待的。但是,當我嘗試安裝這個 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)
...

下一步是什麼:

說到這裡,所有人似乎都停下來了。如果checkinstall有一個嚴重的錯誤長達 11 年,使其完全無用,那麼我想它就不會再存在了。但確實如此。所以我錯過了人們似乎正在尋找的解決方法。否則,我會很困惑下一步該做什麼。

人們如何打包 deb 檔案?

我找到了這個ubuntu教程。但它假設您使用 Canonical 的 bzr 作為版本控制系統並使用 VCS 作為其操作的一部分?我不打算將這個套件推送到 Ubuntu,所以我不太明白為什麼這些說明還包含bzr commit...這些內容。

我也發現了這個德班教程。我喜歡它,因為它不依賴一些奇怪的版本控制系統自動生成的東西。但它似乎也假設我已經預先 debianized tar.gz 源檔案,並且我打算將包提交到 debian。它還假設我不想添加任何./configure錯誤的參數。我嘗試debian/rules在該override_dh_auto_configure部分中添加公共行參數,但我無法判斷它是否正常工作,因為在我恢復命令提示字元之前,一切似乎都失敗了大約 10000 行。

這是關於該主題的另一個教程但這需要你有一個 gpg 金鑰,當我將 deb 套件重新編譯到 apt 儲存庫時,我希望 apt 儲存庫能夠處理該金鑰。當運行這個解決方案時,我也遇到了建置失敗的問題。因為它列印出數萬行,所以我無法判斷它在哪裡/為什麼失敗。只有這樣dh_auto_clean: make -j10 clean returned exit code 2

基本上,我想要的東西與 checkinstall 完全一樣,只是沒有一個嚴重的錯誤阻止它實際工作。我得到的是損壞的 checkinstall 和三種替代方法,所有這些都需要我花整整一周的時間進行故障排除(我已經花了幾天時間)。有沒有辦法修復 checkinstall,或者有一個 2-3 命令解決方案來從我的“make”解決方案獲取 .deb 解決方案?

通常我會使用 cpack 來製作我的 deb 套件,但由於這個來源使用 autoconf,我有點不知道如何繼續。

答案1

事實證明這checkinstall確實有效。問題是我試圖安裝的項目。 checkinstall(如 dh_make)DESTDIR=some/temp/location在該make install步驟中設定。

該項目使用qmake,並且 產生的 Makefileqmake不理解該DESTDIR指令。相反,INSTALL_ROOT這是必需的。

我最終使用dh_make並硬編碼override_dh_auto_installINSTALL_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/

然後使用一個命令進行配置、建置和打包:

fakeroot dpkg-buildpackage -nc -j10 -us -uc

相關內容