#makefile #deb #checkinstall
#makefile #deb #проверка установки
Вопрос:
У меня есть тривиально простая программа командной строки, которая буквально состоит из скрипта Python и нескольких вспомогательных сценариев оболочки. Я хотел бы узнать об упаковке этой программы, хотя это тривиально.
Из того, что я понял, я пошел по маршруту configure / make / install. Поскольку мне нечего было настраивать или что-либо создавать, я просто создал Makefile, в котором не было ничего, кроме раздела install:
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?
Большое вам спасибо за ответы, хотя я хорошо разбираюсь в коде, я никогда ничего не знал об упаковке / распространении.
Ответ №1:
Проблема в двойном использовании 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
и выдает пустой пакет.
Ответ №2:
Я не уверен, что это точно отвечает на вопрос, но вот что я получил на данный момент (на 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
будет повторно запущен make еще раз.
-d2
Распечатает временный каталог:
отладка: временный каталог: [ /var/tmp/tmp.NaoiwTHT6F ]
, так что это можно проверить путем перечисления… И действительно, я могу подтвердить, что в моем случае a 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
within 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
s в/usr/lib
Вкратце — некоторые из описанных выше подходов могут привести к получению .deb
, который не является полностью пустым; но это не означает, что там есть только необходимые файлы или что они будут перенаправлены в обычные места установки…
Что ж, надеюсь, это поможет хотя бы немного,
Ура!
Ответ №3:
У меня были похожие проблемы. В итоге я последовал этому очень простому, но довольно ручному подходу.
Поместите файлы, которые вы хотите упаковать, например, в debian/usr/bin. Нет необходимости выполнять обычные configure, make, make install
шаги.
Комментарии:
1. Понятия не имею, как туда добраться! Есть Java-приложение в виде jar-файла и некоторый установочный скрипт. Думаю, все эти описания не охватывают мой случай.