FVWM jest często zmieniającym się (a zarazem dosyć sporym) programem.
Dlatego używanie wersji z CVS ma swoje zalety - po pierwsze ma się zawsze
dostęp do najnowszych ,,bajerów'', po drugie nie trzeba czekać aż
developerzy wydadzą kolejną oficjalną ,,release'', po trzecie w razie
aktualizacji kodu przez CVS pobiera się tylko poprawki do już posiadanego
kodu - a przy pobieraniu normalnych paczek ze źródłami za każdym razem
ciągnie się też megabajty kodu, który wcale się nie zmienił od ostatniej
,,release''.
1. Źródła umiejscowione standardowo, ~/CVS/fvwm.
2. Próbna instalacja nie jest zbyt skomplikowana. FVWM z CVS nie
posiada co prawda ani ./configure, ani nawet ./autogen.sh, ale wystarczy
uruchomić odpowiedni zestaw poleceń z pakietu autoconf/automake:
aclocal
autoheader
automake -af
autoconf
by otrzymać skrypt konfiguracyjny ./configure.
Przeglądam sobie opcje i decyduję się na:
wyłączam wsparcie dla gnome-libs (ale nie dla hintów pochodzących od
aplikacji Gnome), wyłączam inne opcje których nie potrzebuję, włączam Xft.
Xft co prawda i tak jest włączane zawsze gdy to tylko możliwe, ale jeśli
explicite podam taką opcję, to ./configure będzie
wiedzieć, że bardzo mi na tej opcji zależy. I jeśli nie będzie w stanie użyć
Xft, to wywali się z błędem przy konfigurowaniu. A potem jeszcze wyłączam
wsparcie dla Gtk+ oraz biblioteki integracji z Perlem (nie korzystam z tych
funkcji, więc po co je kompilować/instalować?)
Aha, ten numer ,,--with-gtk-prefix=/dev/null'' to jedyny sposób, by wyłączyć
kompilowanie wsparcia dla Gtk+ jeśli posiada się gtk w systemie. Po prostu
fvwm nie oferuje żadnego ,,--disable-gtk''.
Jestem już prawie gotowy do kompilacji, ale jest jeszcze jedna rzecz, którą
muszę zmienić. Ustawienia myszy. Moja mysz ma pięć przycisków i rolkę
(czyli, z punktu widzenia X-ów, jest to siedem przycisków). Fvwm domyślnie
przystosowany jest tylko do ,,normalnych'' myszy (trzy przyciski+rolka).
W zasadzie to jest tak, że niezależnie od tych ustawień moje przyciski i tak
będą działać. Po prostu fvwm będzie ostrzegał przy próbie użycia
,,nadmiarowych'' przycisków, że jednak skompilowany to on był z myślą
o mniej zmutowanych myszach. Ja tutaj tylko wyłączę te ostrzeżenia.
Informacja o liczbie przycisków znajduje się w pliku libs/defaults.h. Jest tam linijka
#define NUMBER_OF_MOUSE_BUTTONS 5
którą muszę zmienić. Kopiuję plik libs/defaults.h do libs/defaults.h.new,
edytuję libs/defaults.h.new i zmieniam ,,5'' na ,,7''. Teraz, pozostając
w głównym katalogu ze źródłami fvwm, generuję odpowiedniego patcha
poleceniem
Dlaczego tak robię? Bo muszę zmieniać tak źródła przy każdej kompilacji fvwm
(muszę ustawiać liczbę przycisków myszy). Więc najprościej jest wygenerować
małego patcha, którego rpm później będzie aplikował na źródła. Więc mam już
tego mojego patcha w pliku fvwm-mouse.patch, przenoszę go do ~/rpm/SOURCES (patche są przez rpm pobierane z katalogu
,,źródeł'').
Dobra, teraz mogę spokojnie uruchomić kompilację. Ta po jakimś czasie się
kończy. Teraz tylko
Dużo tego, psia jego mać. Dobra... nie powinno być trudno, atrybuty plików
w obrębie katalogów są spójne, więc wyliczanka jak w przypadku mc nie będzie
konieczna. Katalog bin/ w normie, jeden katalog
libexec/fvwm/2.5.7/ z modułami (które muszą mieć
atrybut +x)... ten ,,libexec'' nie jest dozwolony w świetle Filesystem Hierarchy Standard i po
przetworzeniu przez mój rpm zamieni się to w lib/fvwm/2.5.7/... ale to nie jest teraz specjalnie
istotne.
Manuale jak manuale, ale prawie cały katalog share/fvwm zostanie usunięty - on zawiera tylko
przykładowe konfiguracje i skrypty konfiguracyjne dla modułu FvwmScript...
a ja nie mam zamiaru korzystać z tego chłamu, w końcu moja własna
konfiguracja jest o wiele lepsza ;) Pozostać musi w nim tylko plik
ConfigFvwmDefaults
I słowo żalu: team FVWM nie ma najwidoczniej nikogo, kto by tak naprawdę
znał się na mechanizmach autoconfa. Bo ich ,,firmowy'' skrypt ./configure
niestety ma wady, których nikt jakoś nie usuwa (choć zgłosiłem te błędy
autorom FVWM). Wady te sprowadzają się do jednego w sumie: nawet gdy
wyłączyłem wsparcie dla gtk+ i dla integracji z Perlem fvwm zainstalował
dużo plików które wymagają gtk+ i interfejsu fvwm-perl. A to oznacza, że
muszę te pliki samodzielnie namierzyć i usunąć. Robię to z dwóch powodów:
Ordnung muss sein, a dodatkowo nie mogę sobie pozwolić na
pozostawienie w pakiecie choćby jednego skryptu używającego fvwm-owskich
modułów Perla (rpm je wyniucha i wciągnie na listę zależności, a potem przy
instalacji będzie żądał tych perlowych rozszerzeń).
Więc do dzieła, zacznę od bin/:
Najpierw lecą wszystkie skrypty używające Perla (file okazuje się tu nieocenioną pomocą): fvwm-convert-2.4 fvwm-convert-2.6 fvwm-menu-desktop
fvwm-menu-directory fvwm-menu-headlines fvwm-menu-xlock fvwm-perllib.
Co prawda część tych skryptów pewnie by zadziałała i z ,,gołym'' Perlem, ale
ja i tak nigdy nie używałem żadnego z nich, więc... poza tym, jeśli usunę je
wszystkie, to fvwm jako pakiet uniezależni się całkowicie od Perla.
Teraz niewiele już zostało programów w bin/. Na
pewno wyleci stąd skrypt fvwm-bug (bo i tak nie
wysyłam klasycznym bugreportów, wylewam swoje żale od razu na liście
dyskusyjnej fvwm-workers :). Wylecą stąd także fvwm-root i symlink do niego, xpmroot - ten program służy do ustawiania tła, ale
ustawianiem teł w moim systemie i tak zajmuje się dużo lepszy Esetroot
(szybszy i obsługuje więcej formatów plików graficznych). Zostały tutaj już
tylko cztery pliki, i one mi wystarczą.
Teraz kolej na libexec/fvwm/2.5.7/. Stąd na sto
procent muszą wylecieć pliki FvwmCommand* (nie
używam tego prymitywizmu, wolę ,,pełnowymiarowe'' FvwmConsole). Usunę też
FvwmConsoleC.pl, bo to tylko głupia nakładka która
może dodać kilka niepotrzebnych IMO cech do edytora linii w FvwmConsole
(przecież FvwmConsole używa biblioteki readline, tego nie trzeba sztucznie
rozszerzać - wystarczy normalnie skonfigurować! Ale hej, najwidoczniej ktoś
w Fvwm-devel-team poza Perlem już świata nie widzi. Z armaty do
motylka...
Usuwam też moduły *Debug, nie będą mi potrzebne.
Zwłaszcza FvwmGtkDebug, który by i tak nie działał bez fvwm-perl i FvwmGtk.
O, moduł FvwmPerl... też do śmieci. Tak samo FvwmSave*, one też są wadliwie skonstruowane (mają niby
robić coś w stylu session-management, ale nie umieją :) FvwmWindowMenu też jest do wywalenia, on wymaga
integracji fvwm-perl. FvwmTalk też jest do
usunięcia. FvwmCascade i FvwmTile też są do usunięcia, bo to tylko owijki na
FvwmRearrange.
Do /dev/null wędruje też na pewno FvwmBacker
(zmienia tło przy zmianie biurka), FvwmBanner
(wyświetla logo przy starcie FVWM), FvwmDragWell
(oferuje malutkie okienko, z którego można ,,wysłać'' obiekt XDnD, nie wiem
do czego to by się mogło przydać), FvwmIconBox (e
tam, wolę FvwmIconMan), FvwmTaskBar (nie lubię.
Brzydki i nie lubię upodabniania do Windows95), FvwmTheme (ten moduł i tak nie jest nigdy ładowany, jego
funkcjonalność jest już od dawna wbudowana na stałe w Fvwm). Usuwam też
FvwmWharf (to samo mogę osiągnąć za pomocą
FvwmButtons) i FvwmWinList (da się zastąpić przez
FvwmIconMan). A na koniec usuwam też ,,legacy symlink'' FvwmAudio. Kasuję FvwmAuto (da
się zastąpić bardziej uniwersalnym FvwmEvent) oraz FvwmScroll i FvwmAnimate (nie
mam potrzeby używać). Na koniec wywalam też FvwmScript i FvwmForm - ja
szybciej napiszę odpowiednią mini-aplikację w Gtk+ która będzie ładniejsza,
mniejsza i szybsza niż gdybym miał się uczyć jakichś dziwnych języków
skryptowych. Wywalam też FvwmCpp i FvwmM4, bo moje konfiguracje FVWM nie są aż tak złożone,
bym musiał używać makrodefinicji i specjalnych parserów. OK, reszta modułów
może pozostać :)
Ostra selekcja, ale ja już wiem jakich modułów używam, a jakich nie
dotknąłem przez ostatnie pół roku. Więc wiem co mogę wywalić.
Teraz należy jeszcze tak samo oczyścić man/man1.
W końcu do /dev/null poleci duża część binarek, więc ich manuale też nie
będą mi potrzebne. Usunę pliki fvwm-convert*, fvwm-menu-*, fvwm-perllib.1,
fvwm-bug.1, fvwm-root.1, xpmroot.1, FvwmCommand.1, FvwmConsoleC.pl.1,
*Debug.1, FvwmPerl.1, FvwmSave*, FvwmWindowMenu.1, FvwmBacker.1,
FvwmBanner.1, FvwmDragWell.1, FvwmIconBox.1, FvwmTaskBar.1, FvwmWharf.1,
FvwmWinList.1, FvwmAuto.1, FvwmScroll.1, FvwmAnimate.1, FvwmForm.1,
FvwmScript.1, FvwmCpp.1 i FvwmM4.1. O, jak widzę znajduje się tutaj też
manual FvwmGtk.1 dla modułu, który nawet nie został skompilowany
i zainstalowany (wspominałem już, że w fvwm-devel-team najwidoczniej nie ma
nikogo, kto by _naprawdę_ znał się na autoconfie?). No cóż, ten manual też
idzie do śmieci.
Specjalnie za to pozostawiam manual do FvwmTheme. Co prawda sam moduł jest
już ,,wbudowany'' w fvwm, ale jego manual ciągle zawiera informacje które
nie wywędrowały do głównego manuala fvwm. Więc powinien pozostać.
OK, to by było wszystko.
3. Plik .spec
Summary: F(?) Virtual Window Manager
Name: fvwm
Version: %(date +%Y%m%d)
Release: 1
License: GPL
Group: PowłokiURL: http://www.fvwm.org/
BuildRoot: /var/tmp/%{name}-%{version}
Patch0: %{name}-mouse.patch
%description
FVWM to złożony i wszechstronny menadżer okien dla systemu X Window.
Jest zgodny z normami ICCCM, EWMH, obsługuje również Gnome/Mwm/olwm Hints.
Duże możliwości, wysoka konfigurowalność, szybkość i nieduże wymagania.
Żadnych ,,ustawień domyślnych''.
%prep
%setup -c -T -q
cp -a ~/CVS/fvwm/* .
%patch -p1
aclocal
autoheader
automake -af
autoconf
%build
%configure --without-gnome --disable-dependency-tracking \
--disable-command-log --disable-debug-msgs --disable-sm \
--disable-nls --enable-shape --enable-xrender \
--disable-xinerama --disable-bidi --enable-xft \
--with-gtk-prefix=/dev/null --disable-perllib
make
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
mv %{buildroot}%{_datadir}/fvwm/{ConfigFvwmDefaults,.hid}
rm -rf %{buildroot}%{_datadir}/fvwm/*
mv %{buildroot}%{_datadir}/fvwm/{.hid,ConfigFvwmDefaults}
rm %{buildroot}%{_bindir}/{fvwm-convert-2.4,fvwm-convert-2.6,\
fvwm-menu-desktop,fvwm-menu-directory,fvwm-menu-headlines,\
fvwm-menu-xlock,fvwm-perllib,fvwm-bug,fvwm-root,xpmroot}
rm %{buildroot}%{_libexecdir}/fvwm/*/{FvwmCommand*,FvwmConsoleC.pl,*Debug,\
FvwmPerl,FvwmSave*,FvwmWindowMenu,FvwmTalk,FvwmCascade,FvwmTile,FvwmBacker,\
FvwmBanner,FvwmDragWell,FvwmIconBox,FvwmTaskBar,FvwmTheme,FvwmWharf,\
FvwmWinList,FvwmAudio,FvwmAuto,FvwmScroll,FvwmAnimate,FvwmScript,FvwmForm,\
FvwmCpp,FvwmM4}
rm %{buildroot}%{_mandir}/man1/{fvwm-convert*,fvwm-menu-*,fvwm-perllib.1,\
fvwm-bug.1,fvwm-root.1,xpmroot.1,FvwmCommand.1,FvwmConsoleC.pl.1,*Debug.1,\
FvwmPerl.1,FvwmSave*,FvwmWindowMenu.1,FvwmBacker.1,FvwmBanner.1,\
FvwmDragWell.1,FvwmIconBox.1,FvwmTaskBar.1,FvwmWharf.1,FvwmWinList.1,\
FvwmAuto.1,FvwmScroll.1,FvwmAnimate.1,FvwmForm.1,FvwmScript.1,FvwmCpp.1,\
FvwmM4.1,FvwmGtk.1}
%files
%defattr(0644,root,root,0755)
%attr(0755,root,root)%{_bindir}/*
%{_mandir}/man*/*.gz
%attr(0755,root,root)%{_libexecdir}/fvwm
%clean
rm -rf %{buildroot} %{_builddir}/%{buildsubdir}
Preambuła jest prosta. Dodałem tylko wskazanie na URL strony projektu FVWM
(nie, to nie jest potrzebne :), pojawiła się też linijka
Patch0: %{name}-mouse.patch
która określa używany przez pakiet plik z patchem (przyciski myszy, jeśli
ktoś zapomniał).
Sekcja %prep nie jest specjalnie wyuzdana, ot, założyć katalog, wejść do
niego, skopiować tam repozytorium CVS. Gdy pliki są już na miejscu,
aplikowany jest patch
%patch -p1
a potem konieczna do stworzenia pliku ./configure
sekwencja poleceń aclocal, autoheader itp.
W sekcji %install po zainstalowaniu plików wywalam zawartość katalogu
/usr/share/fvwm (wystarczy ten jeden plik do zachowania ,,ukryć'' - linijka
,,rm -rf *'' nie wychwyci plików ukrytych''), a potem w trzech sporych
bloczkach wywalam niektóre pliki z %{_bindir},
%{_libexecdir} oraz %{_mandir} - tak, jak to wcześniej motywowałem.
Sekcja %files jest krótka, to wpisów ,,standardowych'' doszedł tylko ten
załączający zawartość %{_libexecdir} i nakładający wszystkiemu wewnątrz
atrybut wykonywalności (tam siedzą moduły fvwm, one muszą być
wykonywalne).
4. Budowanie pakietu
Uruchamiam rpmbuild -bb fvwm.spec. Przelatują
komunikaty, patch się nakłada, aclocal i spółka, konfiguracja, kompilacja...
dobrze, jeśli nie wywali się przy budowaniu listy plików... ależ to trwa...
U mnie skończyło kompilację po równych dziesięciu minutach. I udało się :)
Pamiętasz tę długaśną listę plików po domyślnej instalacji FVWM w /shm? Mój
pakiet rpm ma teraz taką zawartość: