A teraz kolej na nieco mniejsze narzędzie - sed-a. Sed to jedno
z najpopularniejszych narzędzi w ,,GNU toolbox'', więc nadaje się całkiem
nieźle jako przykład.
1. Konfiguracja. Skrypt ./configure nie ma wielu ciekawych opcji, ja
decyduję się na
Wyłączam NLS, przy czym tutaj mam dodatkowy argument by tak robić - sed nie
ma w obecnej chwili polskiego tłumaczenia (wystarczy zajrzeć do katalogu
"po". Opcja ,,--disable-dependency-tracking'' z kolei jest warta
zapamiętania - jeśli ./configure ją udostępnia, to warto jej użyć. Można tym
,,urwać'' ułamek sekundy/sekundę z każdego wywołania kompilatora. Ma to
swoje drobne efekty uboczne przy wielokrotnej kompilacji w tym samym
katalogu źródłowym, ale to nie dotyczy nigdy pakietów RPM.
Wszystko w normie, tyle że te strony info mi się nie podobają. Nie lubię
rozbijania stron info na kilka plików. Strony info mogą być, tak jak tutaj,
rozbite na kilka plików (tutaj 3), albo mogą zostać połączone w jeden
über-plik info. Zalety-wady: Kilka mniejszych plików jest łatwiejszych dla
obsłużenia przez komputer, wymaga mniej pamięci przy przetwarzaniu (w
pamięci znajduje się naraz tylko jeden ,,rozdział'', trzeba odczytać mniej
danych przy pokazywaniu strony). Ale przy współczesnych komputerach te cechy
nie są już zaletami. Ja wolę mieć wszystkie strony info programu zbite
w jeden plik, bo wtedy oszczędzam miejsce, zwłaszcza gdy strony będą
skompresowane (mniejsza strata na nie-do-końca-wypełnionych blokach
filesystemu - w przypadku 1 pliku jest to jeden ,,niepełny'' blok,
w przypadku trzech szansa na zmarnowanie odrobiny miejsca zwiększa się
trzykrotnie, po doliczeniu ew. zysków z kompresji über-pliku i uwzględnieniu
rozmiarów niektórych stron info (np. glibc-info liczy się w megabajtach)
oszczędności mogą być spore. No i mniejszy chaos panuje potem
w /usr/share/info.
Nie jest to konieczny zabieg, ale ja lubię tak robić. Taki prywatny odchył
mam.
Tak więc te strony info pójdą do poprawki. Nie jest to taki trudne,
wystarczy je wygenerować na nowo. Robi się to programem ,,makeinfo'', bo
strony .info to tylko ,,produkt końcowy'' powstający z tzw. źródeł texinfo.
Plan działania wygląda tak: zainstalować pliki, usunąć zawartość katalogu
info, wejść do niego, z niego wywołać ,,makeinfo --no-split'' (opcja
,,--no-split'' powoduje tworzenie jednego über-info)... jedyny hak, to
znalezienie plików źródłowych. Ale w katalogu seda widzę katalog ,,doc'',
wchodzę do niego... bingo! Leżą tutaj te ,,gotowe'' już pliki sed.info*,
leży też plik sed.texi (pliki źródłowe zwykle będą miały te same nazwy, co
pliki wynikowe. Tyle że będą miały rozszerzenie .texi). Warto sprawdzić
teraz, czy te pliki da się na nowo wygenerować - bo czasem, jeśli źródła
.texi są bardzo złożone, to mogą być porozwalane po kilku podkatalogach,
trzeba wtedy powskazywać wszystkie katalogi z ,,inkludami'' (opcją -I
programu ,,makeinfo'' - zupełnie jak w przypadku gcc). Najpierw sobie usunę
wszystkie pliki sed.info*, potem uruchamiam ,,makeinfo --no-split
sed.texi''. Poszło bez zająknięcia. Faktycznie, powstał jeden duży plik
sed.info. Czyli podczas budowania pakietu rpm też się to uda, mam
nadzieję.
A, jeszcze coś - oprócz stron info w katalogu widać też tajemniczy plik
,,dir'' - jest to indeks stron. On też nie ma prawa znaleźć się
w pakiecie.
Jeszcze jedna sprawa - po zainstalowaniu stron info trzeba je będzie
zarejestrować w ,,globalnym'', systemowym indeksie stron info (dlatego ten
indeksik z seda nie może zostać zainstalowany razem z pakietem - bo by
nadpisał (uszkodził) systemowy indeks - systemowy indeks zawiera spis
wszystkich stron info w systemie, a ten tutaj zawiera tylko te strony, które
zastał w ,,fake root'' - czyli tylko stronę seda). Zarejestrowanie będzie
wymagało dodania sekcji %post. Oczywiście do kompletu potrzebne będzie ew.
wyrejestrowanie przy odinstalowywaniu, czyli sekcja %preun.
5. Pisanie speca. Zaczynam ze szkieletem i po
uzupełnieniu mam takie coś:
Summary: Edytor strumieniowy o imponujących możliwościach
Name: sed
Version: 4.0.7
Release: 1
License: GPL
Group: Tekst
Source: %{name}-%{version}.tar.gz
BuildRoot: /var/tmp/%{name}-%{version}
BuildRequires: /usr/bin/makeinfo
PreReq: /sbin/install-info
%description
SED jest edytorem strumieniowym. Edytor strumieniowy przekształca tekst
przyjmowany poprzez strumień, pobieranego z rurki FIFO lub pliku. Choć
w pewnym stopniu przypomina to pracę edytorów skryptowalnych (jak np. ED),
SED wykonuje swoje zadanie w jednym przebiegu i w związku z tym jest
znacznie wydajniejszy. Ale to zdolność do filtrowania tekstu z FIFO wyróżnia
SED-a na tle innych edytorów.
%clean
rm -rf %{buildroot} %{_builddir}/%{buildsubdir}
%prep
%setup -q
%build
%configure --disable-dependency-tracking --disable-nls
make
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
cd %{buildroot}%{_infodir}
rm -rf sed.info* dir
makeinfo --no-split %{_builddir}/%{buildsubdir}/doc/sed.texi -I %{_builddir}/%{buildsubdir}/doc
%files
%defattr(0644,root,root,0755)
%attr(0755,root,root)%{_bindir}/*
%{_mandir}/man*/*.gz
%{_infodir}/*.gz%post
install-info %{_infodir}/sed.info.gz %{_infodir}/dir
%preun
install-info --delete %{_infodir}/sed.info.gz %{_infodir}/dir
Objaśnień będzie tym razem całkiem sporo potrzebne. W preambule doszły dwa
tagi: PreReq: i BuildRequires:. Przy budowie pakietu potrzebne jest
,,makeinfo'' (by zregenerować strony info), a z kolei do instalacji
potrzebne jest install-info (by zarejestrować strony info w indeksie
/usr/share/dir).
Tutaj można rozważać, czy lepiej jest użyć w zależności nazwy programu
(koniecznie ze ścieżką!), czy też może nazwy pakietu z którego to coś
pochodzi. Ja jestem za nazwą programu jednak, bo co prawda i makeinfo,
i install-info pochodzą z pakietu texinfo, ale widywałem już dystrybucje
w których pakiet ,,texinfo'' nie istniał, bo był porozbijany na mniejsze.
Dlatego lepiej jest IMO wymagać konkretnego programu niż jakiegoś pakietu
o zadanej nazwie. Bo pakiet może się nazywać w jakiejś distro inaczej, ale
przecież nikt nie zmieni nazwy binarki ,,install-info''. Prawda?
Zmieniłem sekcję %clean! Wcześniej odwoływałem się do katalogu
z rozpakowanymi źródłami poprzez %{_builddir}/%{name}-%{version}. Co było całkiem ładne,
tyle że gdy katalog nazywał się inaczej, według innego schematu, to trzeba
było to poprawiać. Ale przypadkiem wertowałem sobie pliki źródłowe rpm-a,
i ,,odkryłem'' że makro %setup ustawia pewną zmienną tak, by zawierała nazwę
katalogu do którego wypakowano źródła. A zmienna ta to właśnie %{buildsubdir}. Czyli zamiast kombinować
z %{name}-%{version} mogę tu po prostu wpisać %{buildsubdir}. Łał. Teraz
nawet jeśli za pomocą opcji ,,-n'' makra %setup zmienię nazwę katalogu ze
źródłami, to nie muszę się martwić o sekcję %clean - bo ona się
automatycznie dostosuje.
Sekcję %build sobie darujmy, za to sekcja %install jest ciekawa. Co też
takiego się tutaj dzieje... po pierwsze, instaluję pliki. Potem wchodzę do
katalogu /var/tmp/sed-4.0.7/usr/share/info,
i usuwam wszystkie pliki ,,sed.info*'' oraz plik indeksu ,,dir''. Potem
wywołuję ,,makeinfo --nosplit'', jako argument biorąc plik doc/sed.texi
z katalogu ze źródłami (znowu używam nowo odkrytej zmiennej %{buildsubdir}
:)
Ponieważ jednak jestem w katalogu innym niż źródła texinfo, to na wszelki
wypadek podaję tamten ,,oryginalny'' katalog na liście inkludów za pomocą
opcji ,,-I'' - na wszelki wypadek.
Sekcja %files chyba nie wymaga tutaj objaśnień, za to doszły nowe sekcje
%post i %preun. Wywołują ,,install-info'', z parametrami którymi są strona
info do zarejestrowania i plik indeksu, w którym należy to coś
zarejestrować. Proste, wystarczy zajrzeć do manuala install-info.
6. Budowanie pakietu. Wpisuję ,,rpmbuild -ba --rmsource sed.spec'',
dostaję zbudowane pakiety binarny i źródłowy, źródła z ~/rpm/SOURCES zostają usunięte. Sukces na całej linii.
Czuję się dobry :)