.TH makepkg 8 "3 sierpnia 2004" "makepkg #VERSION#" ""
.SH NAME
make_nnd_pkg \- narzędzie budujące pakiety
.SH SYNOPSIS
\fBmake_nnd_pkg [opcje]\fP
.SH DESCRIPTION
\fBmake_nnd_pkg\fP służy do budowania pakietów. Potrzebny jest tylko odpowiednio
wyposażony system, wget oraz skrypty budujące. Przewagą budowy pakietów opartej
o skrypty jest to, że tak naprawdę pracę wykonuje się tylko raz. Kiedy jest już
gotowy skrypt budujący dla pakietu, wystarczy wykonać makepkg i reszta zrobi
się sama: zostaną pobrane i zweryfikowane źródła, sprawdzone zależności,
skonfigurowane ustawienia, skompilowane pliki źródłowe, pliki wynikowe
zainstalowane do katalug tymczasowego, dokonane poprawki, wygenerowane
informacje o pakiecie i w końcu całość zostanie spakowana do archiwum, z
którego użytek będzie potrafił zrobić \fBpacman\fP.

\fBmakeworld\fP może być użyty do przebudowania całych grup pakietów lub też
całego drzewa źródeł. Więcej informacji po wydaniu polecenia \fBmakeworld
--help\fP. \fBmakeworld\fP w chwili obecnej nie jest kompatybilny i nie działa 
z NND.

.SH PROCES BUDOWY (czy też Jak Zbudować Własny Pakiet)
Zaczynamy od osobnego katalogu (tzn. nie jest on używany do niczego ninnego jak
tylko do budowania tego pakietu). Skrypt budujący powinien nosić nazwę PKGBUILD
i przypominać przykład znajdujący się niżej.

\fBUWAGA:\fP wzór pliku PKGBUILD powinien znajdować się w katalogu /var/abs.
Wystarczy skopiować plik /var/abs/PKGBUILD.proto do nowego katalogu (o takiej
samej nazwie jak nazwa budowanego pakietu), zmienić jego nazwę na PKGBUILD 
i wyedytować wszystkie zmienne.

\fBUWAGA2:\fP w celu zachowania zgodności z makepkg pochodzącym z dystrybucji
Arch Linux make_nnd_pkg jest linkiem symbolicznym do pliku /usr/bin/makepkg.
W zależności od tego pod jaką nazwą zostanie uruchomiony pakiety będą budowane
zgodnie z założeniami NND (make_nnd_pkg) lub Arch Linuksa (makepkg). 

\fBUWAGA3:\fP w trybie NND nie wszystkie opcje wywołania zostały w pełni
przetestowane. Niektóre mogą nie działać.

.TP
.TP
.SH Przykładowy PKGBUILD:
.RS
.nf
pkgname=modutils
pkgver=2.4.25
pkgrel=1
pkgdesc="Utilities for inserting and removing modules from the linux kernel"
url="http://www.kernel.org"
backup=(etc/modules.conf)
makedepends=('bash' 'mawk')
depends=('glibc' 'zlib')
source=(ftp://ftp.kernel.org/pub/linux/utils/kernel/$pkgname/v2.4/$pkgname-$pkgver.tar.bz2 \\
        modules.conf)
md5sums=('2c0cca3ef6330a187c6ef4fe41ecaa4d' \\
        '35175bee593a7cc7d6205584a94d8625')

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr --enable-insmod-static
  make || return 1
  make prefix=$startdir/pkg/usr install
  mv $startdir/pkg/usr/sbin $startdir/pkg
  mkdir -p $startdir/pkg/etc
  cp ../modules.conf $startdir/pkg/etc
}
.fi
.RE

Jak widać, skrypt jest stosunkowo prosty. Pierwsze trzy linie definiują nazwę
i wersję pakietu. Na ich podstawie określana jest też docelowa nazwa pakietu,
która ma postać \fI$pkgname-$pkgver-$pkgrel.pkg.tar.gz\fP. Czwarta linia to
krótki opis pakietu. Te cztery linie powinny być obecne w każdym skrypcie
PKGBUILD.

Linia \fIbackup=\fP definiuje pliki, które powinny być traktowane w specjalny
sposób przy usuwaniu lub aktualizacji pakietu. Więcej szczegółów w sekcji
\fBOBSŁUGA PLIKÓW KONFIGURACYJNYCH\fP na stronie manuala \fIpacmana\fP.

Linie siódma i ósma określają zależności pakietu. Tablica \fIdepends\fP
zawiera zależności czasu uruchamiania, zaś \fImakedepends\fP - czasu budowania.
Aby uruchomić pakiet, spełnione muszą być zależności z \fIdepends\fP. Aby
zbudować pakiet, \fBwszystkie\fP zależności muszą być spełnione. makepkg
sprawdzi je przed budowaniem pakietu.

Tablica \fIsource\fP mówi, które pliki powinny być pobrane/rozpakowane przed
rozpoczęciem kompilacji. Tablica \fImd5sums\fP dostarcza sumy kontrolne dla
każdego z tych plików. Użwane są one do sprawdzenia poprawności plików
źródłowych.

Kiedy już PKGBUILD będzie gotowy, można uruchomić \fImakepkg\fP z katalogu,
w którym znajduje się skrypt. makepkg sprawdzi zależności i poszuka wymaganych
plików źródłowych. Jeżeli jakiegoś będzie brakować, spróbuje go pobrać, pod
warunkiem, że w tablicy \fIsource\fP znajduje się dokładnu adres URL.

Źródła są wtedy rozpakowywane do katalogu ./src i wywoływana jest funkcja
\fIbuild\fP. Tam powinny odbyć się konfiguracja, kompilacja i instalacja
pakietu, jak również wszelkie dostrajanie.

Po kompilacji funkcja \fIbuild\fP musi zainstalować pliki w specjalnym
katalogu, do którego można się odnieść przez \fB$startdir\pkg\fP. Najczęściej
osiąga się to jednym z dwóch sposobów:
.RS
.nf

make DESTDIR=$startdir/pkg install

lub

make prefix=$startdir/pkg/usr install

.fi
.RE
Należy zauważyć, że część "/usr" powinna wystąpić przy użyciu zmiennej
"prefix", ale nie przy zmiennej "DESTDIR". Zaleca się używać wariantu ze
zmienną "DESTDIR", lecz nie wszystkie pliki Makefile ją obsługują. Zmiennej
"prefix" należy używać tylko wtedy, gdy nie można użyć zmiennej "DESTDIR".

Kiedy już pliki zostaną zainstalowane we wspomnianym katalogu, \fImakepkg\fP
usunie niektóre katalogi jak /usr/doc i /usr/info. Następnie skompilowany 
i zainstalowany w $startdir/pkg program zostanie podzielony - manuale znajdą
się w katalogu $startdir/man_pkg, a pliki nagłówkowe w katalogu $startdir/dev_pkg. 
W następnej kolejności zostaną zrzucone symbole debugowania z bibliotek 
i binariów oraz wygenerowana informacja o pakiecie. 
Tuż przed wygenerowaniem informacji o pakiecie użytkownik ma możliwość 
uruchomienia MC i 'ręcznej' korekty położenia plików w pakietach. W końcu 
wszystko zostanie skompresowane do plików *.pkg.tar.gz i zapisane w katalogu, 
w którym został uruchomiony \fBmakepkg\fP.

W tym momencie w bieżącym katalogu powinny znajdować się pakiety, w postaci
plików o nazwach wg wzoru: nazwa_pakietu-wersja-numer_wydanie.pkg.tar.gz
(nazwa_pakietu-[man|devel]-wersja-numer_wydania.pkg.tar.gz).
.SH Skrypty instalacji/aktualizacji/usuwania
pacman ma możliwość przechowywania i wykonywania skryptów specyficznych
dla pakietu, kiedy wykonuje instalację, usuwanie lub aktualizację. Pozwala
to na automatyczną konfigurację pakietu po instalacji oraz dokonanie
czynności odwrotnej przed jego usunięciem.

Moment wykonania skryptu różni się w zależności od instalacji:
.TP
.B pre_install
skrypt jest wykonywany tuż przed rozpakowaniem plików.

.TP
.B post_install
skrypt jest wykonywany tuż po rozpakowaniu plików.

.TP
.B pre_upgrade
skrypt jest wykonywany tuż przed rozpakowanie plików.

.TP
.B post_upgrade
skrypt jest wykonywany tuż po rozpakowaniu plików.

.TP
.B pre_remove
skrypt jest wykonywany tuż przed usunięciem plików.

.TP
.B post_remove
skrypt jest wykonywany tuż po usunięciu plików.

.RE
Aby skorzystać z tej funkcjonalności, wystarczy utworzyć plik (np.
pkgname.install) i umieścić go w tym samym katalogu co skrypt PKGBUILD.
Następnie należy użyć dyrektywy \fIinstall\fP:
.RS
.nf
install=pkgname.install
.fi
.RE

Plik ze skryptami nie musi być wymieniony z tablicy \fIsource\fP.

.TP
.TP
.SH Pliki ze skryptami muszą być zgodne z następującym formatem:
.RS
.nf
# arg 1:  the new package version
pre_install() {
  #
  #  do pre-install stuff here
  #
  /bin/true
}

# arg 1:  the new package version
post_install() {
  #
  #  do post-install stuff here
  #
  /bin/true
}

# arg 1:  the new package version
# arg 2:  the old package version
pre_upgrade() {
  #
  #  do pre-upgrade stuff here
  #
  /bin/true
}

# arg 1:  the new package version
# arg 2:  the old package version
post_upgrade() {
  #
  #  do post-upgrade stuff here
  #
  /bin/true
}

# arg 1:  the old package version
pre_remove() {
  #
  #  do pre-remove stuff here
  #
  /bin/true
}

# arg 1:  the old package version
post_remove() {
  #
  #  do post-remove stuff here
  #
  /bin/true
}

op=$1
shift
$op $*
.fi
.RE

Powyższy szablon jest także dostępny w drzewie ABS (/var/abs/install.proto).

.SH Dyrektywy skryptu PKGBUILD
.TP
.B pkgname
Nazwa pakietu, powinna być zgodna z konwencją nazewnictwa w systemach Unix,
gdyż zostanie użyta w nazwie pliku.

.TP
.B pkgver
Wersja programu, dokładnie taka, jaką określił autor (np. 2.7.1).

.TP
.B pkgrel
Numer wydania, specyficzny dla pakietów Arch Linux.

.TP
.B pkgdesc
Krótki opis pakietu i jego funkcjonalności.

.TP
.B force
Używane w celu wymuszenia aktualizacji pakietu przez opcję \fB--sysupgrade\fP,
nawet jeśli jest to starsza wersja.

.TP
.B url
Opcjonalny URL związany z pakietowanym programem. Zazwyczaj jest to strona
domowa projektu.

.TP
.B license
Określa rodzaj licencji (np. "GPL", "BSD", "NON-FREE"). (\fBUwaga:\fP ta
dyrektywa wciąż jest w fazie rozwojowej i może ulec zmianie w przyszłości.)

.TP
.B install
Określa specjalny skrypt instalacyjny, który będzie dołączony do pakietu.
Plik ten powinien znajdować się w tym samym katalogu, co skrypt PKGBUILD.
Zostanie automatycznie skopiowany do pakietu przez makepkg. Nie musi być
uwzględniony w tablicy \fIsource\fP. Przykład: install=modutils.install

.TP
.B source \fI(tablica)\fP
Dyrektywa \fIsource\fP jest tablicą plików źródłowych wymaganych do zbudowania
pakietu. Pliki muszą znajdować się w tym samym katalogu, co skrypt PKGBUILD,
chyba że podano ich adresy URL. Wtedy, jeżeli plik nie istnieje też w katalogu
/var/cache/pacman/src, jest pobierany przy użyciu programu wget.

.TP
.B md5sums \fI(tablica)\fP
Jeżeli ta dyrektywa jest obecna, powinna zawierać sumy kontrolne MD5 dla
każdego pliku źródłowego, wymienionego w tablicy \fIsource\fP (w odpowiadającej
kolejności). makepkg użyje tych informacji, aby zweryfikować poprawność
plików źródłowych. W celu łatwego wygenerowania sum kontrolnych, można użyć
polecenia \fBmakepkg -g >> PKGBUILD\fP oraz wyedytować skrypt PKGBUILD i
przenieść sumę w odpowiednie miejsce.

.TP
.B groups \fI(tablica)\fP
Jest to tablica symbolicznych nazw reprezentujących grupy pakietów,
pozwalających na instalację wielu pakietów za pomocą jednego celu. Na przykład,
można zainstalować wszystkie pakiety wchodzące w skład KDE, instalując tylko
grupę 'kde'.

.TP
.B backup \fI(tablica)\fP 
Tablica nazw plików (bez rozpoczynającego znaku slash), których kopie zapasowe
mają być utworzone przy usuwaniu pakietu z systemu. Więcej informacji w sekcji
\fBOBSŁUGA PLIKÓW KONFIGURACYJNYCH\fP na stronie manuala \fIpacmana\fP.

.TP
.B depends \fI(tablica)\fP 
Tablica pakietów, od których zależy budowanie i uruchamianie tego pakietu.
Pakiety z tej listy powinny być otoczone apostrofami i zawierać przynajmniej
nazwę pakietu. Można też podać wymaganą wersje w postaci \fBnazwa<>wersja\fP,
gdzie <> jest jednym z następujących operatorów porównania: \fB>=\fP (większa lub
równa), \fB<=\fP (mniejsza lub równa) lub \fB=\fP (równa). Przykłady użycia
dyrektywy \fIdepends\fP można znaleźć w powyższym przykładowym pliku PKGBUILD.

.TP
.B makedepends \fI(tablica)\fP
Tablica pakietów, od których zależy budowanie pakietu (tj. nie są wymagane
do uruchomienia). Lista ma taki sam format jak lista \fIdepends\fP.

.TP
.B conflicts \fI(tablica)\fP 
Tablica pakietów, które pozostają w konflikcie z tym pakietem (tzn. nie mogą
jednocześnie być zainstalowane w systemie). Lista ma taki sam format jak lista
\fIdepends\fP z tym, że nie można podawać wersji, tylko nazwy pakietów.

.TP
.B provides \fI(tablica)\fP 
Tablica "wirtualnych funkcjonalności", które ten pakiet dostarcza. Dyrektywa ta
pozwala definiować pakiet jako zależność używając innej nazwy, niż nazwa
pakietu. Na przykład, pakiety kernel-scsi i kernel-ide dostarczają
funkcjonalność 'kernel', co pozwala na określenie zależności jako 'kernel',
zamiast "kernel-scsi OR kernel-ide OR ...".

.TP
.B replaces \fI(tablica)\fP 
Jest to tablica pakietów, które ten pakiet powinien zastąpić. Może być to użyte
do obsługi przemianowanych/połączonych pakietów. Na przykład, jeżeli pakiet
kernel zostanie przemianowany na kernel-ide, wtedy polecenie 'pacman -Syu' nie
wybierze nowego pakietu jako aktualizacji, ponieważ nazwy są inne. Dyrektywa
\fIreplaces\fP pozwala to obejść.

.TP
.B nosplit \fIyes|no\fP 
Zmienna określająca czy podczas budowy pakiet ma zostać podzielony automatycznie
na pakiety *-devel i *-man (zawierające odpowiednio pliki nagłówkowe i strony
manuali). Ta zmienna jest ignorowana w trybie Arch Linux (makepkg)

.TP
.B pre_pacinkg \fIyes|no\fP 
Zmienna określająca czy uruchomić dodatkową funkcję pre_pack(). Funkcja ta \fImusi\fP 
być obecna w pliku PKGBUILD. Głównyum zastosowaniem tej funkcji jest wykonywanie 
operacji na plikach, które nie istnieją w czasie wykonywania funkcji build().
Szczególnie przydatna jest do edycji plików PKGBUILD dla automatycznie budowanych 
pakietów *-devel i *-man. Funkcja pre_pack() jest wykonywana po automatycznym
podziale na 'pakiet' 'pakiet-devel' i 'pakiet-man' i bezpośrednio przed
operacją budowy (kompresja i generowanie plików .PKGINFO i .FILELIST) pakietów. 
Funkcja pre_pack() powinna być używana zamiast 'ręcznej' korekty położenia 
plików w pakiecie. Ta zmienna jest ignorowana w trybie Arch Linux (makepkg) i
funkcja pre_pack() nie jest wykonywana w tym trybie.


.SH OPCJE MAKEPKG
.B "\-a, \-\-auto"
Ta opcja powoduje, że pakiet jest budowany automatycznie, bez możliwości
poprawienia położenia plików przez osobę budującą pakiet. Bez tej opcji
make_nnd_pkg przed operacją budowy pakietu (kompresja i generowanie plików
.PKGINFO i .FILELIST) daje użytkownikowi możliwość uruchomienia MC i skorygowania
położenia plików w pakietach. W trybie Arch Linux ta opcja będzie ignorowana.  
.TP
.B "\-b, \-\-builddeps"
Powoduje budowanie brakujących zależności ze źródeł. Kiedy makepkg wykryje
niespełnioną zależność czasu budowania lub czasu uruchamiania, poszuka dla niej
pliku PKGBUILD w drzewie $ABSROOT (definiowanym w pliku /etc/makepkg.conf).
Jeżeli znajdzie, uruchomi kolejną instancję makepkg, aby zbudować i
zainstalować brakującą zależność. Potomna instancja makepkg zostanie wywołana
z opcjami \fB-b\fP oraz \fB-i\fP.
.TP
.B "\-c, \-\-clean"
Usuwa zbędne pliki/katalogi po udanym budowaniu.
.TP
.B "\-C, \-\-cleancache"
Usuwa wszystkie pliki źródłowe z pamięci podręcznej, aby zwolnić miejsce na
dysku.
.TP
.B "\-d, \-\-nodeps"
Nie sprawdza zależności, pozwala na pominięcie/zignorowanie wszelkich
wymaganych zależności. Istnieje duża szansa, że opcja ta popsuje proces
budowania, jeżeli żadna z zależności nie będzie spełniona.
.TP
.B "\-f, \-\-force"
\fBmakepkg\fP nie zbuduje pakietu, jeżeli plik
\fIpkgname-pkgver-pkgrel.pkg.tar.gz\fP istnieje już w katalogu. Opcja
\fB--force\fP zmienia to zachowanie.
.TP
.B "\-g, \-\-genmd5"
Pobiera wszystkie pliki źródłowe (jeżeli jest to konieczne) i używa narzędzia
\fImd5sum\fP, aby wygenerować sumy kontrolne dla każdego z nich. Można
przekierować wyjście do pliku PKGBUILD, aby zweryfikować źródła (makepkg -g >>
PKGBUILD).
.TP
.B "\-h, \-\-help"
Wyświetla składnię i opcje linii poleceń.
.TP
.B "\-i, \-\-install"
Instaluje/uaktualnia pakiet po udanym zbudowaniu.
.TP
.B "\-j <jobs>"
Ustawia zmienną MAKEFLAGS="-j<jobs>" przed rozpoczęciem budowy. Można dzięki
temu nadpisać ustawienie MAKEFLAGS z pliku /etc/makepkg.conf.
.TP
.B "\-m, \-\-nocolor"
Wyłącza kolorowanie komunikatów.
.TP
.B "\-n, \-\-nostrip"
Zapobiega zrzucaniu symboli debugowania z binariów i bibliotek.
.TP
.B "\-o, \-\-nobuild"
Jedynie pobiera i rozpakowuje pliki, nie buduje pakietu.
.TP
.B "\-p <buildscript>"
Korzysta z pliku \fI<buildscript>\fP zamiast z domyślnego (\fI(PKGBUILD\fP).
.TP
.B "\-r, \-\-rmdeps"
Po udanym zbudowaniu pakietu, usuwa wszystkie zależności zainstalowane przez
makepkg automatycznie (kiedy została użyta opcja \fB-b\fP lub \fB-s\fP).
.TP
.B "\-s, \-\-syncdeps"
Instaluje brakujące zależności używając pacmana. Kiedy makepkg wykryje
niespełnione zależności czasu budowania lub czasu uruchamiania, uruchomi
pacmana, aby ten spróbował je rozwiązać. Jeżeli mu się uda, pobierze i
zainstaluje brakujące pakiety.
.TP
.B "\-w <destdir>"
Zapisuje wynikowe pakiety w katalogu \fI<destdir>\fP zamiast w katalogu
bieżącym.

.SH KONFIGURACJA
Opcje konfiguracyjne przechowywane są w pliku \fI/etc/makepkg.conf\fP. Plik
ten jest traktowany jako skrypt Basha, więc można w nim eksportować dowolne
specjalne flagi kompilatora. Jest to pomocne przy budowaniu dla różnych
architektur, czy też z różnymi ustawieniami optymailizacji.

\fBUWAGA:\fP Nie ma gwarancji, że wszystkie pliki Makefile będą używać
eksportowanych zmiennych. Niektóre z tych plików są ułomne...
.SH ZOBACZ TAKŻE
\fBpacman\fP jest menedżerem pakietów, który używa pakietów zbudowanych przy
użyciu makepkg.

.SH AUTOR
.nf
Judd Vinet <jvinet@zeroflux.org>
.fi
.SH TŁUMACZENIE
.nf
Jarosław Świerczyński <swiergot@juvepoland.com>
.fi
.SH WERSJA DLA NND
.nf
Michał M. Lechański <michal@doriath.homeip.net>
.fi
