Mageia : Compiler ses propres paquets rpm avec Mageia

Présentation





Quel intérêt ?

Et bien c'est simple, vous avez une Mageia stable, et vous voulez un paquet présent dans la version de développement (Cauldron) ou qui est "plus à jour", il peut être intéressant de se fabriquer un RPM maison Mageia2.



Lorsque j'ai réalisé cet article, la version stable de Mageia était la 2, et la version Cauldron sera la future 3.

Les paquets .mga2 sont donc les stables, et les .mga3 sont les Cauldron.

Ma machine est une 64bits, les paquets seront de type x86_64.




Pour télécharger les fichiers sources, On peut utiliser le site http://pkgs.org . La recherche de paquets est simple.



Installation des prérequis





Tout d'abord, pas de bricolage sans marteau, donc pas de compilation sans scripts et programmes pour compiler nos paquets.



Préparons le terrain, installons les outils :



Code BASH :
urpmi rpm-build rpm-sign




Il est bon de noter qu'un paquet compilé, ou "buildé" en franglais, sera de la même architecture et version que votre Mageia.

Si vous possédez une Mageia 2 64bits, vous aurez un paquet xxxxxxxx.mga2.x86_64.rpm






Créer ses paquets





Depuis une source d'une version Cauldron.





Je vais illustrer la création d'un paquet Mageia2 du logiciel pbzip2 (Parallel implementation de bzip2) qui n'est disponible que dans Cauldron.



Dans un premier temps, je télécharge le fichier source depuis internet :



Code BASH :
wget http://mirror.internode.on.net/pub/mageia/distrib/cauldron/SRPMS/core/release/pbzip2-1.1.8-3.mga3.src.rpm




Caché :
[root@supermachine ~]# wget http://mirror.internode.on.net/pub/mageia/distrib/cauldron/SRPMS/core/release/pbzip2-1.1.8-3.mga3.src.rpm

--2013-02-18 21:17:20-- http://mirror.internode.on.net/pub/mageia/distrib/cauldron/SRPMS/core/release/pbzip2-1.1.8-3.mga3.src.rpm

Résolution de mirror.internode.on.net (mirror.internode.on.net)... 150.101.135.3

Connexion vers mirror.internode.on.net (mirror.internode.on.net)|150.101.135.3|:80...connecté.

requête HTTP transmise, en attente de la réponse...200 OK

Longueur: 58946 (58K) [application/x-redhat-package-manager]

Sauvegarde en : «pbzip2-1.1.8-3.mga3.src.rpm»



100%[==========================================================================================================================================>] 58 946 40,2K/s ds 1,4s



2013-02-18 21:17:23 (40,2 KB/s) - «pbzip2-1.1.8-3.mga3.src.rpm» sauvegardé [58946/58946]





Ensuite, la deuxième étape consiste à télécharger les build requires, c'est à dire les paquets nécessaires au bon fonctionnement de la future application à packager:



Code BASH :
urpmi --buildrequires pbzip2-1.1.8-3.mga3.src.rpm 




Caché :
[root@supermachine ~]# urpmi --buildrequires pbzip2-1.1.8-3.mga3.src.rpm

Pour satisfaire les dépendances, le paquetage suivant va être installé :

Paquetage Version Révision Arch

(média « Core Release »)

lib64bzip2-devel 1.0.6 1.mga2 x86_64

un espace additionnel de 467Ko sera utilisé.

156Ko de paquets seront récupérés.

Procéder à l'installation d'un paquetage ? (O/n) o





rsync://distrib-coffee.ipsl.jussieu.fr/pub/linux/Mageia/distrib/2/x86_64/media/core/release/lib64bzip2-devel-1.0.6-1.mga2.x86_64.rpm

installation de lib64bzip2-devel-1.0.6-1.mga2.x86_64.rpm depuis /var/cache/urpmi/rpms

Préparation... #################################################################################################################################################

1/1: lib64bzip2-devel #################################################################################################################################################





Il peut arriver que les dépendances n'existent pas, car elles aussi sont seulement dans les dépôts Cauldron, les compiler avant en suivant cette partie et la suivante)



Dernière étape, on build notre paquet :



Code BASH :
rpmbuild --rebuild pbzip2-1.1.8-3.mga3.src.rpm 




Caché :
[root@localhost ~]# rpmbuild --rebuild pbzip2-1.1.8-3.mga3.src.rpm

Installation de pbzip2-1.1.8-3.mga3.src.rpm

attention: utilisateur iurt inexistant - utilisation de root

attention: groupe iurt inexistant - utilisation de root

attention: utilisateur iurt inexistant - utilisation de root

attention: groupe iurt inexistant - utilisation de root

Exécution_de(%prep): /bin/sh -e /var/tmp/rpm-tmp.BPO73I

+ umask 022

+ cd /root/rpmbuild/BUILD

+ '[' 1 -eq 1 ']'

+ '[' 1 -eq 1 ']'

+ '[' 1 -eq 1 ']'

+ cd /root/rpmbuild/BUILD

+ rm -rf pbzip2-1.1.8

+ /bin/tar -xf -

+ /usr/bin/gzip -dc /root/rpmbuild/SOURCES/pbzip2-1.1.8.tar.gz

+ STATUS=0

+ '[' 0 -ne 0 ']'

+ cd pbzip2-1.1.8

+ sed -i -e 's/ -O2/ -O2 -g -pipe -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 /' Makefile

+ exit 0

Exécution_de(%build): /bin/sh -e /var/tmp/rpm-tmp.OTLaGK

+ umask 022

+ cd /root/rpmbuild/BUILD

+ cd pbzip2-1.1.8

+ '[' 1 -eq 1 ']'

+ '[' 1 -eq 1 ']'

+ make

g++ -O2 -g -pipe -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_POSIX_PTHREAD_SEMANTICS -DUSE_STACKSIZE_CUSTOMIZATION -pthread pbzip2.cpp BZ2StreamScanner.cpp ErrorContext.cpp -o pbzip2 -lbz2 -lpthread

pbzip2.cpp: In function ‘int producer_decompress(int, off_t, queue*)’:

pbzip2.cpp:1484:45: attention : format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘long long unsigned int’ [-Wformat]

pbzip2.cpp: In function ‘void* fileWriter(void*)’:

pbzip2.cpp:2093:91: attention : format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘long long unsigned int’ [-Wformat]

pbzip2.cpp: In function ‘int directcompress(int, off_t, int, const char*)’:

pbzip2.cpp:2336:91: attention : format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘long long unsigned int’ [-Wformat]

pbzip2.cpp: In function ‘void outputBufferInit(size_t)’:

pbzip2.cpp:3071:103: attention : format ‘%u’ expects argument of type ‘unsigned int’, but argument 3 has type ‘size_t {aka long unsigned int}’ [-Wformat]

pbzip2.cpp: In function ‘int main(int, char**)’:

pbzip2.cpp:4003:101: attention : format ‘%u’ expects argument of type ‘unsigned int’, but argument 3 has type ‘long unsigned int’ [-Wformat]

pbzip2.cpp:4372:89: attention : format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘long long unsigned int’ [-Wformat]

pbzip2.cpp:4447:101: attention : format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘long long unsigned int’ [-Wformat]

pbzip2.cpp:4494:159: attention : format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘size_t {aka long unsigned int}’ [-Wformat]

pbzip2.cpp: In function ‘int directdecompress(const char*, const char*)’:

pbzip2.cpp:2498:66: attention : ignoring return value of ‘size_t fwrite(const void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result [-Wunused-result]

pbzip2.cpp:2519:63: attention : ignoring return value of ‘size_t fwrite(const void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result [-Wunused-result]

BZ2StreamScanner.cpp: In member function ‘void pbzip2::BZ2StreamScanner::printCurrentState()’:

BZ2StreamScanner.cpp:500:27: attention : format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘long int’ [-Wformat]

BZ2StreamScanner.cpp:500:27: attention : format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘long int’ [-Wformat]

BZ2StreamScanner.cpp:500:27: attention : format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long int’ [-Wformat]

BZ2StreamScanner.cpp:500:27: attention : format ‘%d’ expects argument of type ‘int’, but argument 6 has type ‘long int’ [-Wformat]

+ exit 0

Exécution_de(%install): /bin/sh -e /var/tmp/rpm-tmp.0gtMfR

+ umask 022

+ cd /root/rpmbuild/BUILD

+ '[' /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64 '!=' / ']'

+ rm -rf /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

++ dirname /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

+ mkdir -p /root/rpmbuild/BUILDROOT

+ mkdir /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

+ cd pbzip2-1.1.8

+ '[' 1 -eq 1 ']'

+ rm -rf /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

+ install -D -m755 pbzip2 /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/bin/pbzip2

+ install -D -m644 pbzip2.1 /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/share/man/man1/pbzip2.1

+ ln -sf ./pbzip2 /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/bin/pbunzip2

+ ln -sf ./pbzip2 /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/bin/pbzcat

+ /usr/lib/rpm/mageia/find-debuginfo.sh /root/rpmbuild/BUILD/pbzip2-1.1.8



extracting debug info from /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/bin/pbzip2

symlinked /usr/lib/debug/usr/bin/pbzip2.debug to /usr/lib/debug/usr/bin/pbunzip2.debug

symlinked /usr/lib/debug/usr/bin/pbzip2.debug to /usr/lib/debug/usr/bin/pbzcat.debug

cpio: /home/iurt/rpm/BUILD/glibc-2.14.1/csu: échec de la fonction : stat: Aucun fichier ou dossier de ce type

cpio: pbzip2-1.1.8/<interne>: échec de la fonction : stat: Aucun fichier ou dossier de ce type

323 blocs

+ '[' -n '' ']'

+ /usr/share/spec-helper/clean_files

+ '[' -n '' ']'

+ /usr/share/spec-helper/compress_files .xz

+ '[' -n '' ']'

+ /usr/share/spec-helper/relink_symlinks

+ '[' -n '' ']'

+ /usr/share/spec-helper/clean_perl

+ '[' -n '' ']'

+ /usr/share/spec-helper/lib_symlinks

+ '[' -n '' ']'

+ /usr/share/spec-helper/gprintify

+ '[' -n '' ']'

+ /usr/share/spec-helper/fix_mo

+ '[' -n '' ']'

+ /usr/share/spec-helper/translate_menu

+ '[' -n '' ']'

+ /usr/share/spec-helper/fix_pamd

+ '[' -n '' ']'

+ /usr/share/spec-helper/remove_info_dir

+ '[' -n '' ']'

+ /usr/share/spec-helper/fix_eol

+ '[' -n '' ']'

+ /usr/share/spec-helper/check_elf_files

Warning: unused libraries in /usr/bin/pbzip2: libm.so.6



+ /usr/lib/rpm/mageia/brp-java-repack-jars

Processing files: pbzip2-1.1.8-3.mga2.x86_64

Exécution_de(%doc): /bin/sh -e /var/tmp/rpm-tmp.7Vm06Z

+ umask 022

+ cd /root/rpmbuild/BUILD

+ cd pbzip2-1.1.8

+ DOCDIR=/root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/share/doc/pbzip2

+ export DOCDIR

+ /bin/mkdir -p /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/share/doc/pbzip2

+ cp -pr AUTHORS ChangeLog COPYING README /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64/usr/share/doc/pbzip2

+ exit 0

Finding Provides: /usr/lib/rpm/mageia/filter.sh ' ' ' ' '/root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64' /usr/lib/rpm/mageia/find-provides

Finding Requires: /usr/lib/rpm/mageia/filter.sh ' ' ' ' '/root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64' /usr/lib/rpm/mageia/find-requires /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64 x86_64

Requires(rpmlib): rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1

Requires: libbz2.so.1()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) rtld(GNU_HASH)

Processing files: pbzip2-debug-1.1.8-3.mga2.x86_64

Vérification des fichiers non empaquetés: /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

Ecrit: /root/rpmbuild/RPMS/x86_64/pbzip2-1.1.8-3.mga2.x86_64.rpm

Ecrit: /root/rpmbuild/RPMS/x86_64/pbzip2-debug-1.1.8-3.mga2.x86_64.rpm

Exécution_de(%clean): /bin/sh -e /var/tmp/rpm-tmp.lDINby

+ umask 022

+ cd /root/rpmbuild/BUILD

+ cd pbzip2-1.1.8

+ /bin/rm -rf /root/rpmbuild/BUILDROOT/pbzip2-1.1.8-3.mga3.x86_64

+ exit 0

Exécution_de(--clean): /bin/sh -e /var/tmp/rpm-tmp.JKrRUJ

+ umask 022

+ cd /root/rpmbuild/BUILD

+ rm -rf pbzip2-1.1.8

+ exit 0





Avant de compiler le paquet, je me suis placé dans le /root, avec l'utilisateur root.



Mon paquet nouvellement buildé se trouve alors dans /root/rpmbuild/RPMS/x86_64



Code BASH :
ls /root/rpmbuild/RPMS/x86_64
pbzip2-1.1.8-3.mga2.x86_64.rpm  pbzip2-debug-1.1.8-3.mga2.x86_64.rpm




Je tente l'installation de mon paquet:



Code BASH :
urpmi pbzip2-1.1.8-3.mga2.x86_64.rpm 




Caché :
[root@localhost x86_64]# urpmi pbzip2-1.1.8-3.mga2.x86_64.rpm





installation de pbzip2-1.1.8-3.mga2.x86_64.rpm

Préparation... #################################################################################################################################################

1/1: pbzip2 #################################################################################################################################################





Voila, notre logiciel est installé.



Code BASH :
which pbzip2
/usr/bin/pbzip2




Caché :
[root@localhost x86_64]# pbzip2 --help

Parallel BZIP2 v1.1.8 - by: Jeff Gilchrist [http://compression.ca]

[Jun. 10, 2012] (uses libbzip2 by Julian Seward)

Major contributions: Yavor Nikolov <nikolov.javor+pbzip2@gmail.com>



Usage: pbzip2 [-1 .. -9] [-b#cdfhklm#p#qrS#tVz] <filename> <filename2> <filenameN>

-1 .. -9 set BWT block size to 100k .. 900k (default 900k)

-b# Block size in 100k steps (default 9 = 900k)

-c,--stdout Output to standard out (stdout)

-d,--decompress Decompress file

-f,--force Overwrite existing output file

-h,--help Print this help message

-k,--keep Keep input file, don't delete

-l,--loadavg Load average determines max number processors to use

-m# Maximum memory usage in 1MB steps (default 100 = 100MB)

-p# Number of processors to use (default: autodetect [1])

-q,--quiet Quiet mode (default)

-r,--read Read entire input file into RAM and split between processors

-S# Child thread stack size in 1KB steps (default stack size if unspecified)

-t,--test Test compressed file integrity

-v,--verbose Verbose mode

-V,--version Display version info for pbzip2 then exit

-z,--compress Compress file (default)

--ignore-trailing-garbage=# Ignore trailing garbage flag (1 - ignored; 0 - forbidden)



If no file names are given, pbzip2 compresses or decompresses from standard input to standard output.



Example: pbzip2 -b15vk myfile.tar

Example: pbzip2 -p4 -r -5 myfile.tar second*.txt

Example: tar cf myfile.tar.bz2 --use-compress-prog=pbzip2 dir_to_compress/

Example: pbzip2 -d -m500 myfile.tar.bz2

Example: pbzip2 -dc myfile.tar.bz2 | tar x

Example: pbzip2 -c < myfile.txt > myfile.txt.bz2









Depuis un paquet rpm source étranger





A Rédiger :


dl rpm src

urpmi --buildrequires xxx.src.rpm ou xxx.spec

rpm -ivh rpmsrc

mod le spec dans $HOME/rpmbuild/SPECS/fichier.spec

rpmbuild -ba $HOME/rpmbuild/SPECS/fichier.spec







Signer ses paquets





En cours de rédaction :




Clé GPG => Mettre



Créer à la racine du compte qui créé ses paquets ce fichier sous le nom de .rpmmacros. Adapter le chemin %_gpg_path et les noms %_gpg_name , %vendor et %packager En fonction de la clé générée précédemment.

Code BASH :
 
%_signature gpg
%_gpg_path /home/adrien/.gnupg
%_gpg_name MLO Packages (Team MLO) <packages@mageialinux-online.org>
%_gpgbin /usr/bin/gpg
%distribution     Mageia
%vendor           MLO <http://www.mageialinux-online.org>
%packager         Adrien.D (MLO Team) <adrien.d@mageialinux-online.org>
 






















Créer les infos de médias





Si les paquets sont hébergés sur un serveur, il est possible de créer les infos de médias, ainsi, il sera possible d'ajouter l'adresse http ou ftp de notre serveur dans les dépôts de logiciels.



Pour cela, se rendre sur le serveur, dans le dossier où se trouvent les RPM.



Exemple :

Code BASH :
cd ~/rpm/mga2/x86_64




Puis générer les fichiers adéquats via :

Code BASH :
genhdlist2 .
adding 7 new rpms not available in existing hdlist
replacing ./media_info/hdlist.cz with hdlist.cz.tmp
replacing ./media_info/synthesis.hdlist.cz with synthesis.hdlist.cz.tmp
updating ./media_info/MD5SUM
 




Le dossier media_info doit se trouver dans le même dossier que les RPM's.



Si les RPM sont dans ~/rpm/mga2/x86_64 vérifier que les fichiers hdlist.cz, synthesis.hdlist.cz et MD5SUM sont dans ~/rpm/mga2/x86_64/media_info



Ajouter le nouveau dépôt via :

Code BASH :
urpmi.addmedia --update <nom> <adresse_du_depôt>




l'option --update indique qu'il s'agit d'un média de mises à jour.





Tester ses RPM (vérifier les erreurs)





Pour vérifier les erreurs d'un RPM, qui se sont glissées dans le fichier SPEC, lancer la commande rpmlint :



Code BASH :
rpmlint le_nom_du_paquet.src.rpm
rpmlint le_nom_du_paquet.rpm