Difference between revisions of "Arch Build System (Česky)"

From ArchWiki
Jump to: navigation, search
(Co je PKGBUILD a co obsahuje?)
(Co je PKGBUILD a co obsahuje?)
Line 130: Line 130:
  
 
Ostatní jsou řádky potřebné pro každou instalaci.
 
Ostatní jsou řádky potřebné pro každou instalaci.
 +
 +
==== Funkce build====
 +
 +
Jestli nejste seznámen s tvorbou balíčku, měl by jste vědět že většina balíčků (ale ne všechny) jde vytvořit touto cestou :
 +
* rozbalit zdrojový soubor :
 +
 +
  <pre>
 +
  tar -xzf foo-0.99.tar.gz
 +
  tar -xjf foo-0.99.tar.bz2</pre>
 +
 +
* otevřít adresář
 +
 +
  <pre>cd foo-0.99</pre>
 +
 +
* konfigurace balíčku : V adresáři je malý script zvaný <code>configure</code> který je použit ke konfiguraci balíčku a kontrole zda má váš pačítač všechen potřebný software. Můžete ho spustit pomocí :
 +
 +
  <pre>./configure [[option]]</pre>
 +
 +
Klidně se můžete podívat na nápovědu jak to pracuje :
 +
 +
  <pre>./configure --help</pre>
 +
 +
* kompilace zdroje :
 +
 +
  <pre>make</pre>
 +
 +
* instalace
 +
 +
  <pre>make install</pre>
 +
 +
Vždycky by jste měl číst soubor <code>INSTALL</code> pro informace jak program sestavit a nainstalovat ! '''Všechny balíčky nepoužívají <code>configure; make; make install</code> systém!
 +
 +
Podívejme se nyní na "standardní" build funkci :
 +
 +
<pre>
 +
build() {
 +
  cd $startdir/src/$pkgname-$pkgver
 +
  ./configure --prefix=/usr
 +
  make || return 1
 +
  make prefix=$startdir/pkg/usr install
 +
}
 +
</pre>
 +
 +
Co děláme je to, že :
 +
* zadání adresáře kde máme zdrojové kódy :
 +
 +
  <pre>cd $startdir/src/$pkgname-$pkgver</pre>
 +
 +
Pokud zkoušíte sestavit balíček, pečlivě zkontrolujte, že je to správný adresář : někdy je adresář pojmenován :
 +
 +
  <pre>tar -xzf foo-0.99.tar.gz</pre>
 +
 +
a <code>ls</code> může vypsat :
 +
 +
  <pre>
 +
  .
 +
  ..
 +
  foo-0.99.tar.gz
 +
  foo/</pre>
 +
 +
a ne :
 +
 +
  <pre>
 +
  .
 +
  ..
 +
  foo-0.99.tar.gz
 +
  foo-0.99/</pre>
 +
 +
* konfigurace balíčku a provedení instalace v adresáři <code>/usr</code> :
 +
 +
  <pre>
 +
  ./configure --prefix=/usr</pre>
 +
 +
* kompilace
 +
 +
  <pre>
 +
  make || return 1</pre>
 +
 +
* instaluje software ale ne v adresáři <code>/usr</code>, ale v <code>$startdir/pkg/usr</code>.
 +
 +
  <pre>
 +
  make prefix=$startdir/pkg/usr install</pre>
 +
 +
Co potřebujeme je vytvořit balíček ale neinstalovat ho do standartního adresáře (<code>/usr</code>), my chceme pomocí <code>make</code> nastavit náš speciální adresář : <code>$startdir/pkg/usr</code>.
 +
 +
==== Strom ABS ====
 +
 +
Když spustíte poprvé abs :
 +
 +
<pre>
 +
# abs</pre>
 +
 +
provede se synchronizace věci zvané " strom ABS" což je vlastně cvs system Archlinuxu. Co je vlastně ABS strom ? Je uložen v /var/abs vypadá takto :
 +
 +
<pre>
 +
|-
 +
| -- base/
 +
|-
 +
|    ||-- autoconf/
 +
|-
 +
|    ||-- automake/
 +
|-
 +
|    ||-- ...
 +
|-
 +
| -- devel/
 +
|-
 +
| -- ...
 +
|-
 +
| -- extra/
 +
|-
 +
|      || -- deamons/
 +
|-
 +
|      ||      || -- acpid/
 +
|-
 +
|      ||      ||      || -- PKGBUILD
 +
...    ...    ...    ...
 +
</pre>
 +
 +
So the ABS tree has exactly the same structure as the package database :
 +
* first level directory represent categories
 +
* second level directories represent the packages
 +
* PKGBUILD files contains every information needed concerning the package
 +
 +
However, there is one special directory : '''local'''. This directory is ''yours'', this is where you'll do everything : you should never modify the rest of the tree.
 +
 +
NOTE: The first download of the abs tree is the biggest, then only minor updates are needed, so don't be afraid about the data to download if you've got only a 56k connection : it's only text files and it's compressed during the transfer''
 +
 +
Now that you know what the ABS tree is, how can we use it ?
 +
 +
==== First use of ABS : customizing a package====
 +
 +
This situation can arise more often than you may think : official packages are compiled choosing a certain number of <code>--enable</code> or <code>--disable</code> options, and these are not necessarily the ones you would have chosen.
 +
 +
To illustrate it, I'll take an example : ''foo'' The ''foo'' package is built with '''arts''' support disabled. Imagine that we want to enable '''arts'''. Here is how to do it :
 +
* find where is the ''foo'' package located. you can do this by :
 +
 +
search for ''foo'' at [http://archlinux.org/packages.php]
 +
use the find command :
 +
 +
  <pre>
 +
  find /var/abs -name "foo"</pre>
 +
 +
use the slocate command :
 +
 +
  <pre>
 +
  slocate foo | grep ^/var/abs</pre>
 +
 +
In any case, you'll find that foo is part of <code>extra</code> and <code>multimedia</code> (for example)
 +
 +
* copy the ''foo'' <code>PKGBUILD</code> file to <code>/var/abs/local/foo</code>
 +
 +
  <pre>
 +
  mkdir /var/abs/local/foo
 +
  cp /var/abs/extra/multimedia/foo/* /var/abs/local/foo
 +
  cd /var/abs/local/foo</pre>
 +
 +
* modify the <code>PKGBUILD</code> file : we'll add support for '''arts''' :
 +
 +
  <pre>
 +
  build() {
 +
    cd $startdir/src/$pkgname-$pkgver
 +
    ./configure --prefix=/usr
 +
    make || return 1
 +
    make prefix=$startdir/pkg/usr install
 +
  }</pre>
 +
 +
becomes :
 +
 +
  <pre>
 +
  build() {
 +
    cd $startdir/src/$pkgname-$pkgver
 +
    ./configure --enable-arts --prefix=/usr
 +
    make || return 1
 +
    make prefix=$startdir/pkg/usr install
 +
  }</pre>
 +
 +
* launch <code>makepkg</code> :
 +
 +
  <pre>
 +
  makepkg</pre>
 +
 +
* install the new package using one of the following commands (<code>-A</code> for install, <code>-U</code> to upgrade an already installed package):
 +
 +
  <pre>
 +
  pacman -A foo-*.pkg.tar.gz
 +
  pacman -U foo-*.pkg.tar.gz</pre>
 +
 +
==== Compiler Flags and Customizing makepkg====
 +
 +
The configuration file for <code>makepkg</code> is <code>/etc/makepkg.conf</code>.  Here you can set environment variables for <code>gcc</code> and <code>make</code>, as well as some for <code>makepkg</code> itself.  The following is an example of <code>/etc/makepkg.conf</code>.
 +
 +
<pre>
 +
# The FTP/HTTP download utility that makepkg will use to acquire sources
 +
export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3"
 +
 +
# Information passed to gcc about what type of computer this is.
 +
export CARCH="i686"
 +
export CHOST="i686-pc-linux-gnu"
 +
 +
# Flags passed to gcc when a package is being compiled
 +
export CFLAGS "-march athlon-tbird -O2 -pipe"
 +
export CXXFLAGS "-march athlon-tbird -02 -pipe"
 +
 +
# Flags passed to make when a package is being compiled
 +
export MAKEFLAGS="-j 2"
 +
 +
# Enable colorized output messages
 +
export USE_COLOR="y"
 +
 +
# The remaining variables only affect the behavior of makepkg
 +
# Enable fakeroot for building packages as a non-root user.
 +
# See 'man fakeroot' for more information on fakeroot
 +
export USE_FAKEROOT="y"
 +
 +
# The directory where all packages will be placed (default is ./)
 +
export PKGDEST=/home/packages
 +
 +
# Base of the ABS tree (default is /var/abs)
 +
export ABSROOT=/var/abs
 +
 +
# Set this if you want your name to show up in the packages you build
 +
export PACKAGER="John Doe <nowhere@microsoft.com>"
 +
</pre>
 +
 +
A word of caution: Users should be sure of any changes they may make to the variables <code>CFLAGS</code>, <code>CXXFLAGS</code>, and <code>MAKEFLAGS</code> as they can cause packages to be unstable or impossible to compile.  Also, the average Arch Linux user will not need to change the values for <code>CARCH</code>, <code>CHOST</code>, and <code>USE_FAKEROOT</code>.
 +
 +
References for gcc and make flags
 +
* [http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/Option-Summary.html#Option-Summary]
 +
* [http://www.gnu.org/software/make/manual/html''chapter/make''9.html#SEC102]

Revision as of 10:28, 30 October 2006

Úvod

Arch Build System (ABS for short) se používá pro

  • Tvorbu nových balíčků jenž ještě neexistují
  • Úpravu existujících balíčků pro vlastní potřeby (např. přidání parametru)
  • Re-build celého vašeho systému s použitím compiler flags, "a la freebsd" (a rozběhnutí modulů jádra s vaším vlastním kernelem!)

ABS není nezbytný pro používání Arch Linuxu ale je užitečný.

Toto how-to se vám pokusí dát přehled o ABS a baličcích Archu, není to kompletní referenční příručka! Pokud chcete víc, zkuste si přečíst manuálovou stránku.

Instalace balíčků

Pro použití abs, musíte nejprve nainstalovat cvsup a wget, to uděláte snadno příkazem:

pacman -Sy cvsup wget

Nebo, pokud máte stažené balíčku do adresáře pojmenovaného 'foo' (pro příklad):

cd foo
pacman -A  cvsup-*.pkg.tar.gz  wget-*.pkg.tar.gz

Co je to balíček ?

Typický soubor balíčku má tvar balíček.pkg.tar.gz

Ve skutečnosti to neni víc než gzipovaný tar archiv který obsahuje:

  • Soubory pro instalaci
  • .PKGINFO : obsahuje všechna metadata potřebné pacmanem k výměně s balíčky, závislostmi, apod.
  • .FILELIST : seznam všech souborů obsažených v archivu. Je to vhodné pro zpětné odinstalování nebo konfliktu souborů.
  • .INSTALL : soubor pro provedení příkazů po instalaci/upgradu/odebrání.

Co je PKGBUILD a co obsahuje?

Vzhledem k vysvětlení výše, soubor PKGBUILD obsahuje metadata o balíčcích. Je to jednoduchý textový soubor. Zde je příklad:

# $Id: PKGBUILD,v 1.12 2003/11/06 08:26:13 dorphell Exp $
# Maintainer: judd <jvinet@zeroflux.org>
# Contributor: Judd Vinet <jvinet@zeroflux.org>
pkgname=foo
pkgver=0.99 # note: if the pkgver had been '0.99-10' then use an underscore. like '0.99_10'
pkgrel=1
pkgdesc="short description of foo"
arch=(i686 x86_64)
url="http://www.foo.org"
groups=
provides=
depends=('qt' 'python')
makedepends=('guile')
conflicts=('yafoo')
replaces=('mffoo')
backup=('etc/foo/foo.conf')
install=('foo.install')
source=(http://www.foo.org/download/$pkgname-$pkgver.tar.gz)
md5sums=('2c0cca3ef6330a187c6ef4fe41ecaa4d35175bee593a7cc7d6205584a94d8625')

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}

Zde si vysvětleme jednotlivé pojmy :

  • # text : komentář
  • # $Id: PKGBUILD,v ... : cvs-tag pro tento balíček (z archlinux-cvs system)
  • # Maintainer : vývojář zodpovědný za balíček v oficiálním repozitáři
  • # Contributor : osoba která napsala PKGBUILD pro tento balíček
  • pkgname : jméno balíčku
  • pkgver : verze balíčku
  • pkgrel : číslo vydání Arch balíčku. V základu je to číslo verze změněné pokud je PKGBUILD modifikován. To se může přihodit z mnoha důvodů pro příklad pokud povolíte compile-time pro něco.
  • pkgdesc : výstižný popis balíčku. Toto je co uvidíte pokud se podíváte na databázi balíčků
  • arch : ukazuje na jakou architektutu je tvořen a odskoušen Arch64_FAQ pro portování.
  • url : domovská stránka softwaru (objevíse pokud kliknete na balíček v databázi balíčků)
  • groups : je užívané ve skupinách balíčků: například když zkusíte nainstalovat kde, nainstalujete všechny balíčky obsažené ve skupině kde.
  • provides : pokud balíček poskytuje jiný balíček, pro příklad kernel-scsi poskytuje kernel
  • depends : seznam závislostí balíčku (co potřebuje k běhu)
  • makedepends : závislosti potřebné k tvorbě balíčku ale nepotřebné k samotnému spuštění
  • conflicts : balíčky které jsou v konfliktu. Např, foo má konflikt s yafoo (yet another foo). Nemůže proto být instalován ve stejnou dobu.
  • replaces : nový balíček přepíše starý. Pokud mffoo (my first foo) je podporován, přepíše foo
  • backup : soubory pro zálohu (jako soubor.pacsave) pokud je balíček odstraněn
  • install : specifikuje speciální instalační script který může být obsažen v balíčku (ve stejném adresáři jako PKGBUILD)
  • source : specifikuje cestu odkud stáhnout zdrojový kód balíčku. Může to být např. "http" nebo "ftp".
  • md5sums : md5 součet pro ověření integrity

Tak pojdme si vysvětlit funkci :

  • build : všechny akce potřebné pro tvorbu balíčku (to bude vysvětleno v tomto dokumentu níže)

Dobře, podíváme se co PKGBUILD obsahuje za informace potřebné pro správce balíčků. To je srdce pacmana a abs.

Jsou tam také instalační soubory. Soubor PKGBUILD odkazuje na 'foo.install' jako na instalační soubor balíčku. Zde je příklad instalačního souboru:

post_install() {
/bin/true
}

post_upgrade() {
/bin/true
}

pre_remove() {
/bin/true
}

op=$1
shift

$op "$@"

Zde je vysvětlení funkcí :

  • post_install : tento script se spístí když jsou soubory nainstalovány, předává jeden argument :
    • the package version
  • post_upgrade : tento script se pustí jsou-li soubory upgradovány předává dva argumenty  :
    • the new package version
    • the old package version
  • pre_remove : spustí se jsou-li soubory odstraněny (například zastaví daemona) a předá jeden argument :
    • the package version

Ostatní jsou řádky potřebné pro každou instalaci.

Funkce build

Jestli nejste seznámen s tvorbou balíčku, měl by jste vědět že většina balíčků (ale ne všechny) jde vytvořit touto cestou :

  • rozbalit zdrojový soubor :
  tar -xzf foo-0.99.tar.gz
  tar -xjf foo-0.99.tar.bz2
  • otevřít adresář
cd foo-0.99
  • konfigurace balíčku : V adresáři je malý script zvaný configure který je použit ke konfiguraci balíčku a kontrole zda má váš pačítač všechen potřebný software. Můžete ho spustit pomocí :
./configure [[option]]

Klidně se můžete podívat na nápovědu jak to pracuje :

./configure --help
  • kompilace zdroje :
make
  • instalace
make install

Vždycky by jste měl číst soubor INSTALL pro informace jak program sestavit a nainstalovat ! Všechny balíčky nepoužívají configure; make; make install systém!

Podívejme se nyní na "standardní" build funkci :

build() {
  cd $startdir/src/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make prefix=$startdir/pkg/usr install
}

Co děláme je to, že :

  • zadání adresáře kde máme zdrojové kódy :
cd $startdir/src/$pkgname-$pkgver

Pokud zkoušíte sestavit balíček, pečlivě zkontrolujte, že je to správný adresář : někdy je adresář pojmenován :

tar -xzf foo-0.99.tar.gz

a ls může vypsat :

  .
  ..
  foo-0.99.tar.gz
  foo/

a ne :

  .
  ..
  foo-0.99.tar.gz
  foo-0.99/
  • konfigurace balíčku a provedení instalace v adresáři /usr :
  ./configure --prefix=/usr
  • kompilace
  make || return 1
  • instaluje software ale ne v adresáři /usr, ale v $startdir/pkg/usr.
  make prefix=$startdir/pkg/usr install

Co potřebujeme je vytvořit balíček ale neinstalovat ho do standartního adresáře (/usr), my chceme pomocí make nastavit náš speciální adresář : $startdir/pkg/usr.

Strom ABS

Když spustíte poprvé abs :

# abs

provede se synchronizace věci zvané " strom ABS" což je vlastně cvs system Archlinuxu. Co je vlastně ABS strom ? Je uložen v /var/abs vypadá takto :

|-
| -- base/
|-
|     ||-- autoconf/
|-
|     ||-- automake/
|-
|     ||-- ...
|-
| -- devel/
|-
| -- ...
|-
| -- extra/
|-
|      || -- deamons/
|-
|      ||      || -- acpid/
|-
|      ||      ||      || -- PKGBUILD
...    ...    ...    ...

So the ABS tree has exactly the same structure as the package database :

  • first level directory represent categories
  • second level directories represent the packages
  • PKGBUILD files contains every information needed concerning the package

However, there is one special directory : local. This directory is yours, this is where you'll do everything : you should never modify the rest of the tree.

NOTE: The first download of the abs tree is the biggest, then only minor updates are needed, so don't be afraid about the data to download if you've got only a 56k connection : it's only text files and it's compressed during the transfer

Now that you know what the ABS tree is, how can we use it ?

First use of ABS : customizing a package

This situation can arise more often than you may think : official packages are compiled choosing a certain number of --enable or --disable options, and these are not necessarily the ones you would have chosen.

To illustrate it, I'll take an example : foo The foo package is built with arts support disabled. Imagine that we want to enable arts. Here is how to do it :

  • find where is the foo package located. you can do this by :

search for foo at [1] use the find command :

  find /var/abs -name "foo"

use the slocate command :

  slocate foo | grep ^/var/abs

In any case, you'll find that foo is part of extra and multimedia (for example)

  • copy the foo PKGBUILD file to /var/abs/local/foo
  mkdir /var/abs/local/foo
  cp /var/abs/extra/multimedia/foo/* /var/abs/local/foo
  cd /var/abs/local/foo
  • modify the PKGBUILD file : we'll add support for arts :
  build() {
    cd $startdir/src/$pkgname-$pkgver
    ./configure --prefix=/usr
    make || return 1
    make prefix=$startdir/pkg/usr install
  }

becomes :

  build() {
    cd $startdir/src/$pkgname-$pkgver
    ./configure --enable-arts --prefix=/usr
    make || return 1
    make prefix=$startdir/pkg/usr install
  }
  • launch makepkg :
  makepkg
  • install the new package using one of the following commands (-A for install, -U to upgrade an already installed package):
  pacman -A foo-*.pkg.tar.gz
  pacman -U foo-*.pkg.tar.gz

Compiler Flags and Customizing makepkg

The configuration file for makepkg is /etc/makepkg.conf. Here you can set environment variables for gcc and make, as well as some for makepkg itself. The following is an example of /etc/makepkg.conf.

# The FTP/HTTP download utility that makepkg will use to acquire sources
export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3"

# Information passed to gcc about what type of computer this is.
export CARCH="i686"
export CHOST="i686-pc-linux-gnu"

# Flags passed to gcc when a package is being compiled
export CFLAGS "-march athlon-tbird -O2 -pipe"
export CXXFLAGS "-march athlon-tbird -02 -pipe"

# Flags passed to make when a package is being compiled
export MAKEFLAGS="-j 2"

# Enable colorized output messages
export USE_COLOR="y"

# The remaining variables only affect the behavior of makepkg
# Enable fakeroot for building packages as a non-root user.
# See 'man fakeroot' for more information on fakeroot
export USE_FAKEROOT="y"

# The directory where all packages will be placed (default is ./)
export PKGDEST=/home/packages

# Base of the ABS tree (default is /var/abs)
export ABSROOT=/var/abs

# Set this if you want your name to show up in the packages you build
export PACKAGER="John Doe <nowhere@microsoft.com>"

A word of caution: Users should be sure of any changes they may make to the variables CFLAGS, CXXFLAGS, and MAKEFLAGS as they can cause packages to be unstable or impossible to compile. Also, the average Arch Linux user will not need to change the values for CARCH, CHOST, and USE_FAKEROOT.

References for gcc and make flags