O que estou fazendo:
Estou tentando construir um pacote deb de uma versão compilada do qt.
Onde estou:
$ 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
Se eu executar sudo make install
, tudo será instalado corretamente, mas preciso de um pacote .deb para que outras pessoas na minha organização também possam instalar os mesmos binários sem a necessidade de recompilar.
A etapa problemática:
Eu li que a ferramenta que devo usar é o checkinstall
. Tentei checkinstall
com um exemplo simples de helloworld e tudo parecia estar bem. Esta é a situação perfeita e é exatamente o que eu esperava. No entanto, quando tento instalar este projeto Qt, recebo erros 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 o problema:
Parece que isso é umbug antigocom checkinstall que existe desde pelo menos 2007 (esse foi o relatório mais antigo que consegui encontrar).
Tentando uma solução alternativa:
Algumas pessoas recomendaram usar --fstrans=no
, e quando faço isso vejo que agora posso pelo menos instalar pastas, mas todos os arquivos falham na implantação:
$ 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)
...
Qual é o próximo:
É aqui que todos parecem parar. Se checkinstall
houvesse um bug incapacitante por 11 anos que o tornasse totalmente inútil, então eu imaginaria que ele não existiria mais. Mas acontece. Portanto, estou sentindo falta da solução alternativa que as pessoas parecem estar encontrando. Caso contrário, estou confuso sobre o que fazer a seguir.
Como as pessoas empacotam arquivos deb?
Eu achei istotutorial para Ubuntu. Mas pressupõe que você esteja usando o bzr da Canonical para um sistema de controle de versão e use o VCS como parte de sua operação? Não estou planejando enviar este pacote para o Ubuntu e, portanto, não entendo por que as instruções também incluem bzr commit...
essas coisas.
Eu também encontrei issotutorial para debater. Eu gosto porque não depende de algum sistema estranho de controle de versão que gere coisas automaticamente. Mas também parece assumir que eu pré-debianizei os arquivos fonte tar.gz e pretendo enviar os pacotes para o debian. Também pressupõe que não desejo adicionar nenhum parâmetro que ./configure
seja falso. Tentei adicionar parâmetros de linha comum debian/rules
na override_dh_auto_configure
seção, mas não sei dizer se está funcionando, pois tudo parece estar falhando em cerca de 10.000 linhas antes de receber meu prompt de comando de volta.
Aqui estámais um tutorial sobre o assuntomas este requer que você tenha uma chave gpg, algo que espero que meu repositório apt lide quando eu reprepro o pacote deb para o repositório apt. Ao executar esta solução, também tive problemas com falha na compilação. Como ele imprime dezenas de milhares de linhas, não sei dizer onde/por que está falhando. Só issodh_auto_clean: make -j10 clean returned exit code 2
Basicamente, eu queria algo exatamente como checkinstall, mas sem um bug incapacitante que o impedisse de realmente funcionar. O que estou recebendo é o checkinstall quebrado e três métodos alternativos, os quais exigirão que eu invista minha semana inteira na solução de problemas (já passei vários dias). Existe uma maneira de corrigir o checkinstall ou de ter uma solução de comando 2-3 para passar da minha solução "make" para uma solução .deb?
Normalmente eu uso cpack para fazer meus pacotes deb, mas como essa fonte usa autoconf, estou um pouco sem saber como proceder.
Responder1
Acontece que isso checkinstall
estava realmente funcionando. O problema era o projeto que eu estava tentando instalar. checkinstall (como dh_make) é definido DESTDIR=some/temp/location
durante a make install
etapa.
Este projeto usa qmake
, e o Makefile gerado por qmake
não entende a DESTDIR
diretiva. Em vez disso, INSTALL_ROOT
foi necessário.
Acabei usando dh_make
e codifiquei override_dh_auto_install
para definir INSTALL_ROOT
manualmente em vez de DESTDIR
.
O dh_make
comando gera arquivos de regras necessários para configurar, construir, instalar e empacotar o projeto.
Depois de executar dh_make
, edite o arquivo recém-gerado debian/rules
para ficar assim:
#!/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/
Em seguida, configure, construa e empacote com um comando:
fakeroot dpkg-buildpackage -nc -j10 -us -uc