Створення пакунків програм для Slackware

Про пакунки програм

Серцем кожного дистрибутиву Ґну/Лінукса є його система пакунків. Завдяки їй ми можемо (маючи пакунок) за кілька секунд встановити чи видалити програму зі своєї системи. Але часом бувають ситуації, коли готові пакунки нам не підходять, бо під час компіляції було активовано параметри які нас не задовольняють, або такого пакунку взагалі не існує. В такій ситуації можна скомпілювати "на власний смак" потрібну програму, і командою make install інсталювати її. Але тоді треба було б робити це кожен раз після перевстановлення системи чи змушувати кожну машину в мережі "пітніти" над довгою і нудною компіляцією такої програми. Хіба не краще раз зробити пакуночок, і потім тільки набирати installpkg класна_програма-0.0.89-i686-1.tgz?

Формат пакунків у Slackware

Пакунки Slackware є в форматі старого-доброго *.tgz. Назва цього архіву повинна мати такий вигляд:

назва_програми-версія-архітектура-версія_пакунку.tgz

Перше поле в назві файлу не потребує пояснень, 2-ге - версія самої програми, 3-тє - архітектура процесора для якого був скомпільований пакунок, а 4-те поле означає версію самого пакунку, тобто може бути кілька різних пакунків одної і тої самої версії програми. Наприклад:

gtick-0.3.6-i686-1.tgz
gtick-0.3.6-i686-2.tgz

До останнього поля в назві фалу пакунку (не рахуючи розширення) пакаджери часом додають своє ім'я щоб відрізнити неофіційний пакунок від офіційного. Це взагалі досить непогана ідея...

Тепер заглянемо у середину пакунку. Файли з цього архіву під час інсталяції розпаковуються прямо в / . Винятком є спеціальна тека install з файлом slack-desc. Цей файл містить коротку описову інформацію про пакунок. В теці install також можуть бути (але не обов'язково повинні) файли з назвами slack-required, slack-conflicts, slack-suggests. Обов'язково в пакунку мусить бути тека з адресою usr/doc/пакунок-версія/, сюди треба помістити файли довідки програми такі як README, AUTHORS, COPYRIGHT, ChangeLog...

Отже, от які файли повинні знаходитися в будь-якому пакунку для Slackware:

.
install
install/slack-desc
usr/doc/пакунок-версія/

Компіляція і створення пакунків

Ну що ж, досить теорії, переходими до діла :)

Щоб створити пакунок треба спочатку "розчистити місце на столі", тобто зробити теку в яку розпаковуватимемо висхідні коди програм і теку куди будемо класти файли інсталяції.

Для прикладу візьмемо

~/src
~/bin

Компіляція

Як завжди беремо архів з висхідними кодами програми і розпаковуємо його в ~/src/:

tar -xzf program-x.x.x.tar.gz # (tar -xjf program-x.x.x.tar.bz)

в результаті маємо ~/src/program-x.x.x/.

Йдемо туди і запускаємо конфіґураційний скрипт:

$ cd program-x.x.x/
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var

Під час запуску ./configure важливим є параметр --prefix=/usr, оскільки без нього ./configure помістить всі файли програми в підтеки /usr/local/ а нам потрібно в /usr. Зазвичай ./configure пхає системні конфіґураційні файли до $PREFIX/etc, тому треба переадресувати їх до /etc.

Не знаю куди б потрапили ті файли які повинні міститися в /var без параметру --localstatedir=/var :)

Чекаємо...
Далі запускаємо make, чекаємо...

Пакування

І от наша програма успішно скомпілювалася. Тепер ми запустимо інсталяцію, але не в "/" а до теки пакування ~/bin (чи де вам зручно):

$ make install DESTDIR=~/bin/назва_програми/

В результаті маємо скомпільований дистрибутив нашої програми в теці ~/bin/назва_програми/

Як вже говорилося раніше, окрім файлів самої програми в пакунку повинна бути тека install з файлом slack-desc:

cd ~/bin/назва_програми/
mkdir install

Далі треба створити файл slack-desc. Він повинен бути такого формату:

               |-----handy-ruler------------------------------------------------------|
назва_програми: Класна прога 3.3.3
назва_програми:
назва_програми: Опис (з README)...
назва_програми: 
назва_програми: 
назва_програми: 
назва_програми:
назва_програми:
назва_програми: 
назва_програми: Package created by ВАШЕ ІМ'Я
назва_програми:

Є кілька правил яких треба дотримуватися:

  1. кількість ліній в файлі (не рахуючи помічної лінійки) завжди повинна бути 11, навіть якщо ви не заповнете всі лінії текстом;
  2. кожна лінія повиина починатися з назви програми, символу ":", і пробілу. Назва повинна бути ідентична до першого поля в назві файлу пакунку;
  3. не варто перевищувати довжину ліній, продиктовану "помічною лінійкою";

Взагалі добре мати заготовку цього файлу щоб не мучитися кожен раз при створенні пакунку, а просто скопіювати з "місція зберігання" в теку install/ даного пакунка і відредагувати його, щоб відповідав пакунку...

Ну добре, з описовим файлом розібралися. Тепер треба створити в теці usr/ теку doc/ в якій, у свою чергу, теку назва_програми-версія/, і туди скопіювати всі довідкові файли, включаючи README, AUTHORS, INSTALL, ChangeLog, COPYRIGHT. Мани туди пхати не треба.

$ cd usr
$ mkdir doc
$ cd doc
$ mkdir cool_program-0.3.7
$ cd cool_program-0.3.7
$ cp ~/src/cool_program/README ./
$ cp ~/src/cool_program/... ./

От тепер ми дійшли власне до пакування ;)

Переходимо в корінь пакунку, і (під рутом!) запускаємо makepkg:

cd ~/bin/назва_програми/
$ su
>Password: ******
# makepkg cool_program-0.3.7-i686-1.tgz

Далі програма створення пакунку запитає вас чи потрібно призначити всім файлам власника root, і чи перетворити всі симлінки в скрип інсталяції пакунку. В більшості випадків на обидва питання варто тиснути yes.

Чекаємо...
Вуаля! Пакунок готовий!

Пробуємо:

# installpkg cool_program-0.3.7-i686-1.tgz
> cool_program: CoolProgram 0.3.7
> cool_program: Package created by John Doe.
> executing install script...

Додаткові можливості

WRITE ME

файл slack-required

WRITE ME

файл slack-conflicts

WRITE ME

файл slack-suggests

WRITE ME

файл doinst.sh

WRITE ME