проверка установки создает бесполезный deb?

#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-файла и некоторый установочный скрипт. Думаю, все эти описания не охватывают мой случай.