一个可用的checkinstall版本

我在做什么:

我正在尝试构建一个已编译的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示例,一切似乎都很好。这是完美的情况,正是我所期望的。然而,当我尝试安装这个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)
...

问题识别:

听起来这是一个自至少2007年以来就存在的与checkinstall相关的旧bug(那是我能找到的最早的报告)。

尝试解决方法:

有些人建议使用--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年来一直存在的致命bug,使其完全无用,那么我想它应该已经不存在了。但事实并非如此。所以我不明白人们似乎找到了解决方法。否则,我对接下来该做什么感到困惑。

人们如何打包deb文件?

我找到了这个ubuntu教程。但它假设你正在使用Canonical的bzr作为版本控制系统,并将VCS作为其操作的一部分?我没有计划将此软件包推送到Ubuntu,所以我真的不明白为什么说明中还包括bzr commit...之类的内容。

我还找到了这个debain教程。我喜欢它,因为它不依赖于某种奇怪的版本控制系统自动生成的东西。但它似乎假设我有预先解包的tar.gz源代码存档,并且我打算将软件包提交给debian。它还假设我不想向./configure添加任何参数,这是错误的。我尝试在override_dh_auto_configure部分的debian/rules中添加命令行参数,但我无法确定它是否起作用,因为似乎在我恢复命令提示符之前大约有10000行失败。
这里有关于这个主题的另一个教程,但是这个教程需要你拥有一个gpg密钥,而我期望我的apt仓库在我将deb包重新打包到apt仓库时处理这个问题。当我按照这个解决方案进行操作时,我也遇到了构建失败的问题。由于它打印出成千上万行的输出,我无法确定失败的位置/原因。我只知道dh_auto_clean: make -j10 clean 返回退出码2

基本上,我想要的是像checkinstall一样的东西,但是没有一个致命的错误导致它无法正常工作。我得到的是有问题的checkinstall,以及三种替代方法,所有这些都需要我花费整个星期来排除故障(我已经花了几天时间)。有没有办法修复checkinstall,或者有没有一个2-3个命令的解决方案,可以从我的"make"解决方案转换为.deb解决方案?
通常我使用cpack来制作我的deb包,但是由于这个源代码使用了autoconf,我对如何继续进行有些困惑。
1个回答

原来checkinstall实际上是有效的。问题出在我尝试安装的项目上。checkinstall(就像dh_make一样)在make install步骤中设置了DESTDIR=some/temp/location
这个项目使用qmake,而由qmake生成的Makefile不理解DESTDIR指令。相反,需要使用INSTALL_ROOT
最后,我使用了dh_make并手动将override_dh_auto_install设置为INSTALL_ROOT,而不是DESTDIRdh_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