pkgsrc (6/6)

Previous

Aujourd’hui, nous allons faire des packages d’application en Go avec pkgsrc. C’est un Imil un peu “fatigué” qui nous présente comment s’y prendre … enfin … s’il arrive à survivre à l’intro ! ^^’

Comme toujours, la vidéo est disponible ici et je vous conseille vivement de la voir.

Go dans pkgsrc

Pour parler de Go dans pkgsrc, on va commencer par parler de quelqu’un : benz. C’est à lui que l’on doit la gestion de Go dans pkgsrc !

Pour aller voir un petit peu comment ça marche, il suffit de jeter un petit coup d’oeil à l’arborescence de pkgsrc :

$ cd /usr/pkgsrc

$ ls lang/go
CVS             Makefile        go-dep.mk       go-package.mk   version.mk
DESCR           bootstrap.mk    go-module.mk    go-vars.mk

Comme vous pouvez le voir, on y trouve des fichiers mk qui permettent de faire facilement des packages go.

Et notamment, le fichier go-module.mk à inclure dans le Makefile de notre paquet !!

Pour les détails, vous pouvez aller voir sur le blog de Benny Ici.

Grâce à Benny, même s’il n’y a pas de support des modules dans le soft à packager, ce n’est pas grave : on peut le faire nous même. Génial non ? En effet, par défaut, quand on compile un outil en Go, le résultat est un binaire statique. Du coup, ça n’a pas beaucoup d’intérêt de faire modulaire ! En général, dans un projet Go, on va récupérer les modules dont on a besoin pour compiler, puis ça compile statiquement en un gros binaire. Tout cela se fait très simplement avec pkgsrc !

Let’s go ! Packageons un peu !

Le programme que nous allons packager aujourd’hui s’appelle go-md2man : Il permet de convertir du markdown en manpage. Une bonne habitude, avant de commencer, est toujours de vérifier si le package n’existe pas déjà !

$ pkgin se md2man
go-md2man-2.0.1nb7   Converts markdown into roff (man pages)

=: package is installed and up-to-date
<: package is installed but newer version is available
>: installed package has a greater version than available package

AH. Le package existe déjà !

En temps normal, cela voudrait dire que nous ne devons pas le repackager. Il serait plus sain, si ce package ne va pas, de proposer à son auteur des contributions.

Cependant, ici, il s’agit d’apprendre. Nous allons donc le faire tout de même, puis comparer notre approche à celle de l’auteur de ce package !

On commence, comme à chaque fois, par utiliser url2pkg :

$ cd /usr/pkgsrc/wip

$ mkdir go-md2man

$ cd go-md2man

$ url2pkg https://github.com/cpuguy83/go-md2man/archive/refs/tags/v2.0.2.zip
===> Cleaning for go-md2man-2.0.2
=> Bootstrap dependency digest>=20211023: found digest-20220214
WARNING: [license.mk] Every package should define a LICENSE.
=> Fetching go-md2man-2.0.2.zip
Requesting https://github.com/cpuguy83/go-md2man/archive/refs/tags/v2.0.2.zip
Redirected to https://codeload.github.com/cpuguy83/go-md2man/zip/refs/tags/v2.0.2
Requesting https://codeload.github.com/cpuguy83/go-md2man/zip/refs/tags/v2.0.2
 73323        1.32 MiB/s
73323 bytes retrieved in 00:00 (1.31 MiB/s)
=> Checksum BLAKE2s OK for go-md2man-2.0.2.zip
=> Checksum SHA512 OK for go-md2man-2.0.2.zip
===> Installing dependencies for go-md2man-2.0.2
=> Tool dependency cwrappers>=20150314: found cwrappers-20220403
=> Tool dependency checkperms>=1.1: found checkperms-1.12
===> 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'.
===> Overriding tools for go-md2man-2.0.2
===> Extracting for go-md2man-2.0.2

Remember to run pkglint when you're done.
See ../../doc/pkgsrc.txt to get some help.

Voici le fichier Makefile que nous obtenons :

# $NetBSD$

GITHUB_TAG=     refs/tags/v${PKGVERSION_NOREV}
DISTNAME=       go-md2man-2.0.2
CATEGORIES=     # TODO: add primary category
MASTER_SITES=   ${MASTER_SITE_GITHUB:=cpuguy83/}
EXTRACT_SUFX=   .zip

MAINTAINER=     INSERT_YOUR_MAIL_ADDRESS_HERE # or use pkgsrc-users@NetBSD.org
HOMEPAGE=       https://github.com/cpuguy83/go-md2man/
COMMENT=        TODO: Short description of the package
#LICENSE=       # TODO: (see mk/license.mk)

USE_LANGUAGES=  # none

.include "../../mk/bsd.pkg.mk"

Sur la base de ce Makefile, nous faisons quelques modifications :

# $NetBSD$

GITHUB_TAG=     v${PKGVERSION_NOREV}
DISTNAME=       go-md2man-2.0.2
CATEGORIES=     textproc
MASTER_SITES=   ${MASTER_SITE_GITHUB:=cpuguy83/}
EXTRACT_SUFX=   .zip

MAINTAINER=     rancune@rancune.org
HOMEPAGE=       https://github.com/cpuguy83/go-md2man/
COMMENT=        Converts markdown into roff ( Man pages �)
LICENSE=        mit

USE_LANGUAGES=  # none

.include "../../lang/go/go-module.mk"
.include "../../mk/bsd.pkg.mk"

Comme vous pouvez le voir, c’est assez similaire à ce que nous avons fait les fois précédentes. Cependant, il y a une petite nouveauté à l’avant dernière ligne : nous avons inclus le fichier “go-module.mk” évoqué plus haut.

On peut maintenant récupérer les sources et mettre à jour le distinfo :

$ make fetch
=> Bootstrap dependency digest>=20211023: found digest-20220214
=> Fetching go-md2man-2.0.2.zip
=> Total size: 73323 bytes
Requesting https://github.com/cpuguy83/go-md2man/archive/v2.0.2.zip
Redirected to https://codeload.github.com/cpuguy83/go-md2man/zip/refs/tags/v2.0.2
Requesting https://codeload.github.com/cpuguy83/go-md2man/zip/refs/tags/v2.0.2
 73323      569.22 KiB/s
73323 bytes retrieved in 00:00 (568.08 KiB/s)

$ make distinfo
=> Bootstrap dependency digest>=20211023: found digest-20220214

Pour la gestion des modules Go utilisés par md2man, pkgsrc va s’occuper de tout. Il suffit de créer la liste des modules nécessaires :

$ make show-go-modules
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.mod
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.mod: 200 OK (0.064s)
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.info
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.info: 200 OK (0.003s)
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.zip
# get https://proxy.golang.org/github.com/russross/blackfriday/v2/@v/v2.1.0.zip: 200 OK (0.005s)
# $NetBSD$

GO_MODULE_FILES+=       github.com/russross/blackfriday/v2/@v/v2.1.0.mod
GO_MODULE_FILES+=       github.com/russross/blackfriday/v2/@v/v2.1.0.zip

$ make show-go-modules > go-modules.mk

Maintenant que le fichier go-modules.mk est généré, il ne reste plus qu’à l’inclure dans notre Makefile :

# $NetBSD$

GITHUB_TAG=     v${PKGVERSION_NOREV}
DISTNAME=       go-md2man-2.0.2
CATEGORIES=     textproc
MASTER_SITES=   ${MASTER_SITE_GITHUB:=cpuguy83/}
EXTRACT_SUFX=   .zip

MAINTAINER=     rancune@rancune.org
HOMEPAGE=       https://github.com/cpuguy83/go-md2man/
COMMENT=        Converts markdown into roff ( Man pages �)
LICENSE=        mit

USE_LANGUAGES=  # none

.include "go-modules.mk"
.include "../../lang/go/go-module.mk"
.include "../../mk/bsd.pkg.mk"

Le reste de la démarche doit maintenant commencer à vous être familier. On met à jour le fichier DESCR, puis on utilise les commandes habituelles :

$ make distinfo
=> Bootstrap dependency digest>=20211023: found digest-20220214
=> Fetching github.com_russross_blackfriday_v2_@v_v2.1.0.mod
[...]
122358 bytes retrieved in 00:00 (8.38 MiB/s)

$ 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'.
===> Creating toolchain wrappers for go-md2man-2.0.2
===> Configuring for go-md2man-2.0.2
=> Checking for portability problems in extracted files
===> Building for go-md2man-2.0.2
github.com/russross/blackfriday/v2
github.com/cpuguy83/go-md2man/v2/md2man
github.com/cpuguy83/go-md2man/v2

$ make print-PLIST >  PLIST

$ make stage-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'.
===> Installing for go-md2man-2.0.2
=> Generating pre-install file lists
=> Creating installation directories
=> Automatic manual page handling
=> Generating post-install file lists
=> Checking file-check results for go-md2man-2.0.2
=> Checking for non-existent script interpreters in go-md2man-2.0.2
=> Checking file permissions in go-md2man-2.0.2
=> Checking for missing run-time search paths in go-md2man-2.0.2
=> Checking for work-directory references in go-md2man-2.0.2

$ make clean
===> Cleaning for go-md2man-2.0.2

$ pkglint
Looks fine.

$ sudo make install
[...]
===> Installing for go-md2man-2.0.2
=> Generating pre-install file lists
=> Creating installation directories
=> Automatic manual page handling
=> Generating post-install file lists
=> Checking file-check results for go-md2man-2.0.2
=> Checking for non-existent script interpreters in go-md2man-2.0.2
=> Checking file permissions in go-md2man-2.0.2
=> Checking for missing run-time search paths in go-md2man-2.0.2
=> Checking for work-directory references in go-md2man-2.0.2
=> Creating binary package /usr/pkgsrc/wip/go-md2man/work/.packages/go-md2man-2.0.2.tgz
===> Building binary package for go-md2man-2.0.2
=> Creating binary package /usr/pkgsrc/packages/All/go-md2man-2.0.2.tgz
===> Installing binary package of go-md2man-2.0.2

$ go-md2man --help
Usage of go-md2man:
  -in string
        Path to file to be processed (default: stdin)
  -out string
        Path to output processed file (default: stdout)

Et c’est une victoire \o/

On compare ?

Puisque md2man était déjà packagé dans l’arbre pkgsrc, nous allons pouvoir comparer notre travail et celui d’un packageur expérimenté.

Voici notre Makefile :

# $NetBSD$

GITHUB_TAG=     v${PKGVERSION_NOREV}
DISTNAME=       go-md2man-2.0.2
CATEGORIES=     textproc
MASTER_SITES=   ${MASTER_SITE_GITHUB:=cpuguy83/}
EXTRACT_SUFX=   .zip

MAINTAINER=     rancune@rancune.org
HOMEPAGE=       https://github.com/cpuguy83/go-md2man/
COMMENT=        Converts markdown into roff ( Man pages �)
LICENSE=        mit

USE_LANGUAGES=  # none

.include "go-modules.mk"
.include "../../lang/go/go-module.mk"
.include "../../mk/bsd.pkg.mk"

Et voici celui du package situé dans /usr/pkgsrc/textproc/go-md2man :

# $NetBSD: Makefile,v 1.46 2022/04/13 07:50:54 bsiegert Exp $

DISTNAME=       go-md2man-2.0.1
MASTER_SITES=   ${MASTER_SITE_GITHUB:=cpuguy83/}
PKGREVISION=    8
CATEGORIES=     textproc
GITHUB_TAG=     v${PKGVERSION_NOREV}

MAINTAINER=     pkgsrc-users@NetBSD.org
HOMEPAGE=       https://github.com/cpuguy83/go-md2man
COMMENT=        Converts markdown into roff (man pages)
LICENSE=        mit

.include "go-modules.mk"
.include "../../lang/go/go-module.mk"
.include "../../mk/bsd.pkg.mk"

Il y a tout de même un gros gros air de ressemblance non ????

Conclusion

Voilà qui termine cet arc sur pkgsrc, et iMil nous propose déjà d’autres aventures mais j’avoue que je commence à beaucoup apprécier pkgsrc et sa logique. Parce que voilà : TOUT y est beau, logique et cohérent. Et ça, je kiffe.

Je continuerai bien sûr à retranscrire mes notes sur ses vidéos ici, alors je vous dis à très bientôt !

Rancune.