| 1. Przygotowanie środowiska budowy pakietów
- sciagamy i instalujemy rpmbuilder: yum install rpm-build
(w Debianie i na systemach bazujących na RPM ze sportowanym apt-getem będzie to komenda: apt-get install rpm-build )
2. Co chcemy zrobić?
Załóżmy, że chcemy przebudować pakiet PHP z wybraną jedną, inną opcją do skryptu configure. Jest dostępny plik php-xxx.src.rpm dla naszej dystrybucji.
UWAGA! NIE powinno się brać src.rpmów z innych dystrybucji chyba, że naprawdę zna się na rzeczy; większość takich rpmów nie będzie działać, mają inne zależności, skrypty i całe środowiska.
Jeżeli nie chcemy przebudowywać pakietu src.rpm, tylko zbudować pakiet od nowa mając w ręku sam plik .spec, to pomijamy poniższe kroki do miejsca, gdzie zajmujemy się plikiem .spec.
3. Przygotowanie pakietu źródłowego
- ściągnąć plik src.rpm:
yum install yum-utils yumdownloader --source <nazwa pakietu>
(w Debianie i na systemach bazujących na RPM ze sportowanym apt-getem będzie to komenda: apt-get source <nazwa pakietu> )
W tym momencie na naszym dysku leży pakiet źródłowy src.rpm.
- rozpakować ('zainstalować') pakiet źródłowy:
rpm -Uvh <nazwa pakietu>.src.rpm
w tym momencie pliki pakietu źródłowego zostały wgrane do specjalnego 'drzewa budowy pakietów' (np. w Fedorze 4 jest to /usr/src/redhat; jeśli w innej wersji jest inaczej, to trzeba poszukać; pomocne może być sprawdzenie listy plików pakietu rpm-build: rpm -ql rpm-build).
4. Część najważniejsza - plik .spec i budowa pakietu
- Kluczowy dla zbudowania pakietu jest plik .spec. Powinien się on znajdować w podkatalogu SPECS/ drzewa budowy pakietów. Jeżeli zainstalowaliśmy pakiet .src.rpm, to plik ten został tam dla nas wgrany. Jeżeli zabieramy się do budowy nowego pakietu, wgrywamy tam ten plik ręcznie.
Mamy zatem plik .spec leżący, załóżmy, że w katalogu /usr/src/redhat/SPECS.
- ściągnąć wymagane do zbudowania tego pakietu inne pakiety (zależności), zwykle będą to w większości pakiety tzw. deweloperskie (-devel), zawierające biblioteki potrzebne do kompilacji.
W Fedorach z yumem: yum-builddep <nazwa pakietu>
W systemach z zainstalowanym apt-getem: apt-get build-dep <nazwa pakietu>
Nie dysponując takim narzędziem trzeba instalować pakiety ręcznie.
- właściwa zmiana parametrów pakietu w pliku .spec - edytujemy plik w katalogu SPECS.
Zawartość pliku .spec jest tematem na osobny artykuł, ale jeśli chcemy dokonać naprawdę prostej poprawki, np. dopisać wspomnianą wyżej jedną małą opcję do skryptu configure, to po prostu odszukajmy wywołanie configure i zmieńmy jego opcje wedle zapotrzebowania.
- no i nareszcie, możemy zbudować nasz pakiet:
UWAGA: w wielu systemach piszemy rpm -<opcje budowania>, ale w Fedorze polecenie rpm -<opcje budowania> zostało wydzielone jako osobna komenda rpmbuild.
rpmbuild -bb <nazwa pakietu>.spec
Opcja -bb każe zbudować nam pakiet binarny.
Po drodze rpmbuilder będzie m.in. rozpakowywał źródła, nakładał na nie ew. patche, potem uruchomi skrypt configure, make i na koniec zapakuje wynik kompilacji do binarnego pakietu (lub pakietów, jeśli plik .spec każe rozbić wynik na kilka podpakietów).
Niestety, w praktyce często budowa nie powiedzie się (bezbłędnie zakończony skrypt powinien zakończyć komunikatem 'exit 0'). Może się tak stać z wielu powodów. Najczęściej jest to brak zależności (pakietów potrzebnych do kompilacji) w systemie. Najłatwiej coś przegapić instalując te zależności ręcznie, ale mogą one nie być spełnione również po użyciu automatu builddep, przez błąd, czy niedopatrzenie, czy nawet zwykłe lenistwo autorów pliku .spec (w którym to pliku powinny być wymienione również wszystkie rzeczy potrzebne do zbudowania pakietu, nie tylko sposób jego budowania). Innym powodem błędów jest niepoprawne wyedytowanie pliku spec. Np. tylko zmiana parametrów configure, bez odpowiednich zmian w definicjach dalej co i gdzie ma iść do docelowych binarnych paczek - i niemożność ostatecznego spaczkowania wyniku kompilacji. W razie problemów na tym etapie nie ma już innego wyjścia, niż uważna lektura komunikatów z budowy pakietu.
Ostatecznie, jeżeli wszystko poszło dobrze (skrypt kończy się 'exit 0'), to wynikowe pakiety leżą w drzewie budowy pakietów w podkatalogu RPMS.
Warto przyjrzeć się jeszcze innym opcjom buildera rpm. Na przykład, gdybyśmy tylko chcieli zbudować pakiet binarny ze źródłowego .src.rpm nie dokonując żadnych zmian (dlaczego możemy tak chcieć? bo akurat nie mieliśmy pakietu binarnego, lub z jakiekolwiek powodu, np. bezpieczeństwo, wydajność - wolimy mieć pakiet skompilowany osobiście) - wydajemy komendę rpmbuild --rebuild. |