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:
./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 --prefix=/usr
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
diff -u libs/defaults.h libs/defaults.h.new >fvwm-mouse.patch
Możesz obejrzeć gotowego patcha.

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
make install DESTDIR=/shm
i mogę już oszacować uszkodze^W wyniki ;)
usr/
 |-bin/
 |  |-FvwmCommand
 |  |-fvwm
 |  |-fvwm-bug
 |  |-fvwm-config
 |  |-fvwm-convert-2.4
 |  |-fvwm-convert-2.6
 |  |-fvwm-menu-desktop
 |  |-fvwm-menu-directory
 |  |-fvwm-menu-headlines
 |  |-fvwm-menu-xlock
 |  |-fvwm-perllib
 |  |-fvwm-root
 |  |-fvwm2
 |  \-xpmroot
 |-libexec/
 |    \-fvwm/
 |        \-2.5.7/
 |            |-FvwmAnimate
 |            |-FvwmAudio
 |            |-FvwmAuto
 |            |-FvwmBacker
 |            |-FvwmBanner
 |            |-FvwmButtons
 |            |-FvwmCascade
 |            |-FvwmCommand.pm
 |            |-FvwmCommand.sh
 |            |-FvwmCommandS
 |            |-FvwmConsole
 |            |-FvwmConsoleC
 |            |-FvwmConsoleC.pl
 |            |-FvwmCpp
 |            |-FvwmDebug
 |            |-FvwmDragWell
 |            |-FvwmEvent
 |            |-FvwmForm
 |            |-FvwmGtkDebug
 |            |-FvwmIconBox
 |            |-FvwmIconMan
 |            |-FvwmIdent
 |            |-FvwmM4
 |            |-FvwmPager
 |            |-FvwmPerl
 |            |-FvwmProxy
 |            |-FvwmRearrange
 |            |-FvwmSave
 |            |-FvwmSaveDesk
 |            |-FvwmScript
 |            |-FvwmScroll
 |            |-FvwmTalk
 |            |-FvwmTaskBar
 |            |-FvwmTheme
 |            |-FvwmTile
 |            |-FvwmWharf
 |            |-FvwmWinList
 |            \-FvwmWindowMenu
 |-man/
 |  \-man1/
 |     |-FvwmAnimate.1
 |     |-FvwmAuto.1
 |     |-FvwmBacker.1
 |     |-FvwmBanner.1
 |     |-FvwmButtons.1
 |     |-FvwmCommand.1
 |     |-FvwmConsole.1
 |     |-FvwmConsoleC.pl.1
 |     |-FvwmCpp.1
 |     |-FvwmDebug.1
 |     |-FvwmDragWell.1
 |     |-FvwmEvent.1
 |     |-FvwmForm.1
 |     |-FvwmGtk.1
 |     |-FvwmGtkDebug.1
 |     |-FvwmIconBox.1
 |     |-FvwmIconMan.1
 |     |-FvwmIdent.1
 |     |-FvwmM4.1
 |     |-FvwmPager.1
 |     |-FvwmPerl.1
 |     |-FvwmProxy.1
 |     |-FvwmRearrange.1
 |     |-FvwmSave.1
 |     |-FvwmSaveDesk.1
 |     |-FvwmScript.1
 |     |-FvwmScroll.1
 |     |-FvwmTaskBar.1
 |     |-FvwmTheme.1
 |     |-FvwmWharf.1
 |     |-FvwmWinList.1
 |     |-FvwmWindowMenu.1
 |     |-fvwm-bug.1
 |     |-fvwm-config.1
 |     |-fvwm-convert-2.2.1
 |     |-fvwm-convert-2.4.1
 |     |-fvwm-convert-2.6.1
 |     |-fvwm-menu-desktop.1
 |     |-fvwm-menu-directory.1
 |     |-fvwm-menu-headlines.1
 |     |-fvwm-menu-xlock.1
 |     |-fvwm-perllib.1
 |     |-fvwm-root.1
 |     |-fvwm.1
 |     \-xpmroot.1
 \-share/
    \-fvwm/
        |-ConfigFvwmBacker
        |-ConfigFvwmButtons
        |-ConfigFvwmDefaults
        |-ConfigFvwmIconBox
        |-ConfigFvwmIconMan
        |-ConfigFvwmIdent
        |-ConfigFvwmPager
        |-ConfigFvwmProxyDefaults
        |-ConfigFvwmScroll
        |-ConfigFvwmSetup
        |-ConfigFvwmTaskBar
        |-ConfigFvwmWinList
        |-FvwmForm-Capture
        |-FvwmForm-Form
        |-FvwmForm-QuitVerify
        |-FvwmForm-Rlogin
        |-FvwmForm-RootCursor
        |-FvwmForm-Setup
        |-FvwmForm-Talk
        |-FvwmForm-TalkHelp
        |-FvwmScript-BaseConfig
        |-FvwmScript-BellSetup
        |-FvwmScript-Buttons
        |-FvwmScript-Colorset
        |-FvwmScript-ComExample
        |-FvwmScript-Date
        |-FvwmScript-FileBrowser
        |-FvwmScript-Find
        |-FvwmScript-KeyboardSetup
        |-FvwmScript-PointerSetup
        |-FvwmScript-Quit
        |-FvwmScript-ScreenDump
        |-FvwmScript-ScreenSetup
        |-FvwmScript-Setup95
        |-FvwmScript-WidgetDemo
        |-fvwm-script-ComExample.pl
        |-fvwm-script-setup95.pl
        \-system.fvwm2rc-sample-95
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łoki
URL: 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ść:
usr/
 |-bin/
 |  |-FvwmCommand
 |  |-fvwm
 |  |-fvwm-config
 |  \-fvwm2
 |-lib/
 |  \-fvwm/
 |     \-2.5.7/
 |        |-FvwmButtons
 |        |-FvwmConsole
 |        |-FvwmConsoleC
 |        |-FvwmEvent
 |        |-FvwmIconMan
 |        |-FvwmIdent
 |        |-FvwmPager
 |        |-FvwmProxy
 |        \-FvwmRearrange
 \-share/
     |-fvwm/
     |   \-ConfigFvwmDefaults
     \-man/
        \man1/
          |-FvwmButtons.1.gz
          |-FvwmConsole.1.gz
          |-FvwmEvent.1.gz
          |-FvwmIconMan.1.gz
          |-FvwmIdent.1.gz
          |-FvwmPager.1.gz
          |-FvwmProxy.1.gz
          |-FvwmRearrange.1.gz
          |-FvwmTheme.1.gz
          |-fvwm-config.1.gz
          \-fvwm.1.gz
A przy okazji jest o blisko 3MB mniejszy. Ziarnko do ziarnka...