¿Qué estoy haciendo?
Estoy intentando crear un paquete deb de una versión compilada de qt.
Donde estoy:
$ 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
Si ejecuto sudo make install
, todo se instala bien, pero necesito un paquete .deb para que otras personas de mi organización también puedan instalar los mismos binarios sin necesidad de volver a compilar.
El paso problemático:
He leído que la herramienta que debo utilizar es checkinstall
. Lo intenté checkinstall
con un ejemplo simple de HelloWorld y todo pareció ir bien. Esta es la situación perfecta y es exactamente lo que esperaba. Sin embargo, cuando intento instalar este proyecto Qt, aparece errores como este:
$ 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)
...
Identificando el problema:
Parece que esto es unviejo errorcon checkinstall que existe desde al menos 2007 (ese fue el informe más antiguo que pude encontrar).
Probando una solución alternativa:
Algunas personas recomendaron usar --fstrans=no
, y cuando lo hago veo que ahora al menos puedo instalar carpetas, pero todos los archivos no se implementan:
$ 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)
...
Que sigue:
Aquí es donde todo el mundo parece detenerse. Si checkinstall
tuviera un error paralizante durante 11 años que lo hiciera totalmente inútil, entonces me imagino que ya no existiría. Pero lo hace. Así que me estoy perdiendo la solución que la gente parece estar encontrando. De lo contrario, no sé qué hacer a continuación.
¿Cómo empaquetan las personas los archivos deb?
encontré estotutorial para ubuntu. ¿Pero se supone que está utilizando el bzr de Canonical para un sistema de control de versiones y utiliza el VCS como parte de su operación? No planeo enviar este paquete a Ubuntu, por lo que realmente no entiendo por qué las instrucciones también incluyen bzr commit...
esas cosas.
También encontré estotutorial para debain. Me gusta porque no depende de ningún extraño sistema de control de versiones que genere cosas automáticamente. Pero también parece suponer que tengo archivos fuente tar.gz predebianizados y tengo la intención de enviar los paquetes a Debian. También supone que no quiero agregar ningún parámetro que ./configure
sea falso. Intenté agregar parámetros de línea común debian/rules
en la override_dh_auto_configure
sección, pero no puedo decir si está funcionando ya que todo parece estar fallando alrededor de 10000 líneas antes de recuperar mi símbolo del sistema.
Aquí estáotro tutorial sobre el temapero este requiere que tengas una clave gpg, algo que espero que mi repositorio de apt maneje cuando reproduzca el paquete deb en el repositorio de apt. Al ejecutar esta solución, también tuve problemas con la compilación fallida. Debido a que imprime decenas de miles de líneas, no puedo decir dónde ni por qué está fallando. Sólo esodh_auto_clean: make -j10 clean returned exit code 2
Básicamente, quería algo exactamente como checkinstall, sólo que sin un error paralizante que impidiera que funcionara. Lo que obtengo es la instalación de verificación fallida y tres métodos alternativos, todos los cuales requerirán que invierta toda mi semana en solucionar problemas (ya he pasado varios días). ¿Hay alguna manera de arreglar checkinstall o de tener una solución de 2 o 3 comandos para pasar de mi solución "make" a una solución .deb?
Normalmente uso cpack para crear mis paquetes deb, pero como esta fuente usa autoconf, no sé cómo proceder.
Respuesta1
Resulta que eso checkinstall
realmente estaba funcionando. El problema era el proyecto que estaba intentando instalar. checkinstall (como dh_make) se establece DESTDIR=some/temp/location
durante el make install
paso.
Este proyecto utiliza qmake
y el Makefile generado por qmake
no comprende la DESTDIR
directiva. En cambio, INSTALL_ROOT
era necesario.
Terminé usando dh_make
un código fijo override_dh_auto_install
para configurarlo INSTALL_ROOT
manualmente en lugar de DESTDIR
.
El dh_make
comando genera archivos de reglas necesarios para configurar, compilar, instalar y empaquetar el proyecto.
Después de ejecutar dh_make
, edite el archivo recién generado debian/rules
para que tenga este aspecto:
#!/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/
Luego configure, construya y empaquete con un solo comando:
fakeroot dpkg-buildpackage -nc -j10 -us -uc