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
./configure --prefix=/usr --disable-dependency-tracking --disable-nls
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.

2. Kompilacja. Szybka i pomyślna.

3. Testowa instalacja. Udaje się.

4. Ogląd plików.
usr/
  |-bin/
  |  \-sed
  |-info/
  |   |-dir
  |   |-sed.info
  |   |-sed.info-1
  |   \-sed.info-2
  \-man/
      \-man1/
          \-sed.1
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 :)