{ }
menu zespół linki Logowanie
Stabilny hosting
BSDGuru zawdzięcza
firmie Datanet.pl
Hosting BSDGuru.org - DataNet.pl

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:

# make package

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:

  1. Instalacja danego programu do katalogu tymczasowego.
  2. Stworzenie listy wszystkich utworzonych plików i katalogów.
  3. 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.

  1. Ściągamy źródła i instalujemy kadu do dowolnego katalogu tymczasowego, np.:

    # ./configure --prefix=/tmp/paczka
    # gmake && gmake install
  2. 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/doc

    aby 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-list

    Lista 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/paczka

    Ich 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 paczki

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

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

Autor: 
Rafał Jagielnicki (raffau@tenbit.pl)
Porozmawiaj o tym artykule na forum: 

tytus, pt., 18/04/2008 - 12:30