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:
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.