Что я делаю:

Что я делаю:

Что я делаю:

Я пытаюсь собрать 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. Мне нравится, потому что он не полагается на какую-то странную систему управления версиями, автоматически генерирующую всякую всячину. Но он также, кажется, предполагает, что у меня есть предварительно дебианизированные исходные архивы 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

Связанный контент