• Aucun résultat trouvé

Plates-formes particuli` eres

Concernant l’ex´ecution d’applications externes, on se reportera `a la commande exec pour un certain nombre de particularit´es rencontr´ees sur certains syst`emes d’exploitation. L’information qui suit concerne plus sp´ecifiquement le cas des pipe- lines.

– sous Windows, l’argument NomFichier concernant un port s´erie `a ouvrir est de la forme comX:, o`u X est un nombre entier g´en´eralement entre 1 et 4. Ce nombre peut aller jusqu’`a 9. Toute tentative d’ouvrir un port inexistant ou bien de num´ero sup´erieur `a 9 ´echouera. Une autre notation consiste `a utiliser un nom de fichier de la forme \\.\comX o`u X d´esigne un num´ero de port. Cette derni`ere m´ethode est beaucoup plus lente sous Windows 95 et Windows 98.

– sous Windows NT, si Tcl est utilis´e interactivement, il peut se produire des interactions ind´esirables avec la vraie console (s’il y en a une ouverte) : aussi bien en lecture qu’en ´ecriture des caract`eres peuvent s’´egarer d’un canal `a l’autre car `a la fois l’interpr´eteur Tcl et les processus enfants sollicitent la console simultan´ement. Ce probl`eme ne se produit pas si le pipeline est d´emarr´e `a partir d’un script plutˆot que depuis la ligne de commande de Tclsh ou bien entendu s’il ne fait pas usage de l’entr´ee et de la sortie standard. – sous Windows 95, un pipeline qui ex´ecute une application MS-DOS 16-bit

ne peut ˆetre ouvert `a la fois en lecture et en ´ecriture car les applications DOS qui re¸coivent leur entr´ee depuis un tube et envoient leur sortie vers un autre tube fonctionnent de mani`ere synchrone. Les pipelines qui n’ex´ecutent pas des applications 16-bit fonctionnent de fa¸con asynchrone et peuvent ˆetre ouverts `a la fois en lecture et en ´ecriture.

Le probl`eme concernant l’ex´ecution d’un pipeline depuis la ligne de com- mandes de Tclsh mentionn´e au paragraphe pr´ec´edent reste vrai avec des applications 32-bit.

Le probl`eme de synchronicit´e a aussi une autre cons´equence : si un pipeline est ouvert pour lire depuis une application DOS 16-bit, la commande open ne retournera pas tant que le pipeline n’aura pas re¸cu une instruction de fin de

fichier de la part de sa sortie. De mˆeme si un pipeline est ouvert en ´ecriture pour ´ecrire vers une application DOS 16-bit, aucune donn´ee ne sera envoy´ee tant que le pipeline n’aura pas ´et´e effectivement referm´e.

– sous MacOS, l’ouverture d’un port s´erie n’est pas impl´ement´ee actuellement de mˆeme que l’ouverture de pipelines. Cela provient du fait que le syst`eme MacOS ne connaˆıt pas la notion d’entr´ees et de sorties standard. Cette situa- tion pourrait changer avec l’arriv´ee du syst`eme MacOSX fond´e sur un noyau Unix

– sous Unix, la syntaxe de l’argument NomFichier pour l’ouverture d’un port s´erie est en g´en´eral de la forme /dev/ttyX, o`u X est l’une des lettres a ou b. Le nom de n’importe quel pseudo-fichier qui pointe vers un port s´erie peut ˆetre utilis´e aussi bien.

En cas d’ex´ecution d’un pipeline en utilisant Tcl interactivement, c’est-`a-dire depuis la ligne de commande de tclsh, on rencontre ´egalement les probl`emes d’instabilit´e d´ecrits ci-dessus pour Windows.

. package 132

package

La commande package accomplit les tˆaches de gestion de modules externes en particulier le chargement des extensions et le contrˆole de leurs versions.

Syntaxe

package Sous-commande Args

Description

Cette commande maintient `a jour, dans une base de donn´ees interne, les infor- mations n´ecessaires concernant les modules disponibles pour l’interpr´eteur courant : elle peut g´erer des versions multiples d’un mˆeme module et charger la version cor- recte requise par une application. Les deux commandes de base utilis´ees dans les scripts sont package require et package provide, les autres ´etant plus sp´ecialement destin´ees aux tˆaches de gestion interne de la base de donn´ees des extensions. Les sous-commandes reconnues sont les suivantes :

package forget?Module Module...?

Supprime dans l’interpr´eteur toutes les informations concernant le module sp´ecifi´e, y compris celles fournies par les commandes package ifneeded et package provide.

package ifneeded Module Version?Script?

Cette commande n’est utilis´ee que dans des scripts de configuration d’un syst`eme. Elle indique qu’une version particuli`ere d’un certain module est dis- ponible au besoin et que ce module peut ˆetre ajout´e `a la base de donn´ees par ex´ecution du script d´efini par l’argument Script. Le script est stock´e en atten- dant l’invocation future d’une commande package require. Le plus souvent ce script installe le chargement automatique (auto-loading) des commandes contenues dans le module ou bien invoque directement les commandes load ou source et ensuite ex´ecute package provide pour indiquer la pr´esence du module.

La base de donn´ees peut contenir d´ej`a des informations pour diff´erentes ver- sions du module : dans ce cas le nouveau script remplacera un script d´ej`a existant. Si l’argument Script est omis, la commande renvoie le texte du script actuellement d´efini pour la version Version du module Module ou bien une chaˆıne vide si aucune commande package ifneeded n’a ´et´e invoqu´ee ant´erieurement pour ce module dans cette version.

package names

Renvoie la liste des noms de tous les modules de l’interpr´eteur pour lesquels une version a ´et´e fournie au moyen d’une commande package provide ou bien un script a ´et´e d´eclar´e par une commande package ifneeded. L’ordre des ´el´ements dans la liste est arbitraire.

package present?-exact? Module?Version?

Cette commande est ´equivalente `a package require `a la diff´erence qu’elle n’essaie pas de charger le module lorsqu’il n’est pas d´ej`a charg´e.

package provide Module?Version?

Cette commande est utilis´ee pour indiquer que la version Version du module Module est rendue disponible dans l’interpr´eteur. On l’utilise usuellement dans un script d´eclar´e avec la commande package ifneeded ou dans un mo- dule `a la fin de son chargement. Une erreur est g´en´er´ee si une version diff´erente du module a ´et´e d´eclar´ee par une commande package provide ant´erieure. Si l’argument Version est omis, la commande renvoie le num´ero de la version couramment disponible ou bien une chaˆıne vide lorsqu’aucune commande package provide n’a ´et´e invoqu´ee pour ce module dans l’interpr´eteur. package require?-exact? Module?Version?

Cette commande demande qu’un certain module soit utilis´e avec un num´ero de version particulier. Les arguments permettent de sp´ecifier le module d´esir´e et la commande assure qu’une version ad´equate du module soit charg´ee dans l’interpr´eteur. Si la commande r´eussit, elle renvoie le num´ero de la version du module qui est charg´ee, sinon elle g´en`ere une erreur.

Si `a la fois l’option -exact et l’argument Version sont sp´ecifi´es, alors seulement cette version pr´ecise du module peut ˆetre charg´ee. Si l’option -exact est omise, il est possible de charger une version ayant le mˆeme num´ero majeur5 et

post´erieure `a celle qui est demand´ee si celle-ci n’est pas disponible. Si l’option -exact et l’argument Version sont omis, alors n’importe quelle version du module peut ˆetre charg´ee.

Si une version du module a d´ej`a ´et´e fournie par une commande package provide, son num´ero de version doit imp´erativement satisfaire aux crit`eres sp´ecifi´es par l’option -exact et l’argument Version : la commande package require retourne alors imm´ediatement. Autrement, la commande recherche dans la base de donn´ees interne contenant les informations qui ont pu ˆetre fournies par des commandes package ifneeded ant´erieures afin de voir si une version acceptable du module est disponible. Si c’est le cas, c’est le script correspondant au num´ero de version le plus ´elev´e qui est invoqu´e. Si la base de donn´ees ne contient pas de version acceptable et si d’autre part une com- mande package unknown a ´et´e d´efinie pour l’interpr´eteur courant, alors cette commande est invoqu´ee. Une fois qu’elle a ´et´e ex´ecut´ee, l’interpr´eteur exa- mine `a nouveau si un module acceptable est maintenant disponible ou s’il existe maintenant un script sp´ecifi´e par une commande package ifneeded. Si aucune des ´etapes d´ecrites pr´ec´edemment n’a pu aboutir, la commande renvoie une erreur.

package unknown?Commande?

Cette commande est une commande de la derni`ere chance si aucune version acceptable d’un module n’a pu ˆetre trouv´ee dans la base de donn´ees constitu´ee par des instructions package ifneeded. Si l’argument optionnel Commande

. package 134 est sp´ecifi´e, il contient la premi`ere partie d’une commande ; si cette commande est invoqu´ee `a la suite d’une instruction package require, Tcl la compl`ete en lui ajoutant deux arguments suppl´ementaires indiquant le nom et le num´ero de version du module d´esir´e.

Si aucun num´ero de version n’est fourni `a la commande package require, alors le deuxi`eme argument suppl´ementaire sera une chaˆıne vide. Si la commande package unknown est invoqu´ee sans que soit pr´ecis´e l’argument Commande, le script package unknown courant est renvoy´e s’il y en a un, ou une chaˆıne vide autrement. Enfin, si l’argument Commande est sp´ecifiquement d´eclar´e comme une chaˆıne vide alors le script package unknown courant est sup- prim´e : c’est le seul moyen par lequel on peut supprimer un script existant. package vcompare Version1 Version2

Compare les deux num´eros de versions indiqu´es par les arguments version1 et version2. Renvoie -1 si version1 est ant´erieur `a version2, 0 s’ils sont ´egaux, et 1 si version1 est post´erieur `a version2.

package versions Module

Renvoie une liste de tous les num´eros de versions du module pour lesquels une information a ´et´e fournie au moyen d’une commande package ifneeded. package vsatisfies Version1 Version2

Renvoie 1 si des scripts ´ecrits pour verVersion2sion2 fonctionnent sans mo- dification avec Version1 autrement dit si :

– Version1 est ´egale ou post´erieure `a Version2 ;

– les deux versions ont le mˆeme num´ero majeur (voir ci-dessous). La commande renvoie la valeur 0 dans le cas contraire.

Num´erotation des versions d’un module

Un num´ero de version est constitu´e de un ou plusieurs nombres s´epar´es par des points comme par exemple 2 ou 3.1416 ou 3.1.13.1. Le premier nombre est dit num´ero de version majeur. Plus il est ´elev´e et plus la version est r´ecente. Les nombres les plus `a gauche ont le degr´e de signification le plus important. Par exemple, une version 2.1 est post´erieure `a une version 1.3, de mˆeme que 3.4.6 est post´erieure `a 3.3.5.

Si un champ est absent, on consid`ere qu’il est nul. Ainsi une version 1.3 est ´equivalente `a une version 1.3.0 ou 1.3.0.0. Une version particuli`ere est cens´ee ˆetre compatible r´etrospectivement avec une version ant´erieure si toutes les deux ont le mˆeme num´ero majeur. Un changement de num´ero majeur signifie donc l’introduc- tion de changements incompatibles.