Gentoo to niezły filemanager, bardzo rozbudowany i posiadający wiele interesujących funkcji. Ma też oczywiście swoje braki i od jakiegoś czasu jego rozwój stoi w miejscu...

1. Konfiguracja i testowa kompilacja. Program ma skrypt ./configure, więc nie powinno być problemów. Wstępna konfiguracja przechodzi dobrze, ale po ,,make'' widzę ostrzeżenia odnośnie wersji ,,automake'' - skrypty gentoo szukają automake w wersji 1.6, podczas gdy ja mam już 1.7. Nic to, przerywam budowanie, uruchamiam ,,autoreconf'' i jeszcze raz ./configure. Teraz ,,make'' przechodzi już gładko.

2. Testowa instalacja. ,,make install DESTDIR=/shm'' znowu się udaje. To zaczyna być nudne. Oglądam pliki, jakie wejdą w skład pakietu:
usr/
 |-bin/
 |  \-gentoo
 |-etc/
 |  |-gentoorc
 |  \-gentoogtkrc
 \-share/
     \-gentoo/
          \-icons/
              |-AbiWord.xpm
              |-Amiga.xpm
              |-Animation.xpm
              |-Apple.xpm
              |-...
Binarka, dwa pliki konfiguracyjne, jeden katalog z mnóstwem ikonek. Nic specjalnego, ale te pliki konfiguracyjne mnie zastanawiają, tzn. nie wiem, gdzie je umieścić. Nie chcę ich wrzucać bezpośrednio do /etc...
OK, rozmieszczę to w obrębie /usr/X11R6. W ten sposób binarka pójdzie do /usr/X11R6/bin, ikonki do /usr/X11R6/lib/X11/gentoo, a pliki konfiguracyjne do /etc/X11/gentoo.

3. Plik .spec.
%define _prefix /usr/X11R6
%define _sysconfdir /etc/X11/gentoo
%define _datadir /usr/X11R6/lib/X11

Summary: Dwupanelowy filemanager napisany w Gtk+
Name: gentoo
Version: 0.11.34
Release: 1
License: GPL
Group: Pliki
Source: %{name}-%{version}.tar.gz
BuildRoot: /var/tmp/%{name}-%{version}

%description
Gentoo to zaawansowany, dwupanelowy filemanager napisany w Gtk+. Jego wygląd
i funkcjonalność przypominają nieco amigowy program Directory Opus, choć gentoo
nie jest tak rozbudowany.

%prep
%setup -q
autoreconf

%build
%configure --disable-nls --disable-dependency-tracking
make

%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}

%files
%defattr(0644,root,root,0755)
%attr(0755,root,root)%{_bindir}/*
%config(noreplace) %{_sysconfdir}
%{_datadir}/gentoo

%clean
rm -rf %{buildroot} %{_builddir}/%{buildsubdir}
OK, a teraz wyjaśnienia:
Przede wszystkim na szczycie speca pojawiły się 3 linijki %define. Redefiniuję tutaj domyślne wartości niektórych zmiennych, w związku z planowanym przeniesieniem gentoo z /usr do /usr/X11R6. Z listy plików jakie gentoo chce instalować wiem, że muszę zmienić 3 katalogi: katalog z binarkami (%{_bindir}), katalog z konfiguracją (%{_sysconfdir}) oraz katalog na różne dane (/usr/share, czyli %{_datadir}).

Najpierw redefiniuję zmienną %{_prefix}. Co prawda nie musiałem tego robić, ale na wszelki wypadek wolę mieć prawidłowo ustawiony prefiks. Nie muszę dzięki temu zmieniać wartości %{_bindir}, bo w ~/.rpmmacros i tak znajduje się definicja %{_bindir}==%{_prefix}/bin. Zmieniając prefiks zmieniłem od razu %{_bindir}.

Teraz kolej na przeniesienie konfiguracji. Udumałem sobie, że wepchnę od razu te dwa pliki konfiguracyjne do specjalnego podkatalogu o nazwie ,,gentoo''. Żeby ułatwić sobie robotę, definiuję %{_sysconfdir} tak, by wskazywała od razu na ten wymyślony katalog.

W trzeciej linii %define ustawiam katalog %{_datadir}. To w nim wyląduje katalog gentoo zawierający mnóstwo ikonek. Ustawiam go na nieco dziwną wartość, ale to dlatego że w /usr/X11R6 nie używa się katalogu share. Mi to w sumie obojętne, bo i tak nie mam zamiaru tam zaglądać. Ale tak jest ,,bardziej poprawnie'' ;) Następnie standardowa preambuła, w sekcji %prep dodałem dodatkowo uruchomienie programu ,,autoreconf'' w celu odświeżenia całej machiny ./configure.

Sekcja %files też jest standardowa. Odwołuję się do katalogów poprzez makra - teraz widać bardzo wyraźnie, że mimo iż zmieniłem całe położenie programu to w zasadzie niewiele się zmieniło - doszły tylko te %define na szczycie pliku.
W zasadzie nie ma co tutaj już opisywać, na tym etapie artykułu tak prosty (he he :) plik .spec powinien być w miarę czytelny.

4. Budowanie pakietu. ,,rpmbuild -bb gentoo.spec'' posz-ło! Po chwili kompilowania mam gotowy pakiet. Trochę nieufnie go oglądam, ale wygląda na to, że faktycznie się udało za pierwszym podejściem. Hmm, dziwne. No dobra, trzeba zainstalować...

Przy pierwszym uruchomieniu zauważam, że coś jest nie tak - nie ma ikonek przy plikach. Hmm. Czyżby prawa dostępu? Sprawdzam, czy mogę odczytać pliki w /usr/X11R6/lib/X11/gentoo - mogę. Więc to nie jest kwestia uprawnień. Po chwili grzebania w opcjach gentoo znajduję winowajcę - gentoo ma ,,zaszytą'' w domyślnej konfiguracji błędną ścieżkę do ikonek, obecnie wskazuje ona na /usr/X11R6/share/gentoo/icons. Wygląda na to, że gentoo przy generowaniu tej konfiguracji po prostu wzięło $prefix i dokleiło do niego ,,share/gentoo/icons''. To nie moja wina, to skrypty instalujące gentoo są błędne. Zamiast $prefix powinny brać pod uwagę $datadir. No dobra, nieważne. Poprawiam ścieżkę w opcjach gentoo - i wszystko zaczyna działać.
Gdyby to miał być pakiet w jakiejś dystrybucji, to należałoby znaleźć ten błędny kawałek w konfiguracji gentoo i poprawić go - w końcu pakiet powinien działać od razu po zainstalowaniu, prawda? Ale ja nie robię dla żadnej dystrybucji, więc mnie to nie interesuje :)
Podpowiem tylko, że tutaj akurat należałoby zmienić plik ,,gentoorc.in'', linię 2249. Wygląda ona tak:
<path>"@prefix@/share/@PACKAGE@/icons/"</path>
a powinna wyglądać tak:
<path>"@datadir@/@PACKAGE@/icons/"</path>
Po tej małej poprawce wszystko powinno działać ,,od razu''. Ciekawy jest sposób nanoszenia poprawki: Najprościej by było po prostu zmienić bezpośrednio źródła, ale z wielu powodów nie robi się tego w ten sposób. ,,Oficjalny'' (i w sumie najrozsądniejszy) sposób to stworzenie odpowiedniej łatki (patcha) który by skorygował wadliwy plik/pliki. Takie patche załącza się do pakietu za pomocą tagów ,,PatchX:'' w preambule i aplikuje makrami ,,%patchX'' w sekcji %prep. Ale o tworzeniu drobnych patchy wspomnę nieco później.