Comment écrire un Portfile pour DarwinPorts


Kevin Van Vechten (kevin@opendarwin.org), Felix Kronlage (fkr@opendarwin.org)
15-Mar-2003

Divers

DarwinPorts automatise les tâches usuelles requises pour le portage de logiciel sur Darwin. Les Portfiles contiennent les informations nécessaires pour que la compilation et l'installation de logiciels particuliers soient faites correctement sous Darwin. Le but de DarwinPorts est de pouvoir garder la syntaxe des Portfiles aussi simple que possible, tout en supportant les cas spéciaux requis par la compilation et l'installation de beaucoup de logiciel afin que tout se passe avec succès.

Cet article décrit la constitution d'un simple Portfile, et explore les fonctions les plus communes à DarwinPorts.

Commencer

Pour pouvoir travailler avec DarwinPorts, vous devrez le télécharger et l'installer sur votre système. La page d'accueil du projet DarwinPorts décrit comment se le procurer et l'installer.

Comme vous vous intéressez à l'écriture d'un Portfile, vous devriez invoquer la commande port avec l'option v (mode verbeux) et l'option d (mode déboguage). Cela affichera des messages utile au déboguage qui sont normalement omis lors de l'exécution de DarwinPorts.

DarwinPorts effectuera plusieurs tâches basiques prédéfinies, qui sont :

Sujets basiques

Sujets avancés

Annexe

Récupération des sources

La première chose à faire est de choisir un logiciel à porter. Pour cet exemple, nous allons utiliser ircII, un client IRC populaire. Nous commencerons avec un Portfile simple, décrivant les attributs basiques d'ircII comme son nom, sa version et le site où nous pouvons télécharger les sources. Créez un répertoire de travail nommé ircii et créez à l'intérieur un fichier nommé Portfile ayant le contenu suivant :


# $Id: $
PortSystem 1.0
name               ircii
version            20020912
categories         irc
maintainers        kevin@opendarwin.org
description        an IRC and ICB client
long_description   The ircII program is a full screen, termcap based interface to Internet Relay \
                   Chat. It gives full access to all the normal IRC functions, plus a variety \
                   of additionnal options.
master_sites       ftp://ircftp.au.eterna.com.au/pub/ircII/

Un Portfile consiste en une suite de paires de type clé/valeur. Chaque portfile doit commencer avec # $Id: $ qui est une balise RCS Id en commentaire. Après la balise RCS Id, vient la déclaration PortSystem. Actuellement la seule déclaration valide est PortSystem 1.0. Les clés name et version décrivent le nom et la version du logiciel. La clé categories est une liste des catégories auquel le logiciel peut appartenir de façon logique; c'est utilisé dans un but d'organisation. La première entrée dans categories devrait correspondre au nom du répertoire où doit résider le répertoire du port. La clé maintainers devrait, elle, contenir votre adresse email. description affiche une brève description du port, alors que long_description affiche une complète description du port. La clé master_sites devrait quant à elle contenir une liste des sites où télécharger les sources. DarwinPorts utilise les termes "clés" et "options" indifféremment comme la plupart des clés sont utilisées comme des options d'une tâche particulière dans le processus du portage.

Arrivé à ce point, le Portfile est assez complet pour permettre le téléchargement d'ircII. Par défaut, DarwinPorts ajoutera version à name et considérera que les sources sont au format .tar.gz. Depuis votre répertoire de travail, exécutez la commande suivante :


% port -d -v checksum

La commande port opère directement sur le Portfile du répertoire de travail actuel. Vous devriez voir la même chose que ce qui suit :


DEBUG: Executing com.apple.main (ircii)
DEBUG: Executing com.apple.fetch (ircii)
--->  ircii-20020912.tar.gz doesn't seem to exist in /opt/local/var/db/dports/
distfiles
--->  Attempting to fetch ircii-20020912.tar.gz from ftp://
ircftp.au.eterna.com.au/pub/ircII/
DEBUG: Executing com.apple.checksum (ircii)
Error: No checksums statement in Portfile.  File checksums are:
ircii-20020912.tar.gz md5 2ae68c015698f58763a113e9bc6852cc
Error: Target error: com.apple.checksum returned: No checksums statement in 
Portfile.

Vérification du fichier téléchargé

Remarquez que DarwinPorts vérifiera dans un premier temps s'il existe une copie locale d'ircii-20020912.tar.gz mais il ne la trouvera pas, donc il la téléchargera depuis le site distant. La commande port ne se termine correctement car l'erreur : "No checksums statement in Portfile" est arrivée. Les Portfiles doivent contenir une somme de contrôle md5 de tous les fichiers distribués -- cela permet à DarwinPorts de vérifier l'exactitude et l'authenticité des sources. Pour plus de souplesse, une somme de contrôle md5 pour les fichiers téléchargés est affichée lorsque l'argument checksums n'est pas spécifié. Revenez en arrière et ajoutez ce qui suit à votre Portfile :


checksums       md5 2ae68c015698f58763a113e9bc6852cc

Extraction des sources dans un répertoire de travail

Maintenant que nous avons une somme de contrôle, nous pouvons vérifier nos sources. Procédons à l'extraction des sources dans notre répertoire de travail. Exécutez la commande suivante :


% port -d -v extract

Qui devrait afficher ce qui suit :


DEBUG: Skipping completed com.apple.main (ircii)
DEBUG: Skipping completed com.apple.fetch (ircii)
DEBUG: Executing com.apple.checksum (ircii)
--->  Checksum OK for ircii-20020912.tar.gz
DEBUG: Executing com.apple.extract (ircii)
--->  Extracting for ircii-20020912
--->  Extracting ircii-20020912.tar.gz ... DEBUG: Assembled command: 'cd /Users/
kevin/opendarwin/proj/darwinports/dports/irc/ircii/work && gzip -dc /opt/local/
var/db/dports/distfiles/ircii-20020912.tar.gz | tar -xf -'
Done

Exécution d'un script Configure

Maintenant que les sources ont été extraites dans un répertoire nommé work placé dans le répertoire de travail actuel, nous pouvons configurer les sources afin de les compiler avec les options désirées. Par défaut, DarwinPorts assume que le logiciel que vous portez utilise un script configure autoconf, et toujours par défaut, DarwinPorts passera l'argument --prefix=${prefix} au script configure, spécifiant que ce logiciel devra s'installer dans la hiérarchie utilisée par DarwinPorts.

Les options standards d'ircII semblent correctes pour une installation de base sur Darwin, donc inutile de lancer le configure manuellement, nous passerons directement à la phase de compilation.

Compilation des sources

Pour compiler, tapez ce qui suit :


% port build

Par défaut, la phase de compilation exécute l'utilitaire système make(1). (Cela peut être changé avec l'option build.type qui accepte les arguments tel que bsd, gnu ou pbx. Alternativement, l'option build.cmd peut être utilisée pour spécifier une commande de compilation arbitraire.) L'étape ci-dessus a commencé la compilation des sources, lorsqu'elle sera terminée, nous serons fin prêt pour installer le logiciel.

Installation du programme dans le système

L'ancienne méthode qui consistait à inclure la liste dans le fichier contents est devenue obsolète en partie grâce au méchanisme destroot. Avec destroot le logiciel est installé dans une hiérarchie se situant dans le répertoire work. Alors que certains logiciels (comme ircII) ne requièrent pas de manipulations spéciales pour être installés dans le destroot, d'autres (comme ncftp) ont besoin de la variable install.destroot afin qu'ils s'installent correctement dans le destroot.


 install.destroot        mandir=${destroot}${prefix}/man prefix=${destroot}${prefix}

Regardez quelques-uns de nos ports pour voir plus d'exemples sur comment utiliser l'option install.destroot.

À présent nous avons un portfile complet. Relancez l'étape d'installation pour ajouter ce port à votre propre registre :


% sudo port -d -v install
Qui devrait afficher :

DEBUG: Skipping completed com.apple.main (ircii)
DEBUG: Skipping completed com.apple.fetch (ircii)
DEBUG: Skipping completed com.apple.checksum (ircii)
DEBUG: Skipping completed com.apple.extract (ircii)
DEBUG: Skipping completed com.apple.patch (ircii)
DEBUG: Skipping completed com.apple.configure (ircii)
DEBUG: Skipping completed com.apple.build (ircii)
DEBUG: Skipping completed com.apple.install (ircii)
DEBUG: Executing com.apple.registry (ircii)
--->  Adding ircii to registry, this may take a moment...

Sujets avancés

Modifier des cibles

Il est possible de modifier la fonctionnalité d'une cible de compilation avec le code Tcl. Un exemple commun est le suivant, qui peut être utile pour un script sans script configure autoconf :


configure {}

Dans le Portfile, cela remplacera la fonctionnalité de la cible de configure, aussi nous sauterons cette étape. Il est également possible d'exécuter du code Tcl immédiatement avant ou après une cible standard. Cela peut être accompli de la manière suivante :


post-configure {
    reinplace "s|change.this.to.a.server|irc.openprojects.net|g" \
        "${workdir}/${worksrcdir}/config.h"
}

Cet exemple remplace l'occurrence de change.this.to.a.server avec irc.openprojects.net dans le fichier config.h qui a été généré pendant la phase précédant configure. Notez que c'est en quelque sorte un exemple inventé et voulu, car la même chose aurait pu être faite en spécifiant --with-default-server=irc.openprojects.net dans configure.args, mais l'approche est généralement utile lorsque de tels arguments ne sont pas présents.

Variantes du Portfile

Comme Darwin 6.0 gère ipv6, il est possible de configurer le port avec l'option --with-ipv6. Cela peut être effectué en ajoutant l'option suivante dans le Portfile :


configure.args      --disable-ipv6

variant ipv6 {
    configure.args-append  --enable-ipv6
}

Maintenant la compilation par défaut n'inclura pas le support d'ipv6, mais si la variante ipv6 est voulue, ircII l'aura. Les options par elles-même devraient être considérées comme un facteur d'assignation. Comme les variantes peuvent être utilisées en combinaison avec d'autre, il est conseillé de les ajouter uniquement aux options au lieu de les écraser. Toutes les options peuvent avoir un suffixe avec -append ou -delete pour ajouter ou effacer un terme de la liste. Vous pouvez spécifier la compilation avec la variante ipv6 de la manière suivante :


% port build +ipv6

Annexe

Aperçu d'un Portfile

Ce qui suit est le listage complet du Portfile d'ircII :


# $Id: $
PortSystem 1.0
name               ircii
version            20020912
categories         irc
maintainers        kevin@opendarwin.org
description        an IRC and ICB client
long_description   The ircII program is a full screen, termcap based interface to Internet Relay \
                   Chat. It gives full access to all the normal IRC functions, plus a variety \
                   of additionnal options.
homepage           http://www.eterna.com.au/ircii/
master_sites       ftp://ircftp.au.eterna.com.au/pub/ircII/
checksums          md5 2ae68c015698f58763a113e9bc6852cc
configure.args     --disable-ipv6

post-configure {
        reinplace "s|change.this.to.a.server|irc.openprojects.net|g" \
                  "${workdir}/${worksrcdir}/config.h"
}

variant ipv6 {
        configure.args-append --enable-ipv6
}