pkgsrc (5/6)

Previous Next

Je sais, je sais … je suis en retard ! Désolé, la semaine a été un petit peu rude !

En tout cas, voici mes notes sur la dernière vidéo d’Imil. Nous continuons et finissons le portage sous NetBSD de l’appli Archey4 en python. Au programme, du patch, du lint … et du partage d’aborescence !

Oups …

Dans ce que nous avons fait la dernière fois, une petite erreur s’est glissée. En effet, le nommage des archives zip sous Github n’est pas basé sur le nom de l’appli, mais sur le numéro de version utilisé pour le tag :

% cd /usr/pkgsrc/wip/py-archey4

% make distclean
===> Cleaning for py39-archey4-4.13.4
===> Dist cleaning for py39-archey4-4.13.4

% make fetch
=> Bootstrap dependency digest>=20211023: found digest-20220214
=> Fetching archey4-4.13.4.zip
=> Total size: 160197 bytes
Requesting https://github.com/HorlogeSkynet/py39-archey4/archive/refs/tags/v4.13.4.zip
ftp: Error retrieving file `404 Not Found'
fetch: Unable to fetch expected file archey4-4.13.4.zip
[...]

Comme on peut le voir ci-dessus, pkgsrc recherche archey4-4.14.4.zip alors que sur github, l’adresse du zip est :

https://github.com/HorlogeSkynet/archey4/archive/refs/tags/v4.13.4.zip

Pas de souci, nous allons procéder à quelques modifications :

VERS= 	4.13.4
DISTNAME=	${VERS}
GITHUB_PROJECT=	archey4
GITHUB_TAG=	refs/tags/${VERS}
PKGNAME=	${PYPKGPREFIX}-${GITHUB_PROJECT}-${VERS}
WRKSRC=		${WRKDIR}/${GITHUB_PROJECT}-${VERS}

Cette fois-ci, puisque pkgsrc utilise des variables spéciales pour le site GITHUB, nous construisons GITHUB_TAG de façon à ce que ce soit la bonne archive qui soit téléchargée. Il nous faut également adapter notre chemin WRKSRC, puisque nos source ne sont plus au même endroit.

Notre Makefile final ressemble donc à ceci :

# $NetBSD$
VERS=           4.13.4

GITHUB_PROJECT= archey4
GITHUB_TAG=     refs/tags/v${VERS}
DISTNAME=       ${VERS}
PKGNAME=        ${PYPKGPREFIX}-${GITHUB_PROJECT}-${VERS}

CATEGORIES=     sysutils
MASTER_SITES=   ${MASTER_SITE_GITHUB:=HorlogeSkynet/}
EXTRACT_SUFX=   .zip

MAINTAINER=     maintainer@rancune.org
HOMEPAGE=       https://github.com/HorlogeSkynet/archey4
COMMENT=        Archey is a simple system information tool written in Python
LICENSE=        gnu-gpl-v3

DEPENDS+=       ${PYPKGPREFIX}-distro>=1.3:../../devel/py-distro
DEPENDS+=       ${PYPKGPREFIX}-netifaces>=0.10:../../net/py-netifaces

WRKSRC=         ${WRKDIR}/${GITHUB_PROJECT}-${VERS}

.include "../../lang/python/egg.mk"
.include "../../lang/python/application.mk"
.include "../../mk/bsd.pkg.mk"

Il nous reste à le tester, après avoir remis à jour le distinfo et le PLIST :

% make clean
===> Cleaning for py39-archey4-4.13.4

% make disclean
===> Cleaning for py39-archey4-4.13.4
===> Dist cleaning for py39-archey4-4.13.4


% make fetch
=> Bootstrap dependency digest>=20211023: found digest-20220214
=> Fetching 4.13.4.zip
=> Total size: 160197 bytes
Requesting https://github.com/HorlogeSkynet/archey4/archive/refs/tags/v4.13.4.zip
Redirected to https://codeload.github.com/HorlogeSkynet/archey4/zip/refs/tags/v4.13.4
Requesting https://codeload.github.com/HorlogeSkynet/archey4/zip/refs/tags/v4.13.4
   156 KiB    1.41 MiB/s
160197 bytes retrieved in 00:00 (1.40 MiB/s)

% make makedistinfo
=> Bootstrap dependency digest>=20211023: found digest-20220214

% make
=> Bootstrap dependency digest>=20211023: found digest-20220214
===> Skipping vulnerability checks.
WARNING: No /var/db/pkg/pkg-vulnerabilities file found.
WARNING: To fix run: `/usr/pkg/sbin/pkg_admin -K /var/db/pkg fetch-pkg-vulnerabilities'.
===> Building for py39-archey4-4.13.4
[...]
copying archey/logos/raspbian.py -> build/lib/archey/logos
copying archey/logos/rhel.py -> build/lib/archey/logos
copying archey/logos/rocky.py -> build/lib/archey/logos
copying archey/logos/slackware.py -> build/lib/archey/logos
copying archey/logos/ubuntu.py -> build/lib/archey/logos
copying archey/logos/windows.py -> build/lib/archey/logos
copying archey/py.typed -> build/lib/archey

% sudo make deinstall
===> Deinstalling for py39-archey4-4.13.4
Running /usr/pkg/sbin/pkg_delete -K /var/db/pkg  py39-archey4-4.13.4

% make print-PLIST > PLIST

% make stage-install
[...]
=> Checking file-check results for py39-archey4-4.13.4
=> Checking for non-existent script interpreters in py39-archey4-4.13.4
=> Checking file permissions in py39-archey4-4.13.4
=> Checking for PIE in py39-archey4-4.13.4
=> Checking for RELRO in py39-archey4-4.13.4
=> Checking for missing run-time search paths in py39-archey4-4.13.4
=> Checking for work-directory references in py39-archey4-4.13.4

% sudo make install
=> Bootstrap dependency digest>=20211023: found digest-20220214
===> Skipping vulnerability checks.
WARNING: No /var/db/pkg/pkg-vulnerabilities file found.
WARNING: To fix run: `/usr/pkg/sbin/pkg_admin -K /var/db/pkg fetch-pkg-vulnerabilities'.
=> Creating binary package /usr/pkgsrc/wip/py-archey4/work/.packages/py39-archey4-4.13.4.tgz
===> Building binary package for py39-archey4-4.13.4
=> Creating binary package /usr/pkgsrc/packages/All/py39-archey4-4.13.4.tgz
===> Installing binary package of py39-archey4-4.13.4

Notre Makefile est fin prêt !!!!!

Terminons le portage de notre appli

Comme nous l’avions vu la dernière fois, si le package semble bien s’installer il ne fonctionne pas encore sous NetBSD. Il va falloir en modifier le code et écrire des patchs. Lors de la vidéo, Imil s’est contenté - pour des raisons de temps - de commenter les parties du code qui posaient problème. Je ne vais pas détailler ici quelles parties ont été commentées, mais plutôt vous rappeler la façon donc on crée un patch avec pkgsrc.

Imaginons que nous voulions modifier le fichier temperature.py. On utilise l’outil pkg-vi, que nous avions vu précédemment :

% pkgvi work/archey4-4.13.4/archey/entries/temperature.py

Lorsque nous sauvegardons et fermons le fichier, le diff est automatiquement généré. (J’adore littéralement cet outil !)

Il nous reste alors à fabriquer le patch :

% mkpatches

Un répertoire se crée dans notre package, du nom de “patches”. Il contient les patches générés.

Il nous faut maintenant ajouter le hash de nos patchs à notre fichier distinfo. Encore une fois, une commande suffit :

% make mps

Simple non ? Il ne reste plus qu’à recompiler, tester … Mais ça vous savez déjà faire !

Et mon package ? Tu l’aimes mon package ?

Si le boulot est bien fait, il ne reste plus qu’à le publier. Mais comme nous sommes des gens soucieux de bien faire, nous allons tout de même vérifier la qualité de notre travail !

Pour ce faire, il existe un outil, “pkglint” qui permet de valider son package :

% pkglint
ERROR: DESCR:1: DESCR files must not have TODO lines.
WARN: DESCR:8: Line too long (should be no more than 80 characters).
WARN: DESCR:12: Line too long (should be no more than 80 characters).
WARN: DESCR:15: Line too long (should be no more than 80 characters).
WARN: DESCR:17: Line too long (should be no more than 80 characters).
WARN: DESCR:19: Line too long (should be no more than 80 characters).
WARN: DESCR:21: Line too long (should be no more than 80 characters).
NOTE: Makefile:4: Variable values should be aligned with tabs, not spaces.
WARN: Makefile:15: COMMENT should not contain "is a".
ERROR: distinfo: Patch "patches/patch-archey_entries_temperature.py.orig" is not recorded. Run "make makepatchsum".
ERROR: patches/patch-archey_entries_temperature.py:3: Each patch must be documented.
3 errors, 7 warnings and 1 note found.
(Run "pkglint -e" to show explanations.)
(Run "pkglint -fs" to show what can be fixed automatically.)
(Run "pkglint -F" to automatically fix some issues.)

Houlà ! Heureusement que cet outil de validation de la qualité du package existe ! En effet, j’ai oublié de renseigner le fichier DESCR, qui doit contenir une description du package ! J’ai également utilisé des espaces au lieu de tabs dans mon Makefile.

Je suis donc les conseils donnés, et relance le test :

% pkglint
Looks fine.

Ca y est ! Il est beau notre package !!!!!

Partager son arborescence pkgsrc entre plusieurs machines

En début de vidéo, Imil nous a présenté un usecase de pkgsrc que je trouve très intéressant. Imaginons que mon arborescence pkgsrc se trouve en userspace, et que je veuille la partager entre différentes machines.

Je peux via NFS, sshfs, ou autre, faire un montage de mon arborescence dans le répertoire de mon choix. C’est simple comme un mount ! Par contre, je ne veux partager que l’arborescence des paquets, pas le repertoire work. (Cela pourrait poser problème si mes architectures sont différentes par exemple).

On peut régler ce problème avec le fichier mk.conf qui, je vous le rappelle, permet de paramérer pkgsrc :

WRKOBJDIR=		/home/rancune/tmp/pkgsrc/work
DISTDIR=		/home/rancune/Downloads

La variable WRKOBJDIR, comme vous l’aurez sûrement deviné, permet de spécifier le repertoire de base dans lequel les paquets seront compilés.

DISTDIR, quand à elle, contient l’endroit où seront téléchargés les fichiers lors d’un “make fetch”, par exemple.

Pour les curieux, l’ensemble des variables utiles est documenté ici.

Conclusion

Notre package est maintenant prêt, mais surtout nous avons pu voir comment pkgsrc supportait et gérait les applis python. Nous verrons vite la suite de tout ça ( euh … cet aprem en fait ! je suis en retaaaaaard ), mais Imil nous parlait d’aller voir du côté de Go !

A bientôt,

Rancune.