Рабочая версия checkinstall
Что я делаю
Я пытаюсь собрать пакет deb из скомпилированной версии qt.
Где я нахожусь:
$ 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. Но это предполагает, что вы используете bzr Canonical для системы контроля версий и используете VCS как часть ее работы? Я не планирую отправлять этот пакет в Ubuntu, и поэтому я не очень понимаю, почему в инструкции также включены bzr commit...
и прочее.
Я также нашел этот учебник для Debain. Мне нравится это, потому что это не полагается на какую-то странную систему контроля версий, автоматически генерирующую вещи. Но, похоже, также предполагается, что у меня есть предварительный debianized исходный архив tar.gz, и я собираюсь отправить пакеты в debian. Это также предполагает, что я не хочу добавлять какие-либо параметры в ./configure
что неверно Я попытался добавить параметры общей линии в debian/rules
в override_dh_auto_configure
раздел, но я не могу сказать, работает ли он, так как все, кажется, сбоит около 10000 строк, прежде чем я получу обратно командную строку.
Вот еще одно руководство по этой теме, но для этого требуется, чтобы у вас был ключ gpg, и я ожидаю, что мой репозиторий apt справится, когда я представлю пакет deb в репозиторий 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
и Makefile, сгенерированный qmake
не понимает 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