Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
documentation:methode_de_creation_des_paquets_pour_0linux_native [13-08-2014 22:09]
appzer0 [cflags]
documentation:methode_de_creation_des_paquets_pour_0linux_native [23-03-2015 13:09]
appzer0 [creer_post_installation]
Ligne 1: Ligne 1:
 ====Créer et exécuter des recettes==== ====Créer et exécuter des recettes====
  
-On se base sur la [[http://​git.tuxfamily.org/​0linux/​0linux.git?p=0linux/0linux.git;​a=blob;​f=generique.recette|recette générique]] de 0Linux pour créer rapidement des paquets. La recette a été simplifiée et comprend des fonctions pour automatiser les tâches rébarbatives. Elle inclut toutes les commandes que l'on appellerait habituellement sur la ligne de commande, en s'​aidant des fonctions pré-enregistrées dans ''/​usr/​share/​0outils/​fonctions_paquets.sh''​ .+On se base sur la [[http://​git.tuxfamily.org/​0linux/​0linux.git/​tree/generique.recette|recette générique]] de 0Linux pour créer rapidement des paquets. La recette a été simplifiée et comprend des fonctions pour automatiser les tâches rébarbatives. Elle inclut toutes les commandes que l'on appellerait habituellement sur la ligne de commande, en s'​aidant des fonctions pré-enregistrées dans ''/​usr/​share/​0outils/​fonctions_paquets.sh''​ .
  
 La recette équivaut en fait à empaqueter un logiciel manuellement sur le terminal, ou via un petit script, en le compilant et en l'​installant à un emplacement spécifique puis à le passer à ''​spackpkg''​ pour en faire un paquet pour 0Linux, installable avec ''​spackadd''​. ​ La recette équivaut en fait à empaqueter un logiciel manuellement sur le terminal, ou via un petit script, en le compilant et en l'​installant à un emplacement spécifique puis à le passer à ''​spackpkg''​ pour en faire un paquet pour 0Linux, installable avec ''​spackadd''​. ​
Ligne 7: Ligne 7:
 ====Recette exemple==== ====Recette exemple====
  
-Voici une recette typique (l'​exemple vient de la recette ​''​a/​xz/​xz.recette''​) afin de vous donner une idée générale :+Voici une recette typique (ici ''​a/​xz/​xz.recette''​) afin de vous donner une idée générale :
  
 <code bash> <code bash>
Ligne 34: Ligne 34:
  --infodir=/​usr/​info \  --infodir=/​usr/​info \
  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
- --build=${PKGARCH}-0-linux-gnu+ --build=${PKGARCH}-0linux-linux-gnu
  
 make -j${JOBS} || make make -j${JOBS} || make
Ligne 54: Ligne 54:
 ====Exécuter une recette==== ====Exécuter une recette====
  
-Les recettes sont exécutables (et censées l'​être). On empaquète un logiciel en exécutant simplement la recette :+Les recettes sont exécutables (et censées l'​être) ​
 + 
 +<code bash> 
 +chmod +x unlogiciel.recette 
 +</​code>​ 
 + 
 +On empaquète un logiciel en exécutant simplement la recette :
  
 <code bash> <code bash>
Ligne 107: Ligne 113:
 export PKGSOURCES=/​home/​appzer0/​0/​pub/​archives_sources ​  # Vaut "​répertoire courant par défaut",​ donc aux côtés de la recette, non recommandé (pollue le dépôt des recettes avec des archives sources en vrac) export PKGSOURCES=/​home/​appzer0/​0/​pub/​archives_sources ​  # Vaut "​répertoire courant par défaut",​ donc aux côtés de la recette, non recommandé (pollue le dépôt des recettes avec des archives sources en vrac)
 export MARMITE=/​tmp/​0-marmite ​                           # Vaut '/​tmp/​0-marmite'​ par défaut export MARMITE=/​tmp/​0-marmite ​                           # Vaut '/​tmp/​0-marmite'​ par défaut
-export PKGREPO=${PKGREPO:-/​home/​appzer0/​0linux/​mes_paquets} ​        # Vaut '/​usr/​local/​paquets'​ par défaut'​+export PKGREPO=/​home/​appzer0/​0linux/​theta                ​# Vaut '/​usr/​local/​paquets'​ par défaut'​
 </​code>​ </​code>​
  
-''​PKGSOURCES''​ est le répertoire contenant les archives sources téléchargées par chaque recette. Par défaut, les archives se téléchargent ​au sein du répertoire ​de la recette, rendant ainsi vite le dépôt surchargé d'​archives. À éviter, à mon humble avis... Utilisez un dépôt séparé pour les archives sources et affectez ce répertoire à ''​PKGSOURCES''​.+Comme on le voit ici, je définis ''​PKGREPO''​ à un répertoire ''​theta'',​ qui est la version du système 0Linux que j'​exécute à ce moment-là. Les paquets créés se rangeront alors dans un répertoire ''/​home/​appzer0/​0linux/​theta/​ARCHITECTURE'',​ nommé ''​i686'',​ ''​x86_64''​ ou ''​arm''​ selon l'​architecture utilisée. Je recommande d'en faire autant. 
 + 
 +''​PKGSOURCES''​ est le répertoire contenant les archives sources téléchargées par chaque recette. Par défaut, les archives se téléchargent ​dans le même répertoire ​que la recette, rendant ainsi vite le dépôt surchargé d'​archives. À éviter, à mon humble avis... Utilisez un dépôt séparé pour les archives sources et affectez ce répertoire à ''​PKGSOURCES''​.
  
 :!: Le script ''​fonctions_paquets.sh''​ se charge aussi de déplacer chaque archive source dans un répertoire dédié si celles-ci sont encore rangées en vrac. Ainsi, dans notre cas, les sources du paquet ''​libpng''​ seront rangées (ou déplacées) dans ''/​home/​appzer0/​0/​pub/​archives_sources/​libpng/​libpng-1.2.3.tar.gz''​. :!: Le script ''​fonctions_paquets.sh''​ se charge aussi de déplacer chaque archive source dans un répertoire dédié si celles-ci sont encore rangées en vrac. Ainsi, dans notre cas, les sources du paquet ''​libpng''​ seront rangées (ou déplacées) dans ''/​home/​appzer0/​0/​pub/​archives_sources/​libpng/​libpng-1.2.3.tar.gz''​.
Ligne 168: Ligne 176:
 </​code>​ </​code>​
  
-Voyez pour exemple la recette ​ ''​d/​git/​git.recette''​.+Cette variable sera traitée par la fonction ''​telecharger_sources''​ (voir plus bas). Voyez pour exemple la recette ​ ''​d/​git/​git.recette''​, qui contient un tableau.
  
 Puis vient la description du paquet dans ''​DESC''​ : Puis vient la description du paquet dans ''​DESC''​ :
Ligne 208: Ligne 216:
  
 ''​telecharger_sources''​ télécharge la ou les archives des sources à(aux) (l'​)adresse(s) définie(s) dans ''​$WGET'',​ si la ou les archives sont absentes, que celle-ci soit une simple URL ou bien un tableau de plusieurs URL (voir plus haut dans cette page) puis s'​occupe de vérifier l'​intégrité des archives téléchargées. ''​telecharger_sources''​ télécharge la ou les archives des sources à(aux) (l'​)adresse(s) définie(s) dans ''​$WGET'',​ si la ou les archives sont absentes, que celle-ci soit une simple URL ou bien un tableau de plusieurs URL (voir plus haut dans cette page) puis s'​occupe de vérifier l'​intégrité des archives téléchargées.
 +
 +Depuis ''​0outils 12.9'',​ ''​telecharger_sources''​ gère également les dépôts git. Il suffit de renseigner l'​adresse du dépôt commençant par « git: ». Le commit concerné doit se retrouver dans la variable ''​VERSION''​. On spécifie les 10 premiers caractères du « hash » du commit voulu. Exemple :
 +
 +<code bash>
 +VERSION=13eb208681 # Les 10 premiers caractères du commit désiré
 +WGET=git://​git.kernel.org/​pub/​scm/​linux/​kernel/​git/​firmware/​linux-firmware.git
 +</​code>​
 +
 +Pour éviter de cloner le dépôt à chaque fois, ''​telecharger_sources''​ va se charger de faire plusieurs choses ​ : 
 +  * cloner le dépôt git via ''​git clone''​
 +  * faire un ''​git checkout''​ sur le commit spécifié dans ''​VERSION''​
 +  * nettoyer tout répertoire ''​.git''​
 +  * renommer le répertoire principal en ''​PAQUET-VERSION''​
 +  * créer une archive compressée nommée ''​PAQUET-VERSION.tar.xz''​ du répertoire ''​PAQUET-VERSION''​
 +  * la ranger dans ''​PKGSOURCES/​PAQUET''​
 +
 ---- ----
  
Ligne 270: Ligne 294:
 On peut forcer une autre architecture que celle de l'​hôte pour certains cas spéciaux (compilation croisée pour la prise en charge du multilib notamment, etc.) en appelant la fonction avec un paramètre. Par exemple : On peut forcer une autre architecture que celle de l'​hôte pour certains cas spéciaux (compilation croisée pour la prise en charge du multilib notamment, etc.) en appelant la fonction avec un paramètre. Par exemple :
   cflags i686   cflags i686
-... forcera la compilation en i686 même si l'​hôte est un x86_64. Cette fonction est souvent utilisée dans les recettes nécessitant de gérer le mécanisme « multilib », comme c'est le cas pour les recettes x86_64 nécessitant des bibliothèques 32 bits i686 au sein du même paquet. Voyez la recette ''​[[http://​git.tuxfamily.org/​0linux/​0linux.git?p=0linux/0linux.git;​a=blob;​f=b/​zlib/​zlib.recette|zlib.recette]]''​ pour un exemple concret de recette multilib.+... forcera la compilation en i686 même si l'​hôte est un x86_64. Cette fonction est souvent utilisée dans les recettes nécessitant de gérer le mécanisme « multilib », comme c'est le cas pour les recettes x86_64 nécessitant des bibliothèques 32 bits i686 au sein du même paquet. Voyez la recette ''​[[http://​git.tuxfamily.org/​0linux/​0linux.git/​tree/​0Linux/​b/​zlib/​zlib.recette|zlib.recette]]''​ pour un exemple concret de recette multilib.
  
 On peut également forcer une architecture non native (si on veut compiler uniquement du 32 bits i686 sur une 0Linux 64 bits) en spécifiant sur la ligne de commande la variable ''​$FORCE_PKGARCH''​. Cette variable ne sert que dans de rares cas, par exemple générer des paquets purs i686 sur un hôte 64 bits prenant en charge le multilib i686. On peut également forcer une architecture non native (si on veut compiler uniquement du 32 bits i686 sur une 0Linux 64 bits) en spécifiant sur la ligne de commande la variable ''​$FORCE_PKGARCH''​. Cette variable ne sert que dans de rares cas, par exemple générer des paquets purs i686 sur un hôte 64 bits prenant en charge le multilib i686.
Ligne 277: Ligne 301:
 ====configure_make_makeinstall==== ====configure_make_makeinstall====
  
-:!: Disponible uniquement à partir de 0Linux theta+:!: Disponible uniquement à partir de ''​0outils 12.8''​
  
 Cette fonction représente un raccourci qui peut servir pour les cas (trop rares) où la procédure de construction est parfaitement standard (commandes ''​./​configure ; make ; make install''​). Elle déduit les options disponibles dans le ''​configure''​ ( ''​--prefix'',​ ''​--localstatedir'',​ ''​--libdir'',​ ''​--mandir'',​ etc.) et tente de les spécifier au mieux pour 0Linux. Cette fonction représente un raccourci qui peut servir pour les cas (trop rares) où la procédure de construction est parfaitement standard (commandes ''​./​configure ; make ; make install''​). Elle déduit les options disponibles dans le ''​configure''​ ( ''​--prefix'',​ ''​--localstatedir'',​ ''​--libdir'',​ ''​--mandir'',​ etc.) et tente de les spécifier au mieux pour 0Linux.
Ligne 315: Ligne 339:
 Il détecte automatiquement si des fichiers ''​*.0nouveau''​ sont présents et crée le script permettant de comparer avec des fichiers déjà installés sur le système et le cas échéant d'​éviter l'​écrasement de fichiers de configuration. Ainsi, pour créer un fichier qui ne doit pas écraser un fichier portant le même nom  (par exemple, ''​httpd.conf''​) lors d'une mise à niveau, il suffit de lui ajouter l'​extension ''​.0nouveau''​ (par exemple ''​httpd.conf.0nouveau''​). Ce sera à l'​utilisateur de vérifier s'il veut migrer vers le fichier en ''​.0nouveau''​ ou pas. Si oui, il supprimera l'​extension ''​.0nouveau''​ et écrasera son ancien fichier, sinon, soit il ne fera rien, soit il supprimera le fichier ''​.0nouveau''​ (idéalement). Il détecte automatiquement si des fichiers ''​*.0nouveau''​ sont présents et crée le script permettant de comparer avec des fichiers déjà installés sur le système et le cas échéant d'​éviter l'​écrasement de fichiers de configuration. Ainsi, pour créer un fichier qui ne doit pas écraser un fichier portant le même nom  (par exemple, ''​httpd.conf''​) lors d'une mise à niveau, il suffit de lui ajouter l'​extension ''​.0nouveau''​ (par exemple ''​httpd.conf.0nouveau''​). Ce sera à l'​utilisateur de vérifier s'il veut migrer vers le fichier en ''​.0nouveau''​ ou pas. Si oui, il supprimera l'​extension ''​.0nouveau''​ et écrasera son ancien fichier, sinon, soit il ne fera rien, soit il supprimera le fichier ''​.0nouveau''​ (idéalement).
  
-Cette fonction s'​occupe également d'​ajouter toutes les fonctions de réindexation,​ mise à jour etc. dans ce même script (icônes à réindexer, polices à réindexer, raccourcis bureau à mettre à jour, types MIME à mettre à jour, bibliothèques à ajouter à l'​éditeur de liens via ''​ldconfig'',​ mise à jour des dépendances entre modules noyau, etc.). Voyez les sources du fichier de fonctions dans ''​[[http://​git.tuxfamily.org/​0linux/​0linux.git?p=0linux/0linux.git;​a=blob;​f=0Linux/​a/​0outils/​fonctions_paquets.sh|0Linux/​a/​0outils/​fonctions_paquets.sh]]''​ pour plus de détails).+Cette fonction s'​occupe également d'​ajouter toutes les fonctions de réindexation,​ mise à jour etc. dans ce même script (icônes à réindexer, polices à réindexer, raccourcis bureau à mettre à jour, types MIME à mettre à jour, bibliothèques à ajouter à l'​éditeur de liens via ''​ldconfig'',​ mise à jour des dépendances entre modules noyau, etc.). Voyez les sources du fichier de fonctions dans ''​[[http://​git.tuxfamily.org/​0linux/​0linux.git/​tree/0Linux/​a/​0outils/​fonctions_paquets.sh|0Linux/​a/​0outils/​fonctions_paquets.sh]]''​ pour plus de détails).
  
 On ajoutera donc à loisir manuellement d'​autres fonctions au script ''​${PKG}/​post-install.sh'',​ notamment des permissions spéciales ou des commandes particulières via de simples ''​echo''​ ou ''​cat''​ (via la syntaxe « heredoc », voyez en fin de page). On ajoutera donc à loisir manuellement d'​autres fonctions au script ''​${PKG}/​post-install.sh'',​ notamment des permissions spéciales ou des commandes particulières via de simples ''​echo''​ ou ''​cat''​ (via la syntaxe « heredoc », voyez en fin de page).
Ligne 360: Ligne 384:
  --infodir=/​usr/​info \  --infodir=/​usr/​info \
  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
- --build=${PKGARCH}-0-linux-gnu+ --build=${PKGARCH}-0linux-linux-gnu
  
 make -j${JOBS} || make make -j${JOBS} || make
Ligne 406: Ligne 430:
  --infodir=/​usr/​info \  --infodir=/​usr/​info \
  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
- --build=${PKGARCH}-0-linux-gnu+ --build=${PKGARCH}-0linux-linux-gnu
  
 make -j${JOBS} || make make -j${JOBS} || make
Ligne 418: Ligne 442:
 # C'est fini. # C'est fini.
  
 +</​code>​
 +----
 +
 +====Recette multilib pour x86_64====
 +
 +Voici une recette qu'on rencontre assez souvent sous 0Linux x86_64, c'ets la recette multilib, contenant les versions 32 bits et 64 bits d'un même paquet. Voyons un exemple avec ''​libidn''​.
 +
 +On a là une recette multilib sommes toutes assez classique. Remarquez qu'on appelle ''​cflags''​ pour définir l'​architecture détectée (ici x86_64), afin d'​appeler à nouveau ''​cflags i686''​ pour compiler en 32 bits sur un hôte en 64 bits. Puis on recompile en 64 bits. Les fichiers installés par l'​étape 64 bits écraseront ceux installés par l'​étape 32 bits. Les plus curieux auront remarqué qu'on appelle ''​preparer_sources''​ 3 fois en tout, ce qui est sinon une erreur, du moins une maladresse.
 +
 +<code bash>
 +#​!/​usr/​bin/​env bash
 +. /​usr/​share/​0outils/​fonctions_paquets.sh
 +
 +VERSION=1.29
 +WGET=http://​ftp.gnu.org/​gnu/​$NAMESRC/​$NAMESRC-$VERSION.tar.gz
 +DESC="​Bibliothèques pour noms de domaine internationalisés"​
 +
 +telecharger_sources
 +preparer_sources # À partir d'ici, on se trouve dans les sources décompactées.
 +cflags
 +
 +# On compile les bibliothèques 32 bits pour le multilib sous x86_64 :
 +if [ "​${PKGARCH}"​ = "​x86_64"​ ]; then
 +
 + # On passe en 32 bits (CFLAGS, LIBDIRSUFFIX,​ PKGARCH et Cie) :
 + cflags i686
 +
 + # Compilation pour i686 :
 + CFLAGS="​${FLAGS}"​ CXXFLAGS="​${FLAGS}"​ \
 + ./​configure \
 + --prefix=/​usr \
 + --sysconfdir=/​etc \
 + --localstatedir=/​var \
 + --libdir=/​usr/​lib${LIBDIRSUFFIX} \
 + --mandir=/​usr/​man \
 + --infodir=/​usr/​info \
 + --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
 + --build=${PKGARCH}-0linux-linux-gnu
 +
 + make -j${JOBS} || make
 + fakeroot make install DESTDIR=${PKG}
 +fi
 +
 +# On refait la préparation des sources, il peut rester des déchets de la
 +# compilation en 32 bits (et make '​distclean'​ ne fonctionne pas toujours) :
 +preparer_sources # À partir d'ici, on se trouve dans les sources décompactées.
 +cflags
 +
 +# Compilation :
 +CFLAGS="​${FLAGS}"​ CXXFLAGS="​${FLAGS}"​ \
 +./configure \
 + --prefix=/​usr \
 + --sysconfdir=/​etc \
 + --localstatedir=/​var \
 + --libdir=/​usr/​lib${LIBDIRSUFFIX} \
 + --mandir=/​usr/​man \
 + --infodir=/​usr/​info \
 + --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
 + --build=${PKGARCH}-0linux-linux-gnu
 +
 +make -j${JOBS} || make
 +fakeroot make install DESTDIR=${PKG}
 +
 +installer_doc
 +creer_post_installation
 +stripper
 +empaqueter
 +
 +# C'est fini.
 </​code>​ </​code>​
 ---- ----
Ligne 480: Ligne 573:
  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
  --enable-bidule \  --enable-bidule \
- --build=${PKGARCH}-0-linux-gnu+ --build=${PKGARCH}-0linux-linux-gnu
  
 make -j${JOBS} || make make -j${JOBS} || make
Ligne 505: Ligne 598:
  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \  --docdir=/​usr/​doc/​${NAMETGZ}-${VERSION} \
  --enable-bidule \  --enable-bidule \
- --build=${PKGARCH}-0-linux-gnu+ --build=${PKGARCH}-0linux-linux-gnu
  
 cd - cd -
Ligne 589: Ligne 682:
 Les paquets-abonnements remplacent les anciens « dépôts » de 0Linux I, II et zeta et permettent de regrouper un ensemble de logiciels sous forme d'​abonnement (par exemple, tout KDE, GIMP et ses greffons, un ensemble d'​applications pour serveur Web, studio multimédia,​ etc.). Ils se nomment obligatoirement avec un suffixe « -abonnement » et leur recette est nommé ainsi : ''​nom-abonnement.recette''​. Les paquets-abonnements remplacent les anciens « dépôts » de 0Linux I, II et zeta et permettent de regrouper un ensemble de logiciels sous forme d'​abonnement (par exemple, tout KDE, GIMP et ses greffons, un ensemble d'​applications pour serveur Web, studio multimédia,​ etc.). Ils se nomment obligatoirement avec un suffixe « -abonnement » et leur recette est nommé ainsi : ''​nom-abonnement.recette''​.
  
-Les sources de 0Linux, contenues dans une arborescence géré par ''​git''​ (voir la page des téléchargements),​ contiennent des fichiers exemples (notamment le fichier ''​generique-abonnement.recette''​) ainsi que de multiples recettes sous ''​0abonnements/''​ dont on peut et devrait s'​inspirer. Voyez plus bas dans cette page pour une explication sur la syntaxe de la description du paquet-abonnement.+Les sources de 0Linux, contenues dans une arborescence géré par ''​git''​ (voir la page des téléchargements),​ contiennent des fichiers exemples (notamment le fichier ''​generique-abonnement.recette''​) ainsi que de multiples recettes sous ''​z/''​ dont on peut et devrait s'​inspirer. Voyez plus bas dans cette page pour une explication sur la syntaxe de la description du paquet-abonnement.
 ---- ----