我正在做什么:

我正在做什么:

我正在做什么:

我正在尝试构建 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)
...

下一步是什么:

似乎每个人都止步于此。如果checkinstall11 年来一直存在一个严重的 bug,导致它完全无用,那么我想它就不会再存在了。但它确实存在。所以我错过了人们似乎在寻找的解决方法。否则,我对下一步该做什么感到困惑。

人们如何打包 deb 文件?

我找到了这个Ubuntu 教程。但它假设您使用 Canonical 的 bzr 作为版本控制系统,并使用 VCS 作为其操作的一部分?我不打算将此包推送到 Ubuntu,所以我真的不明白为什么说明中还包含bzr commit...和内容。

我也发现了这个Debain 教程。我喜欢它,因为它不依赖于一些奇怪的版本控制系统自动生成的东西。但它似乎还假设我已经预先 debian 化了 tar.gz 源档案,并且我打算将软件包提交给 debian。它还假设我不想添加任何参数,这./configure是错误的。我尝试debian/rulesoverride_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

相关内容