checkinstall создает бесполезную деб? - PullRequest
8 голосов
/ 17 мая 2011

У меня есть тривиально простая программа командной строки, которая буквально состоит из скрипта Python и некоторых скриптов вспомогательной оболочки.Я хотел бы узнать об упаковке этой программы, хотя это тривиально.

Из того, что я собрал, я пошел по пути configure / make / install.Так как у меня не было ничего для настройки или создания, я просто создал 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 ]

5 голосов
/ 21 мая 2014

Двойное использование 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

и выдает пустой пакет.

3 голосов
/ 04 июля 2012

Я не уверен, что это точно отвечает на вопрос, но вот что я получил до сих пор (на 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<br> 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 распечатает временный каталог:

debug: The temporary directory is: [ /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}/newfile<b>s</b>; однако в моем случае проблема заключается в том, что исполняемые файлы попадают в тот же каталог, где вызывается 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, который не является полностью пустым; но это не значит, что у вас есть только необходимые файлы или они будут перенаправлены в обычные места установки ...

Ну, надеюсь, это поможет хоть немного,
Ура!

1 голос
/ 04 апреля 2014

У меня были похожие проблемы. В конце концов я следовал за этим очень простым, но довольно ручным подходом.

Поместите файлы, которые вы хотите упаковать, например, в debian / usr / bin. Нет необходимости выполнять обычные configure, make, make install шаги.

...