EEIJ

Païou : Mandriva Linux depuis 2002. Aujourd'hui, c'est Mageia Linux


Sommaire


Conforme à XHTML 1.0 Strict Conforme à CSS!

On se lasse de tout, sauf de comprendre.
Attribué à Virgile.

Modification ou création du fichier .spec

Historique

27 mars 2015 : Création de cette page.

Difficulté

Pour : linuxien averti.

 Introduction

Comme moi, vous pouvez être amenés à modifier un fichier .spec ou à en créer un nouveau.
Cette page ne décrira probablement pas tous les cas de figure. Puisse-t-elle simplement vous guider.
Elle va essayer de décrire ce qui peut se trouver dans un fichier .spec.

Haut

 Description

Ce fichier définit :

  1. les propriétés du paquetage
  2. comment compiler le programme pour faire les paquetages binaires (les i586 ou x86_64)
  3. comment le paquetage binaire sera installé chez l'utilisateur

Cette page ne peut pas recenser tous les cas de figure possibles d'un fichier .spec. Vous pourrez compléter ces informations en étudiant bon nombre de fichiers spec.

Des remarques préliminaires :

Haut

 Section En-tête

Le préambule

Il comprend différents renseignements relatifs au paquetage :
Name: gzip le nom du paquetage
Summary: The GNU data compression program description brève
Version: 1.6
Release: %mkrel 7
URL: http://www.gnu.org/software/gzip/
License: GPLv3+
Group: Archiving/Compression

Il peut y avoir un champ
BuildArch: noarch lorsque le paquetage n'est pas spécifique à une architecture (doc, scripts bash , perl ...)

Définition de macros

Les renseignements ci-dessus peuvent également être fournis au moyen de macros (l'intérêt des macros est qu'il suffit de définir la valeur une seule fois, au début du fichier) :
%define name gzip
%define version 1.6
%define release %mkrel 7
et plus loin :
name: %{name}
version: %{version}
release: %{release}

%define : Elle définit une constante utilisable par les sections suivantes du fichier.spec, constante qui est alors utilisée avec %{name}, %{version} ...
La valeur de cette constante peut être une chaîne de caractères ou une valeur booléenne (0/1).

%mkrel : macro qui est utilisée pour ajouter le suffixe défini dans le fichier .rpmmacros et la version de la distribution (ici 7) après le numéro de révision du paquetage.

%{name} : correspond à la valeur de variable name définie par %define

Les macros des instructions conditionnées

Il est possible d'inclure des conditions dans la construction des paquetages : inclure ou non des fonctions, des options de compilation ...

Un peu comme pour le bash ou d'autres langages, ce sont des constructions de la forme :
%if condition
  Instructions
%else
  Autres instructions
%endif

Exemples de constructions
  • Une variable est définie en début de fichier, avec une valeur 0. Des constructions conditionnelles utiliseront cette variable par la suite.
    L'intérêt est qu'il suffit de modifier la valeur, en début de fichier pour que toutes les instructions conditionnelles soient exécutées ou non.
    %define buildpdf 0 définit une variable buildpdf qui pourra être utilisée plusieurs fois dans la spec
    %if %buildpdf si la variable est vraie (=1)
      BuildRequires: tetex-latex instruction, dans ce cas uniquement
    %endif fin
  • Certaines instructions ne doivent être exécutées que pour certaines architectures.
    %ifarch xxx yyy zzz (si l'architecture est xxx ou yyy ou zzz, par exemple %ifarch %{ix86})
      instructions
    %else
      autres instructions
    %endif
  • D'autres conditions peuvent être utilisées : %ifnarch %ifos %ifnos
  • Au lieu de définir une variable en début de fichier, il est également possible de la définir sur la ligne de commanderpmbuild, telles que --with xxx ou --without yyy
    %bcond_with foo active (=1) with_foo si --with foo figure sur la ligne de commande
    %bcond_with foo désactive (=0) with_foo si --with foo ne figure pas sur la ligne de commande
    %bcond_without fboo active (=1) with_foo si --with foo ne figure pas sur la ligne de commande
    %bcond_without foo désactive (=0) with_foo si --with foo figure sur la ligne de commande

%Description

%Description marque le début du paragraphe qui décrit de façon plus détaillée le paquetage.
Tout ce qui vient après l'étiquette %Description, jusqu'à l'étiquette suivante, constitue la description du paquetage.
Il ne faut pas hésiter à bien documenter.
On peut y indenter des paragraphes, séparer avec des lignes vides ...

Sources et patches

Pour construire le paquetage il est nécessaire de savoir où trouver les sources du logiciel d'origine. Un même paquetage peut nécessiter plusieurs logiciels différents et donc plusieurs sources.
Source0: ftp://ftp.gnu.org/gnu/gzip/gzip-%{version}.tar.xz(on utilise ici %version pour définir la version)
Source1: ftp://ftp.gnu.org/gnu/gzip/gzip-%{version}.tar.xz.sig

Le logiciel d'origine doit parfois être corrigé ou adapté. On utilise, pour ceci, des patchs. Ils doivent également être définis. Il peut y en avoir plusieurs.
Patch0: gzip-1.3.12-openbsd-owl-tmp.patch
Patch18: gzip-1.6-zgrep_signal_race_condition.patch

Les dépendances

Pour pouvoir construire le nouveau paquetage, il faut que les outils appropriés soient disponibles.
BuildRequires: texinfo (le paquetage texinfo doit être installé).

De même, pour pouvoir installer le nouveau paquetage, par la suite, des dépendances doivent être installées.
Requires: mktemp less

Dans certains cas, le paquetage créé doit également fournir le nom d'un paquetage virtuel, c'est-à-dire qu'il fournit une fonctionnalité définie par ce nom.
Provides: xxxx

Le nouveau paquetage peut entrer en conflit avec d'autres, souvent plus anciens.
Conflicts: yyyy

Certains paquetages ne sont pas spécifiques à une architecture donnée. Ils sont notés noarch.
BuildArch: noarch

La suite

Maintenant que la présentation est terminée, la construction commence effectivement.
Depuis cette section %prep et jusqu'à la fin du fichier, à l'intérieur de chaque section, il faut considérer les instructions comme étant des instructions de script bash qui exécutent ce que rpmbuild doit faire durant les phases de construction, d'installation, de nettoyage.

Haut

 Section %Prep

Cette section prépare l'environnement de construction à l'aide de commandes sh et de scripts pré-définis. Une connaissance basique de bash est donc nécessaire.
Elle comprend le premier script pré-défini exécuté par rpmbuild : %prep.
En effet, %Prep marque le début de la section, mais est également un script %prep.

Le rôle du script est de :

Le script %prep peut avoir une option %prep -q pour devenir silencieux.

Pour terminer la préparation, il existe trois macros très utiles :

%setup

Cette macro se place directement après %prep. Elle

  1. exécute une commande cd vers le répertoire BUILD
  2. efface les anciennes traces de construction
  3. décompresse et extrait les sources (silencieusement, avec l'option -q),
  4. exécute une commande cd vers le sous-répertoire %{name}-%{version}
    Ceci implique que les fichiers-sources contiennent déjà ce sous-répertoire.
    Dans le cas contraire, il faut utiliser l'option -c (voir les options, ci-dessous)
    Ceci implique également que le nom du sous-répertoire soit le même, sinon, utilisez l'option -n
  5. change le propriétaire et les permissions des fichiers de ce répertoire.

Il peut arriver que l'archive ne soit pas réalisée selon la forme classique : un répertoire conteneur se nommant nom_du_paquetage-sa_version, Ex gzip-1.6
Dans ce cas il faut ajouter une option à %setup.
Il se peut également qu'il y ait plusieurs sources à désarchiver. Il faut alors également ajouter les options adéquates.

Pour les curieux, survolez : les options pour la macro %setup
-n NomRépertoire: définit le nom du répertoire de décompression lorsque celui-ci diffère de %{name}-%{version}
-c NomRépertoire : crée un sous-répertoire dans BUILD, accède à ce répertoire avant de décompresser, au lieu d'y accéder après décompression
-D : n'efface pas le sous-répertoire (est utilisé sur une macro %setup supplémentaire, pour ne pas effacer
-T : ne décompresse pas la source0 (peut être utilisé avec une macro %setup supplémentaire qui décompressera une autre source)
-b # : décompresse également la source Source#, avant d'accéder au sous-répertoire (il est rarement utilisé)
-a # : décompresse également la source Source#, après avoir accédé au sous-répertoire
-q : exécute en silence
Exemple de commandes

Si vous avez des problèmes, je vous conseille de ne pas utiliser l'option q, dans un premier temps.

  • %setup : décompression de Source0 (c'est le répertoire standard %{name}-%{version} avec ses fichiers).
  • %setup -a 1 -a 2décompression de Source0 (répertoire standard %{name}-%{version}), puis décompression de Source1 et Source2 n'incluant pas le sous-répertoire standard (en général, des fichiers isolés).
  • %setup -c %{name}-%{version} : création du sous-répertoire %{name}-%{version}, puis décompression dans ce sous-répertoire de Source0 qui n'inclut pas ce sous-répertoire standard.
  • %setup -c %{name}-%{version} -a 1 -a 2 : création du sous-répertoire, puis décompression dans ce sous-répertoire de Source0, Source1 et Source2, aucune n'incluant ce sous-répertoire.
  • %setup : décompression de Source0 qui est un répertoire %{name}-%{version}.
    %setup -D -T -a 1 : décompression de Source1, sans effacer ce qui est déjà décompressé et sans décompresser à nouveau Source0

%patch

Elle applique un patch
%patch# : applique le patch numéro #
Le principal argument est : -p#. Il indique dans quel sous-répertoire de BUILD se trouve le fichier à patcher.
Par défaut, p=0 et cela correspond au répertoire de travail, c'est-à-dire le premier sous-répertoire de BUILD.
Si le patch est compressé, %patch va le décompresser automatiquement.

%apply_patches

Cette macro remplace toutes les lignes %patch# -p1. Cela peut réduire le nombre de lignes du fichier spec.

Haut

 Section %Build

Cette section contient le script qui compile réellement le logiciel. Il se compose de commandes lancées sur l'arborescence des sources décompressés : BUILD.

Quelques paquetages n'ont pas de sources devant être compilées. Ce sont alors des nonarch. La section reste alors vide et il n'y a que la ligne %Build ou %build

Cependant, avec la plupart des paquetages, il y a une phase de compilation.
Le type de compilation dépend de la façon dont a été écrit le programme source : il faut chercher la présence de fichiers README et INSTALL dans l'archive. Ils renseignent généralement sur la façon de procéder.

Haut

Sources créées avec autoconf et automake

Autoconf

De plus en plus d'applications utilisent les outils autoconf et automake pour créer les scripts configure et make qui sont utilisés lors de la compilation.
Dans ce cas, la compilation est assez simple :
%configure2_5x
%make

%configure2_5x

Cette macro réalise la première phase de la compilation.
%configure2_5x détecte automatiquement les spécificités de votre machine et génère un fichier configure avec plusieurs options adéquates. Elle lance ce ./configure avec ses options.
Ce programme ./configure génère alors un fichier Makefile, exécuté ensuite avec une commande make.
Faites rpm --eval %configure2_5x pour connaître le détail.

Remarque : c'est la macro %configure qui est utilisée pour les anciennes versions de autoconf.

%make

C'est une simple macro qui, de base, exécute un make avec les paramètres multiprocesseurs appropriés.

Sources créées avec qmake

Certains projets QT (ou même autres) n'utilise pas les autotools, mais : qmake.

L'outil qmake permet de simplifier le processus de construction pour des projets utilisés sur différentes plates-formes. Il automatise la génération de Makefile, de sorte que seulement quelques lignes d'informations sont nécessaires pour créer chaque Makefile. Le développeur du projet aura créé un fichier .pro décrivant le projet avec qmake.

Dans ce cas, il faut rajouter, dans les BuildRequires :
BuildRequires: qmake

Et plus loin, dans la section %Build on aura :
qmake
make

Sources créées avec cmake

D'autres projets utilisent cmake.

Tout comme qmake l'outil cmake permet de simplifier le processus de construction pour des projets utilisés sur différentes plates-formes. Il automatise la génération de Makefile, de sorte que seulement quelques lignes d'informations sont nécessaires pour créer chaque Makefile. Le développeur du projet aura créé un fichier CMakeLists.txt décrivant le projet avec cmake.

Dans ce cas, il faut rajouter, dans les BuildRequires :
BuildRequires: cmake

Et plus loin, dans la section %prep on aura :
%cmake
Et dans dans la section %build
make -C build avec la construction standard mageia

Haut

 Section %Install

Cette section contient les commandes qui simulent une installation dans le dossier : BUILDROOT.
Vous trouvez ici des commandes classiques telles que mkdir, rm, mais surtout une commande install qui combine la copie et la définition des permissions du fichier copié.

Il existe également une macro : %makeinstall_std
Cette ligne installe le logiciel dans le dossier d'installation simulée pour des sources préparées par autoconf ou autre. Vous pouvez être amenés à préciser le répertoire de construction avec -C build

Haut

 Section %File

Cette section place les différents fichiers du répertoire BUILDROOT dans le paquetage binaire.
Vous y trouverez des lignes telles que :
%{_sysconfdir}/xdg/menus/lxqt-config.menu avec les fichiers de configuration placés dans /etc et ses sous-répertoires
%{_bindir}/lxqt-config avec les fichiers exécutables placés dans le répertoire /usr/bin
%{_libdir}/lib*.so avec les bibliothèques
%{_datadir}/lxqt/translations/%{name}-appearance
%doc README COPYING COPYRIGHT

Section Macros d'installation/suppression

Lorsque le paquetage binaire (le i586 ou x86_64) doit être installé ou supprimé, il est parfois nécessaire d'exécuter certaines commandes.

Il existe quatre macros qui regroupent ces commandes :

%pre

Vous placez ici les commandes qui doivent être exécutées avant l'installation du paquetage

%post

Vous placez ici les commandes qui doivent être exécutées après l'installation du paquetage

%preun

Vous placez ici les commandes qui doivent être exécutées avant la suppression du paquetage

%postun

Vous placez ici les commandes qui doivent être exécutées après la suppression du paquetage

Haut

 Section %Changelog

Elle retrace les changements successifs, avec la date, le paquageur, la version. Exemple :
* Fri Mar 27 2015 <Paiiou> 1.5.0.42-11.pai5 (Mon, Tue, Wed, Thu, Fri, Sat, Son)
- Separe plymouth from rest
- New specfile

Haut

 Créer simultanément plusieurs paquetages

Il n'est pas rare qu'un paquetage source permet la création simultanée de plusieurs paquetages binaires. C'est le fichier .spec qui définit l'ensemble des paquetages ainsi que leur contenu respectif.

Cela est possible en utilisant la directive %package

Ces paquets supplémentaires sont appelés sous-paquetages. Le nom des sous-paquetages dépend du reste de la ligne contenant la directive %package.

Cette directive %package joue un autre rôle dans la construction des paquetages :
Elle permet de définir des balises qui sont spécifiques à un sous-paquetage donné. Toute étiquette placée après une directive %package ne s'appliquera qu'à ce sous-paquetage.

Sous-paquetage classique

En utilisant la directive %package suffixe, le nom du paquetage résultant est formé du nom du paquetage principal suivi de -suffixe. Exemple :
Name: mageia-theme
%package Default
donnera un paquetage mageia-theme-Default

Paquetage avec un nom différent

En utilisant la directive %package -n nom, le nom du paquetage résultant est uniquement le nom donné. Exemple :
Name: mageia-theme
%package -n Themes
donnera un paquetage Themes

Important

Les sections %files et %script spécifiques à ces sous-paquetages devront utiliser la même syntaxe, par exemple : %file Default, %pre Default ou %files -n Themes ...

Haut
Pour les curieux, survolez : un exemple de fichier .spec
Summary: Tools for converting websites from using GIFs to using PNGs
Name: gif2png
Version: 2.5.4
Release: %mkrel 2
License: MIT style
Group: Graphics
URL: http://www.catb.org/~esr/gif2png/
Source0: http://www.catb.org/~esr/gif2png/%{name}-%{version}.tar.gz
Patch0: gif2png-2.5.4-libpng15.patch
BuildRequires: libpng-devel
Requires: python

%prep
%setup -q
%patch0 -p0

%configure2_5x
%make

%install
rm -rf %{buildroot}
%makeinstall_std

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,0755)
%doc README NEWS COPYING
%{_mandir}/*/*
%{_bindir}/*

%changelog
* Mon Sep 19 2011 fwang 2.5.4-2.mga2
+ Revision: 145315
- fix build with libpng 1.5

* Sun Jan 09 2011 kharec 2.5.2-3.mga1
+ Revision: 4110
- imported package gif2png