checkinstall создает бесполезную деб?
У меня есть тривиально простая программа командной строки, которая буквально состоит из скрипта Python и некоторых скриптов вспомогательной оболочки. Я хотел бы узнать об упаковке этой программы, хотя это тривиально.
Из того, что я собрал, я пошел настроить / сделать / установить маршрут. Поскольку у меня не было ничего для настройки или создания, я просто создал Makefile без раздела установки:
install:
cp ./myProgram /usr/bin/my-program
chown root:root /usr/bin/my-program
chmod 777 /usr/bin/my-program
cp -r ./ProgramResources /usr/lib/my-program
chown -hR root:root /usr/lib/my-program
chmod -R 777 /usr/lib/my-program
На данный момент моя программа устанавливается и работает нормально с sudo make install.
Затем я пытаюсь создать файл deb с помощью checkinstall следующим образом:
sudo checkinstall sudo make install
Похоже, что он прошел часть установки, так как сообщает об успешном выполнении, но затем не удается:
======================== Installation successful ==========================
cp: cannot stat `//var/tmp/tmp.jKCmESc0v7/newfiles.tmp': No such file or directory
Copying files to the temporary directory...OK
Stripping ELF binaries and libraries...OK
Compressing man pages...OK
Building file list... FAILED!
Building Debian package...OK
Installing Debian package...OK
Erasing temporary files...OK
Deleting temp dir...OK
**********************************************************************
Done. The new package has been installed and saved to
...
Программа установлена, но, насколько я могу судить, этот недавно созданный файл.deb ничего не делает. dpkg -L my-program дает только
/.
и удаление его вручную и установка из файла deb, похоже, ничего не делает - фактически он никуда не помещает файлы.
Итак, (1) Что-то не так с моим подходом? и (2) Как я могу исправить проблему checkinstall?
Большое спасибо за ответы, хотя я хорошо разбираюсь в коде, я никогда ничего не знал об упаковке / распространении.
3 ответа
Двойное использование sudo - проблема.
С файлом install.sh вроде
#! /bin/bash
set -x
touch useless
cp useless /usr/share/useless
команда
sudo checkinstall --pkgname useless -y ./install.sh
работает пока
sudo checkinstall --pkgname useless -y sudo ./install.sh
^^^^
шоу
cp: cannot stat ‘//var/tmp/tmp.Au4ympTNlT/newfiles.tmp’: No such file or directory
и производит пустую упаковку.
Я не уверен, что это точно отвечает на вопрос, но вот что я получил до сих пор (на Ubuntu Lucid, Checkinstall 1.6.1):
Я пытался построить проект с открытым исходным кодом, который был построен просто отлично. Затем я попытался упаковать его для Debian:
checkinstall -D --install=no --pkgname=$PKGNAME --pkgversion=0.0.1 --pkgrelease="svn-001" --maintainer=test@test.com --strip=no --stripso=no --addso=yes
Это в основном не удалось в то же Building file list... FAILED!
; и тому подобное grep: /var/tmp/tmp.NaoiwTHT6F/newfile: No such file or directory
Сообщалось.
Я тоже пробовал с добавлением make
в конце checkinstall
Команда выше - это тоже мало что дало.
Наконец я попробовал это:
make clean
checkinstall -D --install=no --pkgname=$PKGNAME --pkgversion=0.0.1 --pkgrelease="svn-001" --maintainer=test@test.com --strip=no --stripso=no --addso=yes -d2 make
Переключатель -d2
должен включить отладку; а также ... make
перезапущу сделать еще раз.
-d2
распечатает временный каталог:
отладка: временный каталог: [/var/tmp/tmp.NaoiwTHT6F], так что это можно проверить, перечислив... И действительно, я могу подтвердить, что
newfile
не генерируется там в моем случае (однако, есть newfiles
, newfiles.installwatch
, newfiles-tar
, а также newfiles.tmp
). На самом деле, получается checkinstall
это bash
сценарий, и поэтому можно подтвердить, что newfile
появляется только один раз:$ grep 'newfile ' `which checkinstall`
grep '^/home' ${TMP_DIR}/newfile > /${TMP_DIR}/unwanted
Также отладка укажет на эти файлы / каталоги:
debug: INSTW_EXCLUDE=/dev,/path/to/myproject-build,/proc,/tmp,/var/tmp,
debug: INSTW_ROOTPATH=/var/tmp/tmp.NaoiwTHT6F
debug: INSTW_LOGFILE=/var/tmp/tmp.NaoiwTHT6F/newfiles.tmp
debug: INSTW_DBGFILE=/var/tmp/tmp.NaoiwTHT6F/dbgfile
Обратите внимание, что по умолчанию путь к моей папке сборки, /path/to/myproject-build
исключен - и именно здесь этот проект также хранит встроенные исполняемые файлы!
Видимо, когда make
в checkinstall
продолжает сборку в первый раз, может захватывать только что сгенерированные исполняемые файлы - они будут перечислены в ${TMP_DIR}/newfiles
; однако, в моем случае проблема заключается в том, что исполняемые файлы оказываются в том же каталоге, где checkinstall
называется; таким образом, в этом диалоге:
Some of the files created by the installation are inside the build
directory: /path/to/myproject-build
You probably don't want them to be included in the package,
especially if they are inside your home directory.
Do you want me to list them? [n]: y
Should I exclude them from the package? (Saying yes is a good idea) [y]: n
... Я должен, на самом деле, ответить n
- иначе я бы ничего не получил! Затем я могу проверить содержимое с:
dpkg --contents mytest.deb | less
Однако проблема в том, что checkinstall
:
- также включает в себя
.o
файлы, а также.svn
каталоги - считает абсолютный путь относительным (не будет автоматически "отправлять" исполняемые файлы, чтобы сказать,
/usr/bin
, а также.so
с/usr/lib
Вкратце - некоторые из вышеперечисленных подходов могут заставить .deb
который не совсем пуст; но это не значит, что у вас есть только необходимые файлы, или что они будут направлены в обычные места установки...
Ну, надеюсь, это поможет хоть немного,
Ура!
У меня были похожие проблемы. В конце концов я следовал этому очень простому, но довольно ручному подходу.
Поместите файлы, которые вы хотите упаковать, например, в debian/usr/bin. Там нет необходимости завершать обычное configure, make, make install
шаги.