OK, to by były te najważniejsze podstawy dotyczące budowania pakietów. Po
takiej części teoretycznej można się zabrać za normalne pakietowanie. Ale
najpierw zobaczmy, jak ma się ten pierwszy, przykładowy plik .spec który
zacytowałem na początku do wszystkich wytycznych które wymieniałem.
Obejrzyjmy go jeszcze raz:
Name: procps
Version: 3.1.7
Release: 1
Summary: System and process monitoring utilities
License: LGPL, GPL, BSD-like
Group: Applications/System
Packager: <procps-feedback@lists.sf.net>
Source: http://procps.sf.net/procps-%{version}.tar.gz
URL: http://procps.sf.net/
BuildRoot: %{_tmppath}/procps-root
%description
The procps package contains a set of system utilities which provide system
information. Procps includes ps, free, sysctl, skill, snice, tload, top,
uptime, vmstat, w, and watch. You need some of these.
%prep
%setup -q
%build
make CC="gcc $RPM_OPT_FLAGS" LDFLAGS=-s
%install
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
%clean
rm -rf $RPM_BUILD_ROOT
%post
# add libproc to the cache
/sbin/ldconfig
%files
%defattr(0644,root,root,755)
%doc NEWS BUGS TODO COPYING COPYING.LIB README
%attr(555,root,root) /lib/libproc.so*
%attr(555,root,root) /bin/*
%attr(555,root,root) /sbin/*
%attr(555,root,root) /usr/bin/*
%attr(0644,root,root) /usr/share/man/man1/*
%attr(0644,root,root) /usr/share/man/man8/*
OK, przejrzyjmy to krytycznie. Najpierw preambuła... wygląda normalnie, tyle
że w Source: nazwa pakietu jest zaszyta na sztywno - ja bym ją uzależnił od
wartości Name:, ale to nic ważnego. Nie ma tutaj wszystkich możliwych do
wpisania tagów, ale wystarcza.
Do %description też nie ma się co przyczepić - jest na swoim miejscu.
Sekcja %prep to makro %setup, dodatkowo ,,wyciszone'' opcją -q. Normalka.
Za to w sekcji %build dziwi mnie brak wywołania ./configure - ale
najwidoczniej ten program tak może mieć. Przy wywołaniu make ustawiane są od
razu zmienne CC i LDFLAGS. Też nic specjalnego.
Sekcja %install najpierw na wszelki wypadek próbuje usunąć stary fake root,
potem wywołuje make i przekierowuje instalację za pomocą $DESTDIR. Znowu,
wszystko w normie.
O, definicja sekcji %clean. Usunie fake root po zrobieniu pakietu. Nieczęsto
widzi się sekcje %clean odbiegające od tego schematu.
Jest nawet sekcja %post, uruchamiająca ldconfig. Pewnie pakiet dodaje jakieś
biblioteki do systemu. Nie wiem, czy ldconfig będzie tutaj akurat konieczny,
ale nic nie popsuje... /sbin/ldconfig powinien się znajdować w sumie też
w PreReq:, ale on należy do glibc więc zawsze powinien być w systemie i nie
ma sensu go dodawać siłą do zależności.
I na koniec najciekawsze - sekcja %files. Domyślne atrybuty standardowe,
dokopiowanie do dokumentacji paru plików z katalogu ze źródłami, a później
błąd - nadawanie bibliotekom w /lib praw do wykonywania. Biblioteki nie
potrzebują bitu wykonywalności... no dobra, może to nie jest jakiś straszny
błąd, ale po prostu niepotrzebna czynność. Później jeszcze dziwniejsze
kwiatki - nadawanie binarkom praw 0555, co oznacza prawo do odczytu
i wykonania. Dziwne, odbiera się nawet rootowi prawo zapisu. Dziwne, choć
niegroźne - root i tak może wszystko :) Na koniec jeszcze dwa niepotrzebne
przypisania bitów 0644 stronom manuala - przecież one i tak by miały takie
prawa (poprzez %defattr). Ktoś przesadził pisząc tę sekcję akurat.
Niepotrzebne, martwe definicje, poślizg z nadawaniem praw do wykonywania
bibliotekom, ogólnie niezbyt ładna sekcja, choć całkowicie funkcjonalna.
Główna wada: nie używa makr, ale jawnych ścieżek (/usr/share/man itp.).
Pewnie przez to, że nie użyto ./configure i ścieżki są zaszyte na sztywno
w pliku Makefile. Ogólnie plik .spec pewnie by zadziałał, ale nie jest to
spec który by można rozpowszechniać w jakiejś dystrybucji.