FrugalBuild (documentation générale)
From FrugalWiki
Contents |
Documentation Générale sur le FrugalBuild
Un FrugalBuild est un script de construction de paquet sur Frugalware.
A Savoir
Cette documentation a pour but de décrire les régles générales que comportent les FrugalBuilds. Pour créer des paquets il vous sera utile de consulter les exemples de FrugalBuilds (et les cas particuliers) ainsi que la page sur makepkg.
Exemple de FrugalBuild
# Last Modified: Sun, 19 Jun 2005 15:24:32 +0000 # Compiling Time: 0.17 SBU # Maintainer: Name <email@addr.ess> pkgname=dvdauthor pkgver=0.6.11 pkgrel=3 pkgdesc="Will generate a DVD movie from a valid mpeg2 stream" depends=('imagemagick' 'libdvdread') Finclude sourceforge groups=('xapps') archs=('i686' 'x86_64') sha1sums=('a99ea7ef6e50646b77ad47a015127925053d34ea') # optimization OK
Explications
Comme vous pouvez le constater, la mise en place d'un FrugalBuild n'est pas si compliqué…
# Last Modified: Sun, 19 Jun 2005 15:24:32 +0000
Cette ligne indique de la dernière mise à jour, ceci est automatiquement mis à jour après une compilation de paquet qui a réussi.
# Compiling Time: 0.17 SBU
Cette ligne définie le temps de la compilation du paquet. Bien sûr cela dépend de votre matériel, donc la valeur SBU est utilisée au lieu des minutes comme unités.
Le SBU est le Static Binutils Unit qui signie le temps que prend “repoman merge binutils” sur votre machine, vous pouvez aussi utilisez makepkg avec le FrugalBuild de binutils, la valeur en secondes sera affichée après la compilation du paquet. Par défaut makepkg vous indiquera combien de secondes prend la compilation. Après que vous ayez construit binutils, vous aurez à mettre à jour votre fichier /etc/makepkg.conf:
SBU="257"
Ceci veut dire que compiler binutils sur votre machine vous a pris 257 secondes. A partir de cette reférence, makepkg affichera des SBU à la place des secondes après les compilations réussies, et cette valeur SBU sera égale pour toutes les machines.
# Maintainer: Name <email@addr.ess>
Si vous souhaitez maintenir le paquet, écrivez votre nom ou pseudo et votre adresse email sur la troisème ligne du FrugalBuild. Si vous ne projettez pas de maintenir le paquet, écrivez “Contributor” à la place de “Maintainer”, plus tard quelqu'un le prendra en charge et rajoutera sa ligne “Maintainer” à ce moment là. Les autres ligne du style “Modified by” ne sont pas permises.
pkgname=dvdauthor
pkgname définie le nom de paquet. Il ne doit pas contenir de lettres majuscules.
pkgver=0.6.11 pkgrel=3
La version du paquet (pkgver pour package version) définie la version de la source, alors que la version de “release” (pkgrel pour package release) définie les changement dans le FrugalBuild.
pkgver doit être en nombre entier, les pkgrels du style “5wanda1” sont eux reservés aux mise à jour sécurité.
Il existe une régle:
en -current, Si le pkgrel original du paquet était 4, alors passer au nombre supérieur (pkgrel=5).
en stable, Pour les mises à jour sécurité 5wanda1 devient 5wanda2.
pkgdesc="Will generate a DVD movie from a valid mpeg2 stream"
pkgdesc est une courte description du paquet et qui tient sur une seule ligne. Essayez de garder une longeur de 80 caractères.
depends=('imagemagick' 'libdvdread')
depends() définies les dépendances du paquet. depends() liste les paquets requis pour la compilation et pour le bon fonctionnement du paquet qui doit être compilé.
Si la dépendance est runtime-only, vous devrez alors utiliser rodepends(), si c'est buildtime-only, là ce sera makedpends() qu'il faudra utiliser.
Finclude sourceforge
Cette ligne est une commande Finclude qui vous permet certaines choses. Il en existe plusieurs types et sont détaillés ici. Elles s'applique pour des cas particuliers.
groups=('xapps')
Le groupe auquel appartient le paquet, il est obligatoire. Doit être au format foo ou foo-extra selon les dossier présent dans le dossier sources de votre FST.
Voici la liste des groupes:
Groupes Exemples de paquets: adesklets-desklets adesklets-anetmon apps aliens, aspell, cups, sudo apps-extra 7zip, bjfilter, clamav, cowsay, ntfs-3g base grub, kernel base-extra kernel-xen0 chroot-core bzip2, distcc core bash, grep devel automake, gcc, jam devel-core fakeroot, pacman-tools devel-extra boost, checkinstall, darcs directfb-drivers directfb-iput-joystick e17-apps eclair, entrance e17-core ecore, epeg e17-extra e17-cpu e17-misc engrave firefox-extensions firefox-adblock games-extra bzflag, supertux, fceu geda-suite gada-core gift-plugins gift-ares gnome alacarte, ekiga, evince gnome-apps gksu gnome-core gedit, totem, zenity gnome-docs gstreamer-docs gnome-extra exaile, gcursor, incollector gnome-libs libgksu kde arts, kdegraphics kde-apps k3b, krusader kde-core kebase, kdelibs kde-docs kdepims-docs kde-extra digikam, kdocker kde-libs qt lib fontconfig, jack lib-extra gnet, hpoj locale-extra aspell-fr misc-fonts corefonts multimedia codecs, xvidcore multimedia-extra streamripper, xmms2 network apache, iptable network-extra bitorrent, lftp thunderbird-extensions thunderird-locale-switcher vmaker-dockapps cputnik x11 ico, kbproto x11-extra fluxbox, fglrx, synaptics, xgl xapps gftp, gimp, wine, xchat xapps-extra vuze, nvu, transmission xfce4 mousepad, orage xfce4-core orage, terminal, thunar xfce4-extra squeeze, xfmedia xfce4-goodies xfce4-battery-plugin xlib aterm, cairo, flashplugin, freeglut xlib-extra clanlib, freealut, simgear, wxgtk xmultimedia gst-plugins-base, ffmpeg xmultimedia-extra audacious, bmpx xorg-apps xlogo, xterm, xvinfo xorg-core tvwm, xcalc xorg-data xbitmaps xorg-doc xorg-docs xorg-drivers xf86-video-vesa xorg-fonts font-adobe-75pi, dejavu-ttf xorg-libs libx11, mesa xorg-proto frontproto, randrproto xorg-util imake, lndir
Il est rudement conseillé d'utiliser un groupe -extra pour vos paquets.
archs=('i686' 'x86_64')
Cette ligne déinie les architectures pour lesquels le paquet sera disponible. S'il n'est pas disponible, gensync ne le prendra pas en compte pour la création de la base de données des paquets. Si vous n'êtes pas capable de fournir un paquet binaire pour une architecture donnée, ne l'incluez pas dans archs(). Par exemple pas grave si le paquet peut être compilé pour x86_64, si vous ne l'avez pas compilez vous-même, ne l'incluez pas. Si vous êtes pas sûr que le paquet ne sera pas disponible piur une architecture donnée, utilisez !arch (exemple: !x86_64).
sha1sums=('a99ea7ef6e50646b77ad47a015127925053d34ea')
Le sha1sums() peut être généré par la commande makepkg -g. Ca a pour but d'éviter de compiler depuis des sources corrompues, surtout quand la construction est automatique. Quand cela est possible vous pouvez utiliser signatures(), son but est que vous n'avez pas à le mettre à jour manuellement à chaque fois.
# optimization OK
Cette ligne s'ajoute automatiquement à la fin du FrugalBuild si la fonction build() a utilisé votre $CFLAGS ou $CXXFLAGS. C'est utile si vous voulez cross-compiler sur une machine rapide pour une machine lente. Si le paquet n'utilise pas votre $CFLAGS les développeurs de Frugalware ne pourront pas le cross-compiler, alors s'il vous paît essayer d'éviter de créer des paquet “non optimisé”. Si le paquet ne contient pas fichier dépendant de l'architecture, vous pourrez ajouter cette ligne manuellement vu que makepkg ne l'aura pas detecté.
Finalement il reste la fonction build() qui a pour but de compiler le paquet. Si vous n'avez rien à faire de spécial, vous n'aurez sûrement pas à spécifier quoique soit, le build() par défaut (c'est à dire lorsque vous ne mettez rien comme dans l'exemple) devrait vous suffire. A moins de de faire un build() spécifique là vous aurez à utiliser certaines fonctions qui sont expliquées dans les exemples de FrugalBuilds.
Une fois le paquet installé avec succès, makepkg va préparer la documentation. Il va séparer les info de debuggage des librairies et binaires et générer un fichier méta-info. Finalement, il compresse le tout en un fichier .fpm et quitte le repertoire à partir duquel vous aviez lançé makepkg.
A ce stade vous devriez avoir un paquet dans votre dossier de travail, portant un nom du style name-version-release-arch.fpm.
Et voilà !
Scriptage Install/Upgrade/Remove
Pacman a la possibilité de stocker et exécuter des scripts spécfiques pour un paquet quand il l'installe, le retire ou le met à jour. Ceci permet à un paquet de “se configurer lui même” après installation et de vous faire le contraire lors de sa désinstallation.
Le temps exact que le script à s'éxécuter varie selon l'opération:
pre_install
Le script se lance avant que les fichiers soit décompréssés.
post_install
Le script se lance après que les fichiers soit décompréssés.
pre_upgrade
Le script se lance avant que les fichiers soit décompréssés.
post_upgrade
Le script se lance après que les fichiers soit décompréssés.
pre_remove
Le script se lance avant que les fichiers soit retirés.
post_remove
Le script se lance après que les fichiers soit retirés.
Pour utiliser cette technique, créer juste un fichier (de préférence, pkgname.install) et mettez le dans le meme repertoire que le script FrugalBuild. Puis utilisez dans le FrugalBuild la directive:
install=pkgname.install
Le script d'installation n'a pas besoin d'être spécfier dans le source() du FrugalBuild. Si vous avez omis la directive, makepkg va vérifier s'il existe un script $pkgname.install et va l'utiliser s'il en trouve un.
Vous pouvez trouver un squellette de script dans /docs/tech/skel/, utilisez le quand vous créer de nouveaux paquets.
Exemple de script:
post_upgrade()
{ echo "START this will be good" echo "DONE 0" echo "START this will fail" echo "DONE 1" echo "old message" }
Les directives du FrugalBuild
pkgname
Le nom du paquet. Doit être un nom compatible unix, il sera inclu dans le nom du fichier FPM.
pkgver
Version de l'application selon son concepteur (exemple: 2.7.1)
pkgrel
Numéro de version du paquet Frugalware Linux.
pkgdesc
Brève description du paquet et ses fonctionalités.
pkgdesc_localized
Description pour langue localisée.
Le format utilisé doit être le suivant pkgdesc_localized=('xx_YY foo' 'xx_YY bar')
url
Ce champ comporte le lien auquel est associé l'application qui doit être empaqueté. C'est généralement le site du projet.
license
Pour définir le type de la licence (exemple “GPL”, “BSD”, “NON-FREE”). Note: cette option est encore en développement et destiné à être changé dans le futur).
install
Pour spécifier un script install qui doit être inclu avec le paquet. Ce fichier doit être dans le même repertoire que celui du FrugalBuild, et il sera copié dans le paquet par makepkg. Il ne doit pas être inclu dans le champ source. Exemple: install=modutils.install
up2date
Cette directive doit contenir la commande qui afichera la version stable du projet. Il va vérifier la présence de nouvelle version sans visiter manuellement le site du projet.
source
La ligne source contient les liens des fichiers sources nécéssaires à la création du paquet. Les fichier sources doivent être dans le même repertoire que le FrugalBuil, à moins qu'il ont des URL (fichiers sources sur le net). Si le fichier source n'existe pas encore dans /var/cache/pacman/src il sera téléchargé par wget.
md5sum
Si ce champ est présent, il doit contenir le MD5 pour chaque fichier source dans le même ordre que le champ source. makepkg va utiliser cela pour vérifier si les fichiers sont fiables et pas corrompus. Pour générer un md5sum facilement, utilisez la commande, makepkg -G »FrugalBuild. Vous pouvez ensuite éditer le FrugalBuild et déplacer la ligne md5sum à la bonne place.
signatures
Si ce chanmp est présent, il doit contenir les signature gpg requises pour vérifier les fichier sources. Quand il n'y a pas de signatures disponibles, laissez le juste vide, comme:
signatures=(${source[0]}.asc )
groups
C'est un champ des noms représentant les groupes de paquets, qui vous permet d'installer plsusieurs paquets en une seule requête. Par exemple, on peut installer les paquets KDE en installant le groupe 'kde'.
archs
Ce champs définie sur quelles architectures le paquet en question sera disponible. Si non disponible cela voudra dire que gensync sautera ce paquet pour générer le base de données des paquets.
backup
Liste des fichiers qui seront sauvegardés lors de la désinstallation du paquet. Cette info est indiqué dans les données méta-info du paquet. Les noms de fchiers doivent être séparés par un espace. Allez voir le manpage de pacman-g2 pour plus d'infos.
depends
Champs avec les paquets de dépendances pour la compilation et le fonctionnement du paquet. Les paquets dans cette liste doivent indiqués entre des (exemple: 'mesa'). Il est possible d'indiquer la version de la dépendance avec comparatifs:
=> (supérieur ou égale à la version)
<= (inférieure ou égale à la version)
= (égale à la version)
makedepends
Semblable à depends, ce champ indique les dépendances requises pour la compilation du paquet et pas son fonctionnement. Même format de listage que depends.
rodepends
Semblable à depends, ce champ indique les dépendances requises pour le fonctionnement du paquet et pas pour sa compilation. Généralement rodepends doit être évité au profit de depends excepté si cela va créer une chaîne de dépendances circulaires (pa exemple compiler logrotate ne requiert pas dcron soit installé). Même format de listage que depends.
conflicts
Ce champ indiques les paquets qui seront en conflit avec le paquet du FrugalBuild. C'est à dire qu'il ne pourront être installés en même temps. Même format de listage que depends mais là vous ne povez spécifier les versions.
provides
Champ indiquant les “provisions virtuelles” que le paquet fournis. Ceci permet à un paquet de fournir des noms de dépendances autres que celui du nom lui-même du paquet. Par exemple les paquets kernel-scsi et kernel-ide packages pouvent fournir chacun 'kernel' qui permet au paquets de simplement dépendre de 'kernel' plutôt que “kernel-scsi OU kernel-ide OU …”
replaces
Ce champ indique les paquets que ce paquet va remplacer, et peut être utilisé pour le renommage/combination de paquets. Par exemple su le paquet kernel est renommé kernel-idle, la commande 'pacman-g2 -Syu' ne vas pas mettre à jour le système, à cause de la différence de noms du paquet. replaces prend en charge ce cas.
options
C'est un champ à utilisé avec diverses options boolèenes. Les valeures possibles sont: nodocs N'ajoute aucune documentation automatiquement (c'est à dire quand il y a un sous-paquet de documentation séparé).
- nostrip
Ne sépare pas les binaires/librairies.
- force
Ceci est utilisé pour forcer le paquet à être mis à jour par –sysupgrade, même si c'est un ancienne version.
- stick
Utiliser pour sauter la mise à jour d'un paquet, même si une nouvelle version est disponible (en particulier pour les applications web où les mises à jour manuelle sont meilleures).
- nobuild
Si cette directive est indiquée, gensync va ignorer ce paquet, donc les utilisateurs doit construire ce paquet sur leur machine car il ne pourront pas l'installer avec pacman-g2 -S. Très utile pour les programmes gratuit mais dont les sources ne sont pas libres.
- nofakeroot
N'abandonne pas les privilèges après avoir chrooter. Requis pour quelques paquet cassés.
- scriptlet
Ne saute pas les scripts en cours d'éxécution même si c'est dans le chroot.
Quel est le processus de la création de paquet par chroot
Premièrement, qu'est ce que le chroot ? Frugalware utilise fakeroot pour éviter que la compilation puisse modifier votre système hôte, utilise un préfixe ou une directive DESTDIR pour installer quoique ce soit dans un repertoire et pas sur le système hôte. Ceci est bien, mais pas assez.
Ce système souffre de la possibilité de contrôler la liste des paquets installés durant la compilation sur le système. A cause de cela, le paquet compilé doit se relié lui même à une librairie installé. De cette facon on ne peut réllement contrôler la liste des vrais dépendances. Par exemple, si libquicktime est installé depuis un fichier source sur mon système, alors mplayer ou un autre programme peut se lier à lui, et alors le depends() ne sera pas correct. Ou si vous avez les sources binaire du driver NVIDIA installé, certains programmes utiliseront les librairies NVIDIA.
Bien sûr, il existe une solution pour éviter ce désagrément, utiliser un véritable chroot au lieu d'un simple fakeroot. Qu'est ce que ca veut dire ? Nous allons exlpiqué tout cela.
Quand vous lancé la construction d'un paquet, un système core chroot est installé dans /var/chroot (bien sur vous pouvez changer son emplacement dans /etc/makepkg.conf). Le système core contient environs 60 paquets qui doivent installé pour pouvoir créer n'importe quel paquet dans l'environnement chroot. Ces paquets (par xemple gcc, kernel-headers, make) ne doivent pas être mentionnés dans makedepends(). La commande 'pacman-g2 -Sg core chroot-core devel-core' vous montrera la liste des paquets.
Lorsque que vous contruisez un paquet avec makepkg -R, pacman-g2 vas installer ces paquets dans /var/chroot si nécéssaire. Cela produira un système Frugalware complètement “clean” constitué des paquets de base uniquement. Ce repertoire /var/chroot est complètement séparé du système hôte donc cela résoudra les problèmes cités plus haut.
Nous voilà à la partie amusante. Les paquets listés dans depends() et makedepends() sont installés dans le système propre . A partie de là, ce chroot est capable de compiler le paquet spécifique dans son enviromment sans paquets non-nécéssaire installé, complètement séparé du système hôte.
Après ca, le chroot doit être nettoyé, en fait, par la désinstaller les des paquets installés par depends() et makedepends(). Cela assure que vous ne devez pas établir le chroot core à partir de zéro.
Cette technique aide à éviter pas mal de problèmes de dépendances et c'est même possible de faire des paquets pour une version différente de Frugalware. C'est tout à fait efficace quand on fait des mises à jour sécurité ou la correction de bugs critiques dans la branche -stable.
Si la compilation échoue, le repertoire de travail ne sera pas éffacé, vous pouvez le trouver dans /var/chroot/var/tmp/fst. Plus tard si vous voulez nettoyer votre chroot (effacer le repertoire de travail et retirer les paquets inutiles) vous pouvez utiliser la commande 'makepkg -CR'.
Pour activer la construction dans un chroot, vous devez lancer la commande makepkg en tant que root ou au moins avec l'option -R.
La séparation de paquet (Splitter un paquet)
La séparation de paquet signie qu'une liste de fichiers va être déplacés pour constitué un sous-apquet (comme libmysql pour mysql). Nous allons définir les propriétés des sous-paquets:
Note: si vous créer plsieurs sous-paquets, maintenir ces paquets demandré beaucoup plus de temps. Pour cette raison la sépération d'un paquet doit avoir une utilité.
Le champ subpkgs() définie les pkgname des sous-paquets. Toutes les directives ont leur équivalent avec subfoo:
pkgname → subpkgs() pkgdesc → subdescs() pkgdesc_localized → subdescs_localized() license() → sublicense() replaces() → subreplaces() groups() → subgroups() depends() → subdepends() rodepends() → subrodepends() removes() → subremoves() conflicts() → subconflicts() provides() → subprovides() backup() → subbackup() install → subinstall() options → suboptions() archs → subarchs()
Exemple simple:
Ajoutez les ligne suivantes à la fin de votre FrugalBuild:
subpkgs=('foo' 'bar') subdescs=('desc of foo' 'desc of bar') subdepends=('foodep1 foodep2' 'bardep1 bardep2') subgroups=('apps' 'apps') subarchs=('i686 x86_64' 'i686 x86_64')
Vous devez définir conflicts, replaces et tout les autres directives pour vos sous-paquets, mais le nécéssaire est seulement de définir ces 5 variables.