Spis treści
Spis treści
Skoro już wiesz jakie ma możliwości system pakietów BOX możemy przystąpić do zbudowania naszego pierwszego pakietu. Niech to będzie control-center w wersji 2.6.1 należący do GNOME. Aby nie komplikować sprawy zakładamy, że zainstalowane są w systemie wszystkie biblioteki potrzebne do poprawnego zbudowania pakietu.
Wszystkie polecenia powinny być wydawane z uprawnieniami root.
Aby móc budować pakiety należy przygotować odpowiednią strukturę katalogów. Najprościej jest to uczynić poleceniem box -init.
[root@localhost /]# box -init Making /pingwinek/TMP... Making /pingwinek/CVS/boxes... Making /pingwinek/DISTFILES... Making /pingwinek/DISTFILES/EXTRA... Making /pingwinek/CVS/patches... Making /pingwinek/BUILDLOGS... Making /pingwinek/BOXES/factory... Making /pingwinek/BOXES/factory-old...
W ten sposób mamy przygotowane środowisko pracy i możemy przejść do budowania pakietu źródłowego.
Wchodzimy do katalogu gdzie będą znajdować się opisy budowanych przez nas pakietów czyli do /pingwinek/CVS/boxes.
[root@localhost /]# cd /pingwinek/CVS/boxes/
Niech nasz pakiet nazywa się control-center.box. Poleceniem box -templete możemy wyświetlić szkielet pliku który będziemy edytować.
[root@localhost boxes]# box -template > control-center.box
Zawartość wygenerowanego pliku może wyglądać następująco:
<?xml version="1.0" ?> <box group="candidate"> <source id="main"> <name version="template" release="1">template</name> <url>http://template.org/template.tar.gz</url> <homepage>http://template.org</homepage> </source> <build> <code><![CDATA[ # please remove all unused lines ie. post-install section #%{configure} && #%{make} && #%{make_install} ]]> </code> </build> <package name="normal"> <files> </files> <!-- <post-install><![CDATA[ %{gconf_schemas_install} ]]> </post-install> --> </package> <changelog><![CDATA[ $Log: manual-pl.xml,v $ Revision 1.1 2004/09/19 10:19:08 kaliber - added documentation (Polish only at now) ]]> </changelog> </box>
Aby zbudować poprawny pakiet musimy zedytować plik control-center.box dla naszych potrzeb. Pierwszą czynnością jest poprawne zdefiniowanie źródła głównego. Określamy nazwę pakietu, jego wersję oraz adres internetowy skąd system ma go pobrać. Opcjonalnie możemy podać stronę domową pakietu jeśli istnieje.
Część opisowa źródła głównego powinna wyglądać np. tak:
<source id="main"> <name version="2.6.1" release="1">control-center</name> <url>http://ftp.gnome.org/pub/GNOME/sources/control-center/2.6/control-center-%{version}.tar.bz2</url> <homepage>http://www.gnome.org</homepage> </source>
W adresie do pliku użyliśmy makra %{version}, które zostanie zastąpione zdefiniowaną przez nas wersją. W celu pewnych optymalizacji częste adresy URL można przedstawić korzystając z predefiniowanych makr. Opis głównego źródła będzie wyglądał następująco:
<source id="main"> <name version="2.6.1" release="1">control-center</name> <url>%{GNOME.ORG}/control-center/%{main_version}/control-center-%{version}.tar.bz2</url> <homepage>http://www.gnome.org</homepage> </source>
Zauważ także, że pojawiło się makro %{main_version}, który to powoduje odczytanie głównej wersji źródła. Dzięki temu po uaktualnieniu pakietu do wersji 2.8.0 nie będziemy musieli modyfikować tej części adresu ponieważ zostanie automatycznie podstawiona wartość 2.8.
Najważniejszą częścią pakietu jest część która jest odpowiedzialna za zbudowanie pakietu. Jako przykład w komentarzu sekcji budującej podane są trzy instrukcje, które są w rzeczywistości makrami. Na szczęście aż 70% pakietów korzysta z takiego sposobu konfiguracji i instalacji. Jeżeli system instalacji jest niestandardowy należy napisać taki skrypt powłoki który zainstaluje pliki w katalogu %{ROOT_BIN}. W naszym przypadku mamy instalację standardową więc wystarczy tylko odkomentować makra. Sekcja budująca powinna wyglądać następująco:
<build> <code><![CDATA[ %{configure} && %{make} && %{make_install} ]]> </code> </build>
W ten oto sposób stworzyliśmy minimalny opis pakietu, czyli taki aby mógł się zbudować. W naszym pliku XML istnieje jeszcze sekcja package, ale na razie nie będziemy się nią zajmować. Możemy teraz przejść w końcu do zbudowania pakietu źródłowego. Nasze pakiety będziemy tworzyć w katalogu /pingwinek/BOXES poleceniem box -s nazwa_pakietu.box. Jeśeli mamy dostęp do sieci to plik źródłowy ściągnie się sam, jeśli nie to plik control-center-2.6.1.tar.bz2 należy umieścić w katalogu /pingwinek/DISTFILES
[root@localhost ~]# cd /pingwinek/BOXES/ [root@localhost BOXES]# box -s control-center.box Generating source package for control-center.box... * File control-center-2.6.1.tar.bz2 not found. Trying to get it :) --08:38:01-- http://ftp.gnome.org/pub/GNOME/sources/control-center/2.6/control-center-2.6.1.tar.bz2 => `control-center-2.6.1.tar.bz2' Resolving ftp.gnome.org... failed: Host not found. * Searching in DISTFILES_EXTRA * File control-center-2.6.1.tar.bz2 not found!
W powyższym przykładzie plik nie został znaleziony w DISTFILES więc system postanowił ściągnąć go z sieci. Niestety to się nie powiodło, więc musimy sami zdobyć plik i umieścić w katalogu /pingwinek/DISTFILES i następnie ponownie spróbować utworzyć pakiet źródłowy.
[root@localhost BOXES]# box -s control-center.box Generating source package for control-center.box... [root@localhost BOXES]# ls -l total 2452 -rw-r--r-- 1 root root 2498560 2004-09-05 08:47 control-center-2.6.1-1.src.box drwxr-xr-x 2 root root 4096 2004-09-05 08:35 factory drwxr-xr-x 2 root root 4096 2004-09-05 08:35 factory-old
W ten oto sposób utworzyliśmy pakiet źródłowy control-center-2.6.1-1.src.box i możemy przejść do kolejnego etapu czyli budowania pakietu.
Budowanie pakietu jest nadzwyczaj proste bo wystarczy tylko wykonać polecenie box -b pakiet_źródłowy.src.box. W ten sposób powstanie pakiet binarny oraz zostanie utworzony dziennik z przebiegu budowania w katalogu /pingwinek/BUILDLOGS/nazwa_pakietu/. Teraz możemy poczekać kilkanaście minut aż pakiet zbuduje się.
[root@localhost BOXES]# box -b control-center-2.6.1-1.src.box [root@localhost BOXES]# ls -l total 3696 -rw-r--r-- 1 root root 1269760 2004-09-05 09:06 control-center-2.6.1-1.i686.box -rw-r--r-- 1 root root 2498560 2004-09-05 08:47 control-center-2.6.1-1.src.box drwxr-xr-x 2 root root 4096 2004-09-05 08:35 factory drwxr-xr-x 2 root root 4096 2004-09-05 08:35 factory-old
Warto jest przejrzeć dziennik budowania czy nie wystąpiły jakieś błędy lub ostrzeżenia. Dla przykładu pokażemy ostatnie 24 linie.
[root@localhost BOXES]# tail -n 24 /pingwinek/BUILDLOGS/control-center/control-center-2.6.1-1.log /bin/sh ./mkinstalldirs /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/usr/share/pixmaps /bin/install -c -m 644 ./control-center2.png /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/usr/share/pixmaps/control-center2.png make[2]: Leaving directory `/pingwinek/TMP/control-center-2.6.1-1-1793/build' make[1]: Leaving directory `/pingwinek/TMP/control-center-2.6.1-1-1793/build' --------------------------------------------- * stripping (/pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN)... * compressing documentation (/pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN)... * stripping schemas (/pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN)... Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/themus.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/fontilus.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/apps_gnome_settings_daemon_screensaver.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/apps_gnome_settings_daemon_default_editor.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/desktop_gnome_font_rendering.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/desktop_gnome_peripherals_keyboard_xkb.schemas Stripping: /pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN/etc/gconf/schemas/apps_gnome_settings_daemon_keybindings.schemas * mkdir -p /pingwinek/TMP/control-center-2.6.1-1-1793/control-center-2.6.1-1.i686 * PWD=/pingwinek/TMP/control-center-2.6.1-1-1793/ROOT_BIN; tar cfz /pingwinek/TMP/control-center-2.6.1-1-1793/control-center-2.6.1-1.i686/control-center-2.6.1-1.i686.tar.gz --posix --------------------devel-------------------------- * no package -devel --------------------static-------------------------- * no package -static * rm -rf /pingwinek/TMP/control-center-2.6.1-1-1793 BUILDTIME: 5 EXIT: 0
Mamy to co chcieliśmy uzyskać czyli nasz pakiet binarny. Za pomocą polecenia box -l pakiet_binarny.box możemy usyskać listę plików. Jednak prostszym rozwiązaniem jest skorzystanie z programu Midnight Commander (mc) i podejrzeć pakiet klawiszem F3 lub wejść do niego za pomocą ENTER-a.
W tym momencie możnby zakończyć ten przykład ale pójdzmy dalej i zobaczmy jak można zarządzać zbudowanymi pakietami i ich jakością.
Brzmi to dumnie, ale o co chodzi i po co to komu skoro mam już mój pakiet? Myślę, że każdy z czytelników zada sobie takie pytanie w tym miejscu. Pod tym terminem kryje się zasada ciągłego polepszania pakietów i dwa polecenia systemu BOX: -check oraz -accept. Pierwsze z nich wykonuja kilkanaście testów na naszym zbudowanym pakiecie oraz wcześniejszej wersji zaakceptowanej poleceniem -accept która znajduje się w katalogu factory. W tym katalogu znajdują się wszystkie aktualne zaakceptowane pakiety. Ze względów bezpieczeństwa poprzednie ich wersje trzymane są w katalogu factory-old. Ciągle może wygląda to tajemiczo, więc zajmijmy się naszym przykładem:
[root@localhost BOXES]# box -check control-center-2.6.1-1.src.box * Trailing characters in XML box file in line(s): 26 28 * There is no source package in the factory!
Uzyskujemy informację że w factory nie ma pakietu źródłowego (poprzedniego zaakceptowanego). Dzieje się tak dlatego, że jest to nowy pakiet i musimy za pierwszym razem ręcznie go tam umieścić a następnie ponownie wykonać sprawdzenie.
[root@localhost BOXES]# mkdir -p factory/control-center [root@localhost BOXES]# cp control-center*.box factory/control-center/ [root@localhost BOXES]# box -check control-center-2.6.1-1.src.box * Trailing characters in XML box file in line(s): 26 28 * GConf schemas detected but there is no macro %{gconf_schemas_install} in post-install! * Package could be divided into independent packages (not implemented yet): - gnomecc GNOME Control Center The GNOME configuration tool - gnome-window-settings gnome-window-settings-2.0 Utility library for getting window manager settings * PROVIDES (soname) has changed! Please fix it! - Please add: <provides type="build" value="gnome-window-settings-2.0.pc" /> <provides value="libgnome-window-settings.so.1" /> * REQUIRES (soname) has changed! Please fix it! - Please add: <requires value="libICE.so.6" /> <requires value="libORBit-2.so.0" /> ... wycięte ... <requires value="libxklavier.so.8" /> <requires value="libxml2.so.2" /> <requires value="libz.so.1" /> * BUILD REQUIRES has changed! Please fix it! - Please add to build section: <requires value="alsa >= 0.9.0" /> <requires value="atk >= 1.2.0" /> ... wycięte ... <requires value="libxklavier >= 1.02" /> <requires value="libxml-2.0" /> <requires value="xft >= 2.0.0" /> * Application uses OLD mime-info and should be it replaced by new freedesktop.org shared-mime-info * Size ratio: - binary 100.00% - overall 100.00%
Jak widać uzyskaliśmy mnóstwo informacji. Aż osiem z kilkunastu testów wyświetliło komunikaty. Przeanalizujmy je po koleji.
Jeśli drogi czytelniku nie przekonałem Cię do tego, że zarządzanie jakością ma duże znaczenie to czytaj dalej. Nanieśmy teraz wszystkie poprawki które zaproponował nam system BOX. Cały pakiet XML może wyglądać następująco:
<?xml version="1.0" ?> <box group="candidate"> <source id="main"> <name version="2.6.1" release="1">control-center</name> <url>%{GNOME.ORG}/control-center/%{main_version}/control-center-%{version}.tar.bz2</url> <homepage>http://www.gnome.org</homepage> </source> <build> <requires value="alsa >= 0.9.0" /> <requires value="atk >= 1.2.0" /> <requires value="esound" /> <requires value="fontconfig >= 1.0.0" /> <requires value="gconf-2.0" /> <requires value="gdk-2.0 >= 2.2.0" /> <requires value="gdk-pixbuf-2.0 >= 2.0.0" /> <requires value="glib-2.0 >= 2.2.0" /> <requires value="gnome-desktop-2.0 >= 2.2.0" /> <requires value="gnome-vfs-2.0 >= 2.2.0" /> <requires value="gnome-vfs-module-2.0 >= 2.2.0" /> <requires value="gstreamer-interfaces-0.8 >= 0.8.0" /> <requires value="gtk+-2.0 >= 2.3.0" /> <requires value="libbonobo-2.0 >= 2.2.0" /> <requires value="libbonoboui-2.0 >= 2.2.0" /> <requires value="libglade-2.0 >= 1.99.12" /> <requires value="libgnome-2.0 >= 2.2.0" /> <requires value="libgnomeui-2.0 >= 2.2.0" /> <requires value="libmetacity-private" /> <requires value="libnautilus >= 2.2.0" /> <requires value="libxklavier >= 1.02" /> <requires value="libxml-2.0" /> <requires value="xft >= 2.0.0" /> <code><![CDATA[ %{configure} && %{make} && %{make_install} ]]> </code> </build> <package name="normal"> <provides type="build" value="gnome-window-settings-2.0.pc" /> <provides value="libgnome-window-settings.so.1" /> <requires value="libICE.so.6" /> <requires value="libORBit-2.so.0" /> <requires value="libORBitCosNaming-2.so.0" /> <requires value="libSM.so.6" /> <requires value="libX11.so.6" /> <requires value="libXau.so.0" /> <requires value="libXext.so.6" /> <requires value="libXft.so.2" /> <requires value="libXinerama.so.1" /> <requires value="libXrandr.so.2" /> <requires value="libXrender.so.1" /> <requires value="libXss.so.1" /> <requires value="libart_lgpl_2.so.2" /> <requires value="libasound.so.2" /> <requires value="libatk-1.0.so.0" /> <requires value="libaudiofile.so.0" /> <requires value="libbonobo-2.so.0" /> <requires value="libbonobo-activation.so.4" /> <requires value="libbonoboui-2.so.0" /> <requires value="libc.so.6" /> <requires value="libcrypto.so.0.9.7" /> <requires value="libdl.so.2" /> <requires value="libeel-2.so.2" /> <requires value="libesd.so.0" /> <requires value="libfontconfig.so.1" /> <requires value="libfreetype.so.6" /> <requires value="libgailutil.so.17" /> <requires value="libgconf-2.so.4" /> <requires value="libgdk-x11-2.0.so.0" /> <requires value="libgdk_pixbuf-2.0.so.0" /> <requires value="libglade-2.0.so.0" /> <requires value="libglib-2.0.so.0" /> <requires value="libgmodule-2.0.so.0" /> <requires value="libgnome-2.so.0" /> <requires value="libgnome-desktop-2.so.2" /> <requires value="libgnome-keyring.so.0" /> <requires value="libgnome-window-settings.so.1" /> <requires value="libgnomecanvas-2.so.0" /> <requires value="libgnomeui-2.so.0" /> <requires value="libgnomevfs-2.so.0" /> <requires value="libgobject-2.0.so.0" /> <requires value="libgthread-2.0.so.0" /> <requires value="libgtk-x11-2.0.so.0" /> <requires value="libjpeg.so.62" /> <requires value="libm.so.6" /> <requires value="libmetacity-private.so.0" /> <requires value="libnautilus.so.2" /> <requires value="libpango-1.0.so.0" /> <requires value="libpangoft2-1.0.so.0" /> <requires value="libpangox-1.0.so.0" /> <requires value="libpangoxft-1.0.so.0" /> <requires value="libpopt.so.0" /> <requires value="libpthread.so.0" /> <requires value="librt.so.1" /> <requires value="libssl.so.0.9.7" /> <requires value="libstartup-notification-1.so.0" /> <requires value="libxklavier.so.8" /> <requires value="libxml2.so.2" /> <requires value="libz.so.1" /> <files> </files> <post-install><![CDATA[ %{gconf_schemas_install} ]]> </post-install> </package> <changelog><![CDATA[ $Log: manual-pl.xml,v $ Revision 1.1 2004/09/19 10:19:08 kaliber - added documentation (Polish only at now) ]]> </changelog> </box>
Zbudujmy jeszcze raz pakiet źródłowy, następnie pakiet binary oraz dokonajmy sprawdzenia:
[root@localhost BOXES]# box -s control-center.box Generating source package for control-center.box... [root@localhost BOXES]# box -b control-center-2.6.1-1.src.box [root@localhost BOXES]# box -check control-center-2.6.1-1.src.box * Package could be divided into independent packages (not implemented yet): - gnomecc GNOME Control Center The GNOME configuration tool - gnome-window-settings gnome-window-settings-2.0 Utility library for getting window manager settings * Application uses OLD mime-info and should be it replaced by new freedesktop.org shared-mime-info * Size ratio: - binary 100.81% - overall 100.81%
Jak widzimy pewne ostrzerzenia już się nie pojawiają po poprawieniu pliku XML. Teraz możemy zaakceptować nasz pakiet.
[root@localhost BOXES]# box -accept control-center-2.6.1-1.src.box
ZROBIĆ UPDATE DO 2.8.0 jeśli będzie