Construire un package RPM pour Rosa Linux en pratique

Si vous utilisez le systĂšme d'exploitation Linux depuis longtemps et connaissez mĂȘme un peu la programmation, vous devrez peut-ĂȘtre tĂŽt ou tard compiler le programme Ă  partir du code source. Peut-ĂȘtre que le programme souhaitĂ© ne sera pas dans les rĂ©fĂ©rentiels de distribution. Ou le programme a une ancienne version dans ces rĂ©fĂ©rentiels, et vous avez besoin de la derniĂšre. Ou peut-ĂȘtre que vous avez créé un nouveau programme et que vous souhaitez le partager avec d'autres utilisateurs.


Bien sûr, vous pouvez installer le programme selon les instructions fournies avec le code source. Mais vous devrez ensuite gérer manuellement les fichiers du programme et surveiller ses dépendances. Il est préférable de créer un package avec le programme et d'utiliser le gestionnaire d'applications intégré au systÚme d'exploitation.


J'espĂšre que cet article vous aidera Ă  comprendre rapidement comment crĂ©er un package RPM pour Rosa Linux ou une autre distribution qui utilise le gestionnaire de packages RPM (Mandriva, RedHat). Ou du moins, dites-moi oĂč chercher des informations.


Ici, je vais montrer comment créer des packages RPM sur mon ordinateur local, en utilisant un exemple simple. Nous allons construire le programme xkb-switch dans le systÚme d' exploitation Rosa Linux . Nous prendrons le code source du programme de GitHub .








Un peu sur Rosa Linux


Rosa Linux est une distribution créée et supportée par des développeurs russes . Il est basé sur Mandriva , mais avec quelques fonctionnalités. J'utilise la version 32 bits de Rosa Fresh R8 , sortie en 2014. Maintenant, la version R8 n'est plus prise en charge par les développeurs (les référentiels ne sont pas mis à jour), mais cela fonctionne bien sur mon ordinateur portable, donc je ne veux pas installer une nouvelle version.


Rosa Fresh R8 Utilise le bureau KDE4 . Toutes les versions du package de distribution utilisent les gestionnaires rpm et urpm pour gérer les packages avec les applications, et les commandes correspondantes sont rpm , urpmi , urpme , urpmq , urpmf .


Les principes de construction de progiciels sont gĂ©nĂ©ralement rarement modifiĂ©s au sein de la mĂȘme famille de distribution Linux. Par consĂ©quent, ce qui est dĂ©crit dans cet article devrait fonctionner dans toutes les versions des distributions Rosa .


La construction de packages sur Rosa Linux est un peu plus simple que sur certaines autres distributions basĂ©es sur RPM . Certains points sont automatisĂ©s et n'ont pas besoin d'ĂȘtre configurĂ©s.




Un peu sur xkb-switch


J'ai aimé l'idée d'utiliser le plugin pour l'éditeur de texte Vim - xkbswitch , sur lequel il y a un article sur Habré . Il bascule automatiquement la disposition du clavier en anglais lorsque vous quittez le mode de saisie, et vice versa - à celui sur lequel le texte a été entré la derniÚre fois - si vous entrez à nouveau dans le mode de saisie. Pour que ce plugin fonctionne, vous avez besoin du programme xkb-switch , qui vous permet de changer la disposition du clavier à partir de la ligne de commande et des plugins pour l'éditeur Vim . Ce programme n'était pas dans les référentiels Rosa Linux R8 (et probablement personne ne l'ajoutera, car la distribution est déjà ancienne et le programme xkb-switch n'est pas trÚs populaire).




Mise en place, finalisation, vérification du programme


Il est souvent nĂ©cessaire de configurer la compilation du programme pour qu'elle fonctionne correctement dans une distribution particuliĂšre ou mĂȘme pour un systĂšme spĂ©cifique. Il arrive qu'un programme doive ĂȘtre construit avec d'autres options ou avec le support d'un pilote spĂ©cial. Ou peut-ĂȘtre voulez-vous corriger des erreurs dans le code du programme ou simplement vĂ©rifier si cela fonctionne. Pour ce faire, il est prĂ©fĂ©rable de copier le code source sur votre ordinateur avant de crĂ©er le package RPM, essayez de le compiler et vĂ©rifiez le fonctionnement du programme compilĂ©.


Si vous ĂȘtes sĂ»r que vous n'aurez pas besoin de modifier les fichiers du projet, vous pouvez utiliser le code source d'origine sur le site Web du projet et procĂ©der immĂ©diatement Ă  la crĂ©ation du package. Mais si vous devez modifier les paramĂštres de compilation, il est gĂ©nĂ©ralement beaucoup plus facile de modifier le fichier dans le dossier source (le soi-disant makefile ) que de traiter ensuite les options pour les commandes de compilation et le pĂ©riphĂ©rique macro interne pour le fichier de spĂ©cifications.




Vérifier le code source sans votre profil sur GitHub


Si vous décidez de travailler avec le code source ou les paramÚtres de compilation du projet, mais que vous n'avez pas votre propre profil sur GitHub ou que vous ne souhaitez pas l'utiliser, vous pouvez simplement télécharger et décompresser le code source. Dans notre cas, cela pourrait ressembler à ceci (j'utilise le dossier ~/Projects/cpp pour le code source C ++ ):



 cd ~/Projects/cpp git clone https://github.com/ierton/xkb-switch.git 


Cela créera le dossier ~/Projects/cpp/xkb-switch contenant le code source. Bien sûr, au lieu d'utiliser git vous pouvez télécharger l'archive avec le programme et décompressez-la.


À partir du fichier README.md dans le dossier du projet, il est facile de deviner que l'utilitaire cmake est utilisĂ© pour crĂ©er le programme. Par consĂ©quent, si vous devez modifier les paramĂštres de compilation, dans notre cas, ils se trouvent dans le fichier CMakeLists.txt . Et nous essayons simplement de compiler le programme et de vĂ©rifier s'il fonctionne. Les commandes que vous devez utiliser pour cela sont Ă©crites dans le mĂȘme fichier README.md Ă  la racine du projet.



 cd xkb-switch mkdir build && cd build cmake .. make ./xkb-switch #         ./xkb-switch -l #       ./xkb-switch -s ru #       (  ) 


AprÚs cela, pour utiliser le projet modifié, vous devrez effacer ou supprimer le dossier de construction du projet et emballer le code source dans l'archive. Cela pourrait ressembler à ceci:



 cd ~/Projects/cpp/xkb-switch rm -rf ./build cd ~/Projects/cpp zip -r xkb-switch.zip xkb-switch 


Le fichier xkb-switch.zip ensuite ĂȘtre utilisĂ© pour construire le package.




Vérification avec enregistrement du projet dans votre profil GitHub


Je suppose que quiconque lit cette section est au moins un peu familier avec Git et a déjà configuré un profil sur GitHub . Je pense que cette méthode est la meilleure, donc le reste de l'article impliquera qu'elle est utilisée, sauf indication contraire.


Vous devez d'abord bifurquer le projet d'origine dans votre GitHub . AprÚs cela, comme dans la méthode précédente, nous clonons le projet sur notre ordinateur, mais à partir de notre référentiel (dans mon cas, le nom d'utilisateur est alexandersolovyov ):



 cd ~/Projects/cpp git clone https://github.com/alexandersolovyov/xkb-switch.git 


Pour ajouter des modifications, il est préférable d'utiliser une nouvelle branche. Ensuite, si vous le souhaitez, il sera possible d'utiliser différentes versions du programme. Et il sera également possible de proposer des modifications à l'auteur du projet à l'aide de pull-requests. Par exemple, si vous décidez de corriger un peu le fichier CMakeLists.txt , avant cela, vous devez créer une nouvelle branche avec:



 git branch cmake_corrections 


Une fois les modifications effectuées, vérifiées et ajoutées à la branche (en utilisant git commit -am " " ), vous pouvez ajouter une nouvelle branche à votre GitHub:



 git push origin cmake_corrections 


AprÚs cela, vous pouvez faire une pull-request, si nécessaire.


Vous pouvez créer un lien vers le référentiel d'origine:



 git remote add ierton https://github.com/ierton/xkb-switch.git 


Et puis mettez à jour la branche principale de votre référentiel afin qu'elle corresponde à l'original:



 git pull ierton master 


Le code de programme correspondant Ă  la branche corrigĂ©e peut ĂȘtre utilisĂ© lors de la construction du RPM. Pour ce faire, vous devrez spĂ©cifier l'adresse de l'archive sous la forme dans le fichier spec:



 Source0: https://github.com/-/-/archive/---.zip 


Mais, comme l'a demandé l'utilisateur de specblog , ce n'est en fait pas le cas. Il est préférable de transmettre vos modifications sous forme de correctifs. Pour ce faire, vous devez créer des fichiers de correctif à partir des modifications de votre branche et les copier dans le dossier source pour créer le package ( ~/rpmbuild/SOURCES/ ). Vous devrez ensuite les spécifier dans le fichier de spécifications. Nous y réfléchirons un peu plus tard, mais si vous le souhaitez, vous pouvez le lire ici . Si vous ne savez pas comment créer des patchs, vous pouvez regarder sous le spoiler.




Comment créer des correctifs à l'aide de git

Création de correctifs


Les correctifs , ce sont des correctifs - ce sont des fichiers dans lesquels les modifications sont enregistrées dans le code source du programme. Ils sont utilisés comme alternative aux commandes git pull et git push pour la communication entre les référentiels de code locaux s'il n'est pas pratique de «tirer» les modifications d'un référentiel distant, ou si l'historique des modifications du projet et les principes de travail avec lui sont tels qu'il est préférable d'utiliser des correctifs.



Imaginons que nous devons apporter des modifications au fichier CMakeLists.txt . Tout d'abord, vous devez tout faire comme décrit ci-dessus: la branche principale de notre référentiel GitHub doit correspondre à la branche principale du projet d'origine, et pour vos modifications, vous devez utiliser la branche cmake_corrections . Ensuite, vous devez aller dans cette branche, apporter les modifications nécessaires et les enregistrer dans git à l' aide de commits.


Vous devez maintenant enregistrer les modifications sous forme de fichiers correctifs dans le dossier ~/rpmbuild/SOURCES (si vous n'utilisez pas Rosa Linux, le chemin d'accĂšs au dossier SOURCES peut ĂȘtre diffĂ©rent). Par exemple, ceci (je veux dire que nous sommes dans le dossier du projet - par exemple, ~/Projects/cpp/xkb-switch - et sur la branche cmake_corrections ):


 git format-patch -o ~/rpmbuild/SOURCES origin/master 

La commande git format-patch crée un fichier de git format-patch pour chaque commit. Sous cette forme, il effectuera des correctifs à partir de la validation spécifiée par le dernier argument et se terminant par la derniÚre validation de la branche actuelle. Vous pouvez spécifier un commit de n'importe quelle maniÚre: au début du hachage, en utilisant le pointeur HEAD ou le nom de la branche, qui indique maintenant le commit souhaité. L'essentiel est que l'un des commits visibles lorsque git log exécuté est pris comme début. Autrement dit, vous ne pouvez pas commencer à créer des correctifs à partir d'une validation qui se trouve dans une autre branche.


Et vous pouvez vous rappeler (ou voir) combien de validations nous avons ramifiées à partir de la branche principale, et faire des correctifs pour un certain nombre de validations. Par exemple, si nous avons fait deux commits, la commande serait:


 git format-patch -o ~/rpmbuild/SOURCES -2 

Ici, le nombre de validations est défini à l'aide de -2 . Vous pouvez en spécifier n'importe quel nombre au lieu de cette figure.


Vous pouvez spĂ©cifier la plage de validations Ă  partir de laquelle les correctifs doivent ĂȘtre effectuĂ©s en plaçant deux points entre les liens vers les validations initiales et finales:


 git format-patch -o ~/rpmbuild/SOURCES master..cmake_corrections 

Le nom de chaque fichier de correctif se compose d'un numéro de série et de la premiÚre ligne d'un commentaire de validation. Par conséquent, il est préférable de renommer chaque fichier afin que la description du correctif décrive plus briÚvement et clairement son essence. Par exemple, comme ceci:


 mv 0001-Return-memory-allocated-by-XkbRf-getNamesProp()-for-tmp.patch 001-Fix-memory-leak.patch 

la convention de dĂ©nomination des correctifs dans l'article sur la syntaxe du fichier spec recommande d'ajouter package_name-version-rosa- avant la description de chaque fichier patch. C'est peut-ĂȘtre une bonne pratique si vous envoyez des correctifs par e-mail, mais pas pour la construction de packages. Nous crĂ©ons des packages sur notre ordinateur, il est donc prĂ©fĂ©rable de vider le dossier ~/rpmbuild/SOURCES chaque fois avant de ~/rpmbuild/SOURCES package avec un autre programme ou un nouveau package de version.


Maintenant, si vous devez mettre Ă  jour la branche du rĂ©fĂ©rentiel principal ( maĂźtre ) pour qu'elle corresponde Ă  l'original, alors la branche de changement ( cmake_corrections ) devra ĂȘtre mise Ă  jour Ă  l'aide de la git rebase . Vous pouvez voir comment procĂ©der ici . AprĂšs cela, les correctifs devront ĂȘtre recréés.





Préparer le "lieu de travail" pour créer un package


Vous devez d'abord créer une structure de répertoires. Tout l'assemblage a lieu dans le dossier rpmbuild dossier de départ de l' rpmbuild . Créez la structure de répertoires initiale et accédez au dossier des fichiers de spécifications:



 mkdir -p ~/rpmbuild/SPECS && cd ~/rpmbuild/SPECS 


Pour Rosa Linux, cela suffit: les dossiers restants seront créés automatiquement.


Une autre distribution peut utiliser un emplacement de fichier diffĂ©rent pour crĂ©er le package. Et vous devrez peut-ĂȘtre crĂ©er manuellement la hiĂ©rarchie complĂšte des dossiers. Recherchez des informations pour votre distribution si vous n'utilisez pas Rosa Linux. Par exemple, cela pourrait ressembler Ă  ceci dans Red Hat .


Si le package a été rpmbuild avec des erreurs, tous les fichiers créés par la commande rpmbuild ne rpmbuild pas supprimés - comme pour une génération réussie. Nous essaierons de récupérer le paquet plusieurs fois, et les fichiers restants aprÚs la derniÚre fois vont interférer. Par conséquent, il est préférable de créer un script simple qui vous aidera à les supprimer rapidement. Créez un fichier cleanup.sh et placez-le dans le ~/rpmbuild/SPECS . Voici son contenu:



 !#/bin/sh rm -rf ~/rpmbuild/BUILD/* rm -rf ~/rpmbuild/BUILDROOT/* rm -rf ~/rpmbuild/RPMS/* rm -rf ~/rpmbuild/SRPMS/* 


Bien sûr, il est préférable de lui ajouter des droits d'exécution à l'aide de la commande chmod u+x cleanup.sh .


Si vous souhaitez collecter un package à partir de fichiers qui se trouvent sur l'ordinateur local - si vous n'utilisez pas GitHub et avez apporté des modifications aux fichiers de projet, ou si vous souhaitez créer un package à partir de votre propre programme qui est stocké uniquement sur votre ordinateur - vous devez compresser le projet dans une archive ( par exemple .zip , .tar ou .tar.gz ) et placez-le dans le dossier SOURCES . Par exemple, comme ceci:



 cd ~/Projects/cpp/ zip -r xkb-switch.zip xkb-switch mkdir -p ~/rpmbuild/SOURCES cp xkb-switch.zip ~/rpmbuild/SOURCES/ 


Si, aprĂšs avoir construit le programme, vous souhaitez en crĂ©er une autre ou la mĂȘme, mais une version diffĂ©rente, vous devrez supprimer tous les fichiers du dossier ~/rpmbuild/SOURCES , puis copiez-y vos archives (si vous ne les tĂ©lĂ©chargez pas depuis GitHub ) et fichiers de correctifs (si utilisĂ©s). Sinon, le fichier d'archive ne sera probablement pas tĂ©lĂ©chargĂ© depuis GitHub (pourquoi - voir plus tard), et il sera Ă©galement difficile de dĂ©terminer quel fichier de correctif appartient Ă  quel programme.




Commençons par créer un fichier de spécifications


La base pour construire un package RPM est le soi-disant fichier speck . Ce fichier contient les instructions du programme rpmbuild (ou plutÎt rpm ) nécessaires à la construction du package.


Créez le fichier xkb-switch.spec dans le dossier ~/rpmbuild/SPECS/ . La façon la plus simple de commencer est d'utiliser un modÚle disponible sur le site Web des fichiers de spécifications de modÚle .


À partir du README sur la page du projet xkb-switch , il est connu que le programme est compilĂ© Ă  l'aide de l'utilitaire cmake . Par consĂ©quent, nous allons sĂ©lectionner le fichier de spĂ©cifications pour un programme créé Ă  l'aide de CMake et copier le modĂšle entier dans notre fichier de spĂ©cifications. Bien sĂ»r, afin d'assembler correctement notre package RPM, ce modĂšle doit ĂȘtre beaucoup changĂ©, ce que nous ferons.




Un peu sur la syntaxe du fichier spec


  • La syntaxe du fichier de spĂ©cifications vous permet d'ajouter des commentaires de style bash.
  • Vous pouvez utiliser des espaces comme espaces entre les valeurs sur la mĂȘme ligne pour crĂ©er l'apparence de colonnes paires, mais la documentation recommande fortement d'utiliser le caractĂšre de tabulation (un ou deux tant que les colonnes sont paires). Remarque: dans tous les exemples de code de cet article, seuls les espaces sont utilisĂ©s, il est donc prĂ©fĂ©rable de ne pas copier tout le texte d'ici dans votre fichier de spĂ©cifications, mais de l'imprimer vous-mĂȘme.
  • Les champs d'option se composent d'un nom d'option spĂ©cial avec deux points et la valeur suivante via des tabulations (ou des espaces). La casse des caractĂšres dans les noms de champ n'a pas d'importance. Par exemple:
      Name: xkb-switch 

  • Si le mot est prĂ©cĂ©dĂ© du symbole % (par exemple, %description ), il s'agit d'un mot-clĂ© spĂ©cial. Il peut s'agir d'une commande, d'une macro ou d'un appel de script. Ensuite, les paramĂštres qu'il utilise peuvent ĂȘtre indiquĂ©s. Et il y a des mots clĂ©s qui indiquent le dĂ©but d'un bloc de commandes ou d'options. Ensuite, les paramĂštres peuvent ĂȘtre indiquĂ©s Ă  cĂŽtĂ©, et sur les lignes suivantes, il devrait y avoir des commandes ou une liste d'options que j'ai dĂ©crites dans le paragraphe prĂ©cĂ©dent. AprĂšs un tel bloc, une ligne vide doit ĂȘtre laissĂ©e.
  • Pour utiliser la valeur d'une constante, vous devez insĂ©rer une construction de la forme %{_} . Sa valeur peut ĂȘtre prĂ©dĂ©finie ou elle peut ĂȘtre dĂ©terminĂ©e par une option (par exemple, Name: xkb-switch ) ou en utilisant le mot clĂ© %define . Toutes ces constantes sont Ă©galement considĂ©rĂ©es comme des macros. Leur utilisation sera discutĂ©e plus en dĂ©tail ci-dessous.



En-tĂȘte de fichier de spĂ©cifications


Dans le fichier de spĂ©cifications, l'en-tĂȘte est toujours Ă©crit en premier. Il s'agit d'une liste d'options qui s'appliquent au package RPM principal. Lorsque le package est prĂȘt, presque toutes ces informations seront affichĂ©es lors de la visualisation de sa description. Voici ce que les lignes individuelles indiquent:



Résumé:
Une brÚve description du package. J'ai espionné la description dans le fichier README.md dans le projet xkb-switch : Query and change XKB layout state .

Nom:
Le nom du package. Dans notre cas, c'est xkb-switch .

Version:
Version du programme. Pour le savoir, il est préférable de regarder le fichier CMakeLists.txt dans le dossier racine du projet. Bien sûr, vous devez extraire le fichier de la copie du projet qui sera utilisé pour l'assemblage. Si vous utilisez le projet d'origine, vous pouvez ouvrir le fichier directement sur sa page GitHub . Comme vous pouvez le voir, la version est composée de MAJOR_VERSION , MINOR_VERSION et RELEASE_VERSION . J'ai utilisé la version 1.6.0 du programme.

Communiqué:
Le numĂ©ro de version du package lui-mĂȘme. Affiche l'heure Ă  laquelle un package avec un programme de la mĂȘme version est assemblĂ©. Dans notre cas, c'est «1», car personne n'a jamais assemblĂ© de programme de cette version. Dans le cas idĂ©al, si nous avons dĂ©jĂ  essayĂ© de compiler le package et que l'assemblage a atteint la fin (mĂȘme s'il y avait des erreurs), aprĂšs chaque nouvelle tentative, vous devez augmenter ce nombre de 1 et en mĂȘme temps ne pas supprimer les anciens packages assemblĂ©s des rpmbuild/RPMS et rpmbuild/SRPMS : Ensuite, de nouveaux packages avec un nouveau numĂ©ro de build seront créés. Peut-ĂȘtre que cela devrait ĂȘtre fait si vous utilisez un serveur spĂ©cial pour l'assemblage. Nous utilisons notre ordinateur et Ă  la place nous nettoierons les dossiers. Si un package avec un programme de cette version est dĂ©jĂ  dans les rĂ©fĂ©rentiels de la distribution Linux, mais que vous compilez avec d'autres paramĂštres, il est prĂ©fĂ©rable de spĂ©cifier le numĂ©ro de version 1 de plus que ce package.

Licence:
Nom abrégé de la licence sous laquelle le programme est distribué. Selon les rÚgles de Rosa Linux, vous ne pouvez créer des packages qu'avec une licence qui permet une distribution gratuite. README.md pouvez découvrir dans le fichier README.md que la licence est GNU GPLv3 . Nous écrivons donc: GPLv3+ .

Groupe:
Groupe ou catĂ©gorie auquel appartient le programme. À l'aide de ces groupes, les programmes sont triĂ©s dans le menu de lancement de l'application et dans le gestionnaire de programmes de la fenĂȘtre («Ajouter ou supprimer des programmes»). La liste des groupes pour Rosa Linux peut ĂȘtre trouvĂ©e ici . Je pense que Development\X11 est le meilleur pour nous, car le programme est liĂ© Ă  X11 et est principalement nĂ©cessaire pour crĂ©er des scripts et des plugins pour Vim.

URL:
Adresse Internet oĂč vous pouvez tĂ©lĂ©charger le code source d'origine du programme. Il sera spĂ©cifiĂ© lors de l'affichage des informations sur le package RPM. Cet article est facultatif, mais nous indiquerons: https://github.com/ierton/xkb-switch

Source0:
Le nom du fichier d'archive contenant le code source ou l'adresse Internet oĂč il peut ĂȘtre tĂ©lĂ©chargĂ©. Si vous spĂ©cifiez une adresse sur Internet, lors du premier build, le fichier sera tĂ©lĂ©chargĂ© dans ~/rpmbuild/SOURCES/ . Si un tel fichier existe dĂ©jĂ , il ne sera plus tĂ©lĂ©chargĂ©, c'est-Ă -dire que le programme rpmbuild n'utilisera que le nom de fichier spĂ©cifiĂ© Ă  la fin de cette URL. Vous pouvez spĂ©cifier uniquement le nom du fichier, mais il devra ensuite ĂȘtre placĂ© manuellement dans le dossier ~/rpmbuild/SOURCES/ . Il est prĂ©fĂ©rable de fournir l'adresse de votre copie du projet sur GitHub. J'ai utilisĂ© le fichier https://github.com/alexandersolovyov/xkb-switch/archive/master.zip . Vous pouvez spĂ©cifier plusieurs sources diffĂ©rentes pour collecter les sources de plusieurs archives Ă  l'aide d'un fichier speck. Ensuite, au nom de l'option pour ajouter chaque archive suivante, le nombre doit augmenter ( Source1 , Source2 , etc.). Ces adresses de fichiers ne sont pas visibles lors de l'affichage des informations sur les packages RPM.

Patch0:
Cette option n'est pas dans le fichier modĂšle. Cela peut ĂȘtre utile si vous dĂ©cidez de transfĂ©rer vos modifications dans les fichiers de projet du programme sous forme de correctifs. Quant Ă  l'option Source0 , chaque fichier doit ĂȘtre indiquĂ© sur une ligne distincte et le nombre Ă  la fin du nom de l'option doit augmenter Ă  chaque fois. Les fichiers de correctifs doivent se trouver dans le dossier ~/rpmbuild/SOURCES (Ă  cĂŽtĂ© de l'archive source tĂ©lĂ©chargĂ©e). Le nom de chaque fichier doit ĂȘtre Ă©crit sans chemin d'accĂšs. Il n'est pas nĂ©cessaire de spĂ©cifier tous les fichiers de patch ici - seuls ceux que vous souhaitez appliquer peuvent ĂȘtre utilisĂ©s.

BuildRequires:
Paquets requis pour construire le programme. Le modĂšle cmake . Le fichier CMakeLists.txt indique que la version minimale de CMake pour l'assemblage ne doit pas ĂȘtre infĂ©rieure Ă  2.6 , il est donc prĂ©fĂ©rable de spĂ©cifier cmake >= 2.6 . Vous pouvez ajouter d'autres packages, chacun d'eux sur une ligne distincte, en utilisant l'option BuildRequires: sĂ©parĂ©e. La liste des packages nĂ©cessaires Ă  l'assemblage peut ĂȘtre trouvĂ©e en lisant le README du projet et en examinant attentivement le fichier CMakeLists.txt (en particulier les fonctions FIND_PACKAGE , TARGET_LINK_LIBRARY , FIND_PROGRAM ). Ensuite, vous devez trouver le nom de package correct dans les rĂ©fĂ©rentiels Ă  l'aide de la commande urpmq -a __ . Dans notre cas, le fichier de paramĂštres de compilation ( CMakeLists.txt ) contient dĂ©jĂ  des lignes qui vĂ©rifient la prĂ©sence des packages nĂ©cessaires dans le systĂšme. Mais il vaut mieux spĂ©cifier la liste entiĂšre ici aussi:
 # CMake  2.6   BuildRequires: cmake >= 2.6 #  C/C++ BuildRequires: gcc #    libxkbfile BuildRequires: libxkbfile-devel #   X11   libxkbfile, #  libx11-devel   . #    man: BuildRequires: xz 


Nécessite:, Fournit:
Ces options ne sont pas dans l'Ă©chantillon, mais parfois elles peuvent ĂȘtre utiles. Ils Ă©tablissent des dĂ©pendances entre les packages.L'option ProvidesspĂ©cifie les fonctionnalitĂ©s fournies par le package en cours de construction. Cela peut ĂȘtre le nom de l' en- tĂȘte fichier de langue C , ou le nom de la bibliothĂšque de liens dynamiques, ou une fonction spĂ©ciale. Et l'option Requiresindique de quelles capacitĂ©s d' autres packages dĂ©pendent le package. Package Manager ( rpm, urpmou d' autres qui utilisent votre distribution), lors de la recherche des dĂ©pendances Ă  la recherche de ces opportunitĂ©s plutĂŽt que des noms de paquet. Par consĂ©quent, Providesil est prĂ©fĂ©rable d'indiquer la version de l' opportunitĂ© fournie et pour Requiresquelles versions des opportunitĂ©s fournies conviennent. La version est indiquĂ©e par des signes >=,=, ou <=, entourĂ© d'espaces. Habituellement, toutes les options sont indiquĂ©es en premier Requires, puis - Provides, un nom de fonction par ligne - le mĂȘme que pour BuildRequires:. En rĂšgle gĂ©nĂ©rale, lors de la crĂ©ation de packages sur Rosa Linux, les dĂ©pendances sont automatiquement reconnues et ces options doivent rarement ĂȘtre spĂ©cifiĂ©es.

AutoReq:, AutoProv:
si vous créez un programme écrit dans une langue que le gestionnaire rpm est nouveau ou propriétaire et si les dépendances ne sont pas correctement détectées automatiquement, vous pouvez désactiver la détection automatique des capacités (avec AutoProv: no) et / ou des dépendances (avec aide AutoReq: no).

% description
Ce bloc ne fait plus partie de l'en-tĂȘte, mais lui est associĂ©. Il ajoutera une description complĂšte du programme au package RPM. Une ligne vide doit ĂȘtre laissĂ©e aprĂšs. La description peut ĂȘtre la suivante:
 %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. 




Les lignes du modÚle commençant par %fileset ne %find_langsont nécessaires que si vous créez une application prenant en charge plusieurs langues, supprimez-les.


De plus, aprĂšs le commentaire sur la ligne de division, suivi des commandes et des macros qui doivent ĂȘtre terminĂ©es avant de compresser les fichiers. Toutes ces commandes sont divisĂ©es en blocs dĂ©finis Ă  l'aide de mots clĂ©s spĂ©ciaux.




Préparation de la source


Le premier est un bloc %prepqui indique les commandes pour préparer la compilation. Il contient une macro-commande %setup. Elle exécute un script qui fait ce qui suit:



  • , SourceX: ( — Source0: ). , .
  • ~/rpmbuild/SOURCES/ .
  • ~/rpmbuild/BUILD/ .
  • .


-q , .


, %prep :



 rpmbuild -bp ~/rpmbuild/SPECS/xkb-switch.spec 


rpmbuild . , rpm : rpmbuild , . ( root sudo ). rpmbuild , man rpmbuild . , , , — , rpmbuild .


: xkb-switch-1.6.0: No such file or directory . , ~/rpmbuild/BUILD/xkb-switch-1.6.0 , .



 ls ~/rpmbuild/BUILD/ 


, xkb-switch-master . %setup -n . %prep - :



 %prep %setup -q -n xkb-switch-master 


~/rpmbuild/SPECS/cleanup.sh , BUILD , , %prep . , exit 0 . , .


, . %prep . , , :


 %apply_patches 

rpmbuild -bp xkb-switch.spec . — .


Maximum RPM .


.





%build . README , cmake .. make , - . : , . , %build :



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -bc ~/rpmbuild/SPECS/xkb-switch.spec 


exit 0 : .


, . shell ( bash zsh, ). rpmbuild , . shell - — . ( .)


- , , , %build shell .


, , . cmake , , , %cmake - , , . ( — CMakeLists.txt ). , .




L'installation


, . %install , , , ~/rpmbuild/BUILDROOT/__-buildroot/ .


__ , Name: -, ( Version: -), ( Release: -), , .


README , make install , build . - - %makeinstall_std -C build , . ( , ):



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -bi ~/rpmbuild/SPECS/xkb-switch.spec 


, RPM. - , .





, - . , ~/rpmbild/BUILDROOT/ . ( , , tree , - Linux.) , , .debug . , , : .


, , %files -. , , . .


%files -. , . Rosa Linux %prep ( - ). , , , , — . - (, , ).


%files , RPM. , :



 %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz 


-. , , /usr/lib/rpm/macros . , %{_bindir} , %{_libdir} — , %{_mandir} — man. %{name} %{version} Name: Version: -.


:



 ~/rpmbuild/SPECS/cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec 



 2 1 . rpmlint , . , , Rpmlint Errors , :


`xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1`
Erreur: La version dans le nom du package de bibliothÚque n'est pas spécifiée correctement.

`xkb-switch.i586: E: exécutable-dans-bibliothÚque-package (Badness: 1) / usr / bin / xkb-switch`
Erreur: le package de bibliothÚque contient un fichier exécutable.

`xkb-switch.i586: W: fichier-devel-in-non-devel-package / usr / lib / libxkbswitch.so`
Avertissement qu'un fichier de package de développement ( -devel) a été trouvé dans un package qui n'était pas destiné au développement.



Tout est-il clair? Je ne pense pas. Examinons de plus prĂšs ce qui se passe ici.




Qu'est-ce que rpmlint


Rosa Linux rpmbuild rpmlint , . rpmlint , , . , Rosa Linux ( , rpmlint ) .


, , . ~/rpmbuild/RPMS/_/ rpmlint -i __ .


, RPM - , , , , Rosa Linux, rpmlint -i __ .




RPM Rosa Linux


Rosa Linux 6 . , .


Paquet exécutable
Il est binaire. Il ne contient qu'un fichier ou script binaire destiné directement à l'exécution. Les fichiers de ces packages sont le plus souvent installés dans un dossier /bin/ou dans /usr/bin. Peut également contenir des liens - pour la possibilité d'appeler le programme en utilisant plusieurs noms différents. Le nom du package correspond au nom du programme. Ces packages dépendent souvent de la bibliothÚque.

BibliothĂšque
Contient des fichiers compilĂ©s de bibliothĂšques connectĂ©es dynamiquement ("partagĂ©es", "partagĂ©es") utilisĂ©es par les programmes. Il s'agit gĂ©nĂ©ralement du fichier de bibliothĂšque lui-mĂȘme, dont le nom se termine par la version, et d'un lien vers ce fichier, dont le nom se termine par le premier numĂ©ro de version. Par exemple, pour une bibliothĂšque libxkbfileversion 1.0.2, ce sera un fichier libxkbfile.so.1.0.2et un lien vers celui-ci,libxkbfile.so.1. Le nom mĂȘme du package de bibliothĂšque, par lequel il est reconnu dans le rĂ©fĂ©rentiel du programme d'installation, se termine par le premier numĂ©ro de version et commence par le prĂ©fixe lib. La bibliothĂšque a le libxkbfilenom correct - libxkbfile1. Cela est dĂ» au fait que le premier numĂ©ro de version ne change gĂ©nĂ©ralement qu'avec des modifications de bibliothĂšque incompatibles, et il sera donc possible d'installer plusieurs packages avec une bibliothĂšque de versions diffĂ©rentes si certains programmes utilisent l'ancienne version de la bibliothĂšque et d'autres utilisent une version plus rĂ©cente.

Package pour développeurs
Fichiers nĂ©cessaires Ă  la compilation de programmes utilisant la bibliothĂšque, mais inutiles pour le travail de programmes prĂȘts Ă  l'emploi. Pour les programmes C / C ++ simples , il s'agit d'un lien vers le fichier de bibliothĂšque, mais sans versions dans le nom (par exemple,libxkbfile.so), ainsi que les fichiers d'en-tĂȘte (avec l'extension .h). Nom du package se termine par -devel, par exemple: libxkbfile-devel. Lors de l'installation, cela dĂ©pend toujours de la bibliothĂšque appropriĂ©e. Par exemple, le package libxkbfile-develdĂ©pend libxkbfile1.

Code source
Les rĂ©fĂ©rentiels Rosa Linux ont des packages RPM contenant le code source de certains programmes - principalement ceux qui ont vraiment besoin d'ĂȘtre reconstruits. Les noms de ces packages se terminent par -srcou -source(par exemple, apache-source). rpmbuildcrĂ©e toujours un tel package automatiquement et le place ~/rpmbuild/SRPMS/.

Symboles de débogage
Il s'agit d'informations qui peuvent ĂȘtre utilisĂ©es pour dĂ©boguer un programme terminĂ©. Il associe les emplacements des fichiers compilĂ©s au code source. Ces packages sont rpmbuildautomatiquement créés par l'Ă©quipe , une fin est attribuĂ©e Ă  leur nom -debuginfo. Je n'ai pas trouvĂ© de tels packages dans les rĂ©fĂ©rentiels Rosa Linux.

Documentation
Les référentiels Rosa Linux ont des packages de documentation pour divers programmes et bibliothÚques. Je (pour l'instant) ne connais pas les caractéristiques de la construction de tels packages. Leurs noms se terminent généralement par doc: par exemple libx11-doc, java-1.7.0-openjdk-javadoc. Soit dit en passant, presque tous sont créés dans le style de sites Web, et pour les afficher, il est préférable d'ouvrir un navigateur, d'aller à l'adresse file:///usr/share/doc/et de sélectionner le dossier et le fichier souhaités.




Notre résultat


Maintenant, tout est devenu plus clair.



  • xkb-switch libxkbswitch.so , , , . , : xkb-switch.i586: W: devel-file-in-non-devel-package /usr/lib/libxkbswitch.so .
  • , /usr/lib/libxkbswitch.so.1 /usr/lib/libxkbswitch.so.1.6.0 . , . : xkb-switch.i586: E: executable-in-library-package (Badness: 1) /usr/bin/xkb-switch .
  • , (1). : xkb-switch.i586: E: incoherent-version-in-name (Badness: 50) 1 .


, rpmlint , . . xkb-switch , libxkbswitch.so.1.6.0 , Vim . xkb-switch , C C++ . RPM- .


-:



- xkb-switch
 Summary: Query and change XKB layout state Name: xkb-switch Version: 1.6.0 Release: 1 License: GPLv3+ Group: Development/X11 URL: https://github.com/ierton/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor via 'libxkbswitch.so'. It is mainly used by a plugin for Vim text editor, vim-xkbswitch. Originally ruby-based code written by J.Broomley. %files %{_bindir}/%{name} %{_libdir}/libxkbswitch.so %{_libdir}/libxkbswitch.so.1 %{_libdir}/libxkbswitch.so.%{version} %{_mandir}/man1/%{name}.1.xz #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build 





— , . , , xkb-switch 3 : , . :



  • /usr/bin/xkb-switch /usr/share/man/man1/xkb-switch.1.xz ,
  • — /usr/lib/libxkbswitch.so.1 /usr/lib/libxkbswitch.so.1.6.0 ,
  • — /usr/lib/libxkbswitch.so .


-. , ,
- Maximum RPM . - libxkbfile Rosa Linux .


.





— - libxkbfile . - :



 %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch 


%define . , ( ) — , . , %{major} 1 , .


%mklibname «lib», , — ( ). %{libname} «lib» + «xkbswitch» + ( %{major}) = libxkbswitch1 — .


-d %mklibname -devel . %{develname} libxkbswitch-devel — .





Version:



 Version: %{major}.6.0 


, -.


- . . :


 Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. 




- . - , - ( rpm ). %package . -. , -. Version , Summary , Group . Provides Requires , . Name : , %package .


. %description — , %package .


Rosa Linux - %description -. libxkbswitch1 :


 %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. 


-n %package %description , . - , xkb-switch-libxkbswitch1 . libxkbswitch1 . .


:


 %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. 




, . %files .


, , %package , %description %files . , %description - . , , — xkb-switch .


- Rosa Linux %files , %prep . :


 %files %{_bindir}/%{name} %{_mandir}/%{name}.1.xz %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %files -n %{develname} %{_libdir}/libxkbswitch.so 


, :



  • xkb-switch ~/usr/bin/xkb-switch ~/usr/share/man/man1/xkb-switch.1 ,
  • libxkbswitch1 ~/usr/lib/libxkbswitch.so.1 ~/usr/lib/libxkbswitch.so.1.6.0 ,
  • libxkbswitch-devel ~/usr/lib/libxkbswitch.so .


cleanup.sh rpmbuild -ba ~/rpmbuild/SPECS/xkb-switch.spec . 3 :



 libxkbswitch1.i586: W: no-documentation libxkbswitch-devel.i586: W: no-documentation libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch 


, . , . . Essayons de le comprendre.





, , , README.md . %files — %doc :



 %doc README.md 


. %doc — . ~/rpmbuild/BUILD/xkb-switdh-master/README.md .


: libxkbswitch-devel.i586: W: no-dependency-on libxkbswitch/libxkbswitch-libs/liblibxkbswitch . , libxkbswitch-devel libxkbswitch .


rpm -qp -- . :


 [user@pc ~] $ cd ~/rpmbuild/RPMS/i586/ [user@pc ~/rpmbuild/RPMS/i586] $ ls libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm xkb-switch-debuginfo-1.6.0-1-rosa2014.1.i586.rpm [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch1-1.6.0-1-rosa2014.1.i586.rpm libxkbswitch.so.1 libxkbswitch1 = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --provides libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libxkbswitch) libxkbswitch-devel = 1.6.0-1:2014.1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires libxkbswitch-devel-1.6.0-1-rosa2014.1.i586.rpm devel(libX11) devel(libgcc_s) devel(libstdc++) devel(libxkbfile) rpmlib(PayloadIsXz) <= 5.2-1 [user@pc ~/rpmbuild/RPMS/i586] $ rpm -qp --requires xkb-switch-1.6.0-1-rosa2014.1.i586.rpm libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.11) libstdc++.so.6(GLIBCXX_3.4.20) libstdc++.so.6(GLIBCXX_3.4.9) libxkbswitch.so.1 rpmlib(PayloadIsXz) <= 5.2-1 


, libxkbswitch1 libxkbswitch.so.1 libxkbswitch1 . xkb-switch libxkbswitch.so.1 , libxkbswitch-devel libxkbswitch1 . , %package libxkbswitch-devel . :



 %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} 


, 
 . libxkbswitch-devel , , . , , rpmbuild .


-, ( README.md ), — :



-
 %define major 1 %define libname %mklibname xkbswitch %{major} %define develname %mklibname -d xkbswitch # Main package. Automaticaly requires libxkbswitch and libxkbswitch-devel Name: xkb-switch Version: %{major}.6.0 Release: 1 Summary: Query and change XKB layout state License: GPLv3+ Group: Development/X11 URL: https://github.com/alexandersolovyov/xkb-switch Source0: https://github.com/alexandersolovyov/xkb-switch/archive/master.zip BuildRequires: cmake >= 2.6 BuildRequires: gcc BuildRequires: libxkbfile-devel BuildRequires: xz %description xkb-switch is a C++ program that allows to query and change the keyboard layout state for X11 Window System (XKB) via command line. It provides a command 'xkb-switch', and bindings for API of the Vim text editor, a library 'libxkbswitch'. It is mainly used for some plugins for Vim text editor, such as vim-xkbswitch. Originally ruby-based code written by J.Broomley. # libxkbswitch %package -n %{libname} Version: %{version} Summary: A library for xkb-switch tool, provides API bindings for Vim text editor Group: Development/X11 %description -n %{libname} libxkbswitch library, required by xkb-switch tool. It provides bindings for API of the Vim text editor, which can be used via 'libxkbswitch.so.1'. # libxkbswitch-devel %package -n %{develname} Version: %{version} Summary: Development library libxkbswitch, provides API bindings for Vim text editor Group: Development/X11 Requires: %{libname} >= %{version} %description -n %{develname} Development files for libxkbswitch. Provides bindings for API of the Vim text editor via 'libxkbswitch.so'. # xkb-switch %files %{_bindir}/%{name} %{_mandir}/man1/%{name}.1.xz # libxkbswitch1 %files -n %{libname} %{_libdir}/libxkbswitch.so.%{major} %{_libdir}/libxkbswitch.so.%{version} %doc README.md # libxkbswitch-devel %files -n %{develname} %{_libdir}/libxkbswitch.so %doc README.md #------------------------------------------------------------------ %prep %setup -q -n xkb-switch-master %build %cmake %make %install %makeinstall_std -C build 




Conclusion


, RPM Rosa Linux ( ). , -. , — , , rpmrc , ABF , — .


— , -, - , — .








rpmbuild -bp specfile.spec
Exécuter la préparation (% prep).

rpmbuild -bc specfile.spec
Run compilation (build%) et toutes les actions précédentes.

rpmbuild -bi specfile.spec
Effectue une pseudo- installation (% install) et toutes les étapes précédentes.

rpmbuild -ba specfile.spec
Générez des packages complÚtement.




Vérification du colis fini


rpmlint -i package_file_name.rpm Vérification
générale - dans quelle mesure le package a été construit.

rpm -qp --provides package_filename.rpm
Vérifiez quelles "fonctionnalités" sont fournies par le package.

rpm -qp --requires package_filename.rpm
Vérifiez les "capacités" des autres packages dont dépend ce package.

rpm -qpl package_file_name.rpm
Liste des fichiers contenus dans le package.

rpm -qpi nom-fichier-package.rpm
Informations sur le package (Ă  partir de "l'en-tĂȘte" du fichier de spĂ©cifications ou du bloc % package ).



, p . , Rosa Linux, . urpmq , rpm -q . , urpmq -l _ , urpmq --requires _ .




( )


  1. Building RPMs — Quick Start — RPM Rosa Linux.
  2. RPM — , , . .
  3. RPM: spec — - Rosa Linux.
  4. Maximum RPM — rpm RPM- RedHat Linux. , Rosa Linux. .
  5. Template Spec Files — .spec . , -.
  6. Automatic Build Farm (ABF) — Rosa Linux. , , , .spec . -.
  7. Rpmlint Errors — , rpmlint .
  8. Packaging Group — Rosa Linux.
  9. Rosa Linux .
  10. Git — — Git .

Source: https://habr.com/ru/post/fr464993/


All Articles