Tworzenie paczek dla FreeBSD
Czasami zdarza się, że instalujemy ze źródeł program, który nie jest
dostępny w standardowej kolekcji portów. Deinstalacja takiego oprogramowania
może stwarzać sporo kłopotów, ponieważ musimy znaleźć i usunąć wszystkie pliki utworzone podczas instalacji, zwykle w podkatalogach /usr/local.
Jednym z rozwiązań jest stworzenie odpowiedniej paczki *.tbz lub *.tgz,
za pomocą narzędzia pkg_create. Cały proces sprowadza się do wykonania
ręcznie czynności, które normalnie wykonują się automatycznie, gdy w drzewie
portów wydamy polecenie:
Dodatkową zaletą takiego rozwiązania jest to, że tak utworzony pakiet, można
później zainstalować na innej maszynie (o ile spełnione są wszystkie zależności) lub po prostu zachować na przyszłość w celu uniknięcia ponownej kompilacji. Proces tworzenia paczki można opisać skrótowo w 3 krokach:
- Instalacja danego programu do katalogu tymczasowego.
- Stworzenie listy wszystkich utworzonych plików i katalogów.
- Wywołanie pkg_create z odpowiednimi parametrami (jednym z nich jest stworzona wcześniej lista plików, tzw. packing-list).
W wyniku dostajemy gotową do zainstalowania np. w /usr/local paczkę.
Bardziej szczegółowy opis przedstawię na przykładzie aktualnej wersji kadu
(0.4.1), której nie ma jeszcze w portach.
-
Ściągamy źródła i instalujemy kadu do dowolnego katalogu tymczasowego, np.:
# ./configure --prefix=/tmp/paczka
# gmake && gmake install - W celu stworzenia listy zwykłych plików utworzonych w /tmp/paczka, napisałem prosty skrypt:
#-- stworz_liste.sh --
#! /bin/sh
for i in `find $1 -type d`; do
if [ "$i" != "$1" ]; then
for j in `ls $i`; do
if [ ! -d $i/$j ]; then
echo $i/$j
fi
done
fi
done
#--------------------który następnie wykonuje:
# sh stworz_liste.sh /tmp/pakiet > pliki
# cat pliki
/tmp/paczka/include/libgadu-config.h
/tmp/paczka/include/libgadu.h
/tmp/paczka/include/kadu/about.h
(...)Żeby wyodrębnić katalogi utworzone w /tmp/paczka wystarczy:
# find /tmp/paczka -type d > katalogi
# cat katalogi
/tmp/paczka/
/tmp/paczka/include
/tmp/paczka/include/kadu
/tmp/paczka/include/kadu/modules
(...)Wspomniany wcześniej packing-list otrzymamy przez połączenie dwóch utworzonych powyżej plików ('pliki' i 'katalogi'), ale...
Po pierwsze trzeba pozbyć się początkowej ścieżki /tmp/paczka z każdej linii, ponieważ w przyszłości będę chciał zainstalować kadu do /usr/local.
Napis "/tmp/paczka" to 11 znaków, więc najprościej:
# cat pliki | cut -b 11- > pliki_
# cat katalogi | cut -b 11- > katalogi_Po drugie należy usunąć z pliku zawierającego listę katalogów linie typu:
bin
include
lib
share/docaby przy usuwaniu pakietu nie stracić ich przypadkowo z /usr/local. Co prawda
pkg_delete nie usuwa katalogów, które nie są puste, ale ostrożności nigdy za
wiele ;).Po trzecie trzeba posortować listę zwykłych plików alfabetycznie, a listę
katalogów dopisać do niej na koniec, ale posortowaną w odwrotnej kolejności
(inaczej pkg_delete pozostawi puste katalogi):# cat pliki_ | sort > pliki && rm pliki_
# cat katalogi_ | sort -r >> pliki && rm katalogi*
# mv pliki packing-listLista jest gotowa, pozostaje jeszcze dodać do niej odpowiednie znaczniki,
które będą czytane przez pkg_create. Na samym początku pliku dopisujemy:@name kadu-0.4.1
@cwd /usr/local
@srcdir /tmp/paczkaIch znaczenie:
@name to nazwa pakietu
@cwd to katalog do którego będzie zainstalowany program z paczki
@srcdir to katalog z którego będą pobierane pliki podczas tworzenia paczkiDo linii zawierających katalogi należy jeszcze dopisać @dirrm, czyli np.:
@dirrm include/kadu/modules
@dirrm include/kadu
(...)Co spowoduje usunięcie tak oznaczonych katalogów przez pkg_delete.
-
Nie pozostaje nic innego jak stworzyć paczkę, czyli:
# pkg_create -f packing_list -c opis_1 -d opis_2 kadu-0.4.1.tbz
Opcje -c i -d dodają opisy z podanych plików, czyli z opis_1 i opis_2. Będzie je można odczytać np. używająć pkg_info. Do gotowej packing-list można dodać wiele innych przydatnych znaczników jak np.:
@exec wykona dowolne polecenie/skrypt przed zainstalowaniem paczki, można
dzięki temu tworzyć dowiązania itp.
@unexec wykona dowolne polecenie/skrypt po odinstalowaniu paczki, na
przykład kasowanie pozostawionych dowiązań do plików itp.
@display wyświetli zawartość podanego pliku w trakcie instalacji
Po więcej informacji zapraszam do lektury manuala oraz książki Porters Handbook.
tytus, pt., 18/04/2008 - 12:30
