我在做什麼:
我正在嘗試建立 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_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/
然後使用一個命令進行配置、建置和打包:
fakeroot dpkg-buildpackage -nc -j10 -us -uc