diff --git a/fr_FR.ISO8859-1/articles/problem-reports/article.sgml b/fr_FR.ISO8859-1/articles/problem-reports/article.sgml
index 58a4d9c77c..acb5cce576 100644
--- a/fr_FR.ISO8859-1/articles/problem-reports/article.sgml
+++ b/fr_FR.ISO8859-1/articles/problem-reports/article.sgml
@@ -1,588 +1,588 @@
%man;
%abstract;
%artheader;
%translators;
%man;
]>
Ecrire des rapports de bogue pour FreeBSD
$FreeBSD$
Cet article décrit comment formuler et soumettre au mieux un
rapport de bogue au projet FreeBSD.
&abstract.license;
&abstract.disclaimer;
&trans.a.fonvieille;
Dag-Erling
Smørgrav
Contributed by
rapports de bogue
Introduction
Une des expériences la plus frustrante que peut vivre un
utilisateur de logiciel est de soumettre un rapport de bogue et de
le voir être fermé sommairement avec une explication
laconique et sans aide du type “ce n'est pas un bogue” ou
“PR bogué”. De même une des
expériences la plus frustrante pour un programmeur est
d'être submergé de rapports de
bogue qui ne sont pas vraiment des rapports de bogue mais plutôt
des demandes d'aide, ou qui contiennent peu ou pas d'information
au sujet du problème et sur comment le reproduire.
Ce document essaye de décrire comment écrire de
bons rapports de bogue. Qu'est-ce qu'un bon rapport de bogue,
allez-vous demander? Bien, pour aller directement au but, un bon
rapport de bogue est celui qui peut être analysé et
traité rapidement, pour la satisfaction mutuelle de
l'utilisateur et du développeur.
Bien que l'objectif principal de cet article soit les rapports
de bogue pour FreeBSD, sa majeure partie devrait s'appliquer
relativement bien à d'autres projets de logiciels.
Notez que cet article est organisé thématiquement,
et non pas de façon chronologique, ainsi vous devriez lire
entièrement ce document avant de soumettre un rapport de
bogue, plutôt que de le traiter comme un guide
pas-à-pas.
Quand soumettre un rapport de bogue
Il existe beaucoup de types de problèmes, et tous ne
devraient pas être à l'origine d'un rapport de bogue.
Naturellement, personne n'est parfait, et il y aura des moments
où vous serez convaincus d'avoir trouvé un bogue
dans un programme alors qu'en fait vous avez mal compris la
syntaxe d'une commande ou fait une erreur dans un fichier de
configuration (cependant cela peut en soi être significatif
d'une documentation sommaire ou d'une mauvaise gestion des erreurs
dans l'application). Il reste beaucoup de cas où la
soumission d'un rapport de bogue n'est clairement pas la bonne
ligne de conduite, et ne servira qu'à frustrer les
- développeurs et vous-même. Réciproquement, il y a
+ développeurs et vous-même. Réciproquement, il y a
des cas où il peut être approprié de
soumettre un rapport de bogue à propos de quelque chose
d'autre qu'un bogue—une amélioration ou une demande
de fonctionnalité, par exemple.
Aussi comment déterminer ce qui est un bogue et ce qui ne
l'est pas? Un principe de base simple est que votre problème
n'est pas un bogue s'il peut être
exprimé sous la forme d'une question (habituellement de la
forme “Comment puis-je faire X?” ou “Où
puis-je trouver Y?”). Ce n'est pas toujours aussi simple
que cela, mais la règle de la question couvre une
majorité de cas.
Les quelques cas où il peut être approprié
de soumettre un rapport de bogue au sujet de quelque chose qui
n'est pas un bogue sont:
demandes d'amélioration de caractéristiques.
C'est généralement une bonne idée de
discuter de cela sur les listes de diffusion avant de
soumettre un rapport de bogue.
Avis de mise à jour de logiciels maintenus à
l'extérieur (principalement des logiciels portés,
mais également des composants du système de base
maintenus à l'extérieur comme BIND ou divers
utilitaires GNU).
Une autre chose est que si le système sur lequel vous
expérimentez le bogue n'est pas suffisamment à jour,
vous devriez considérer sérieusement de mettre
à jour et d'essayer de reproduire le problème sur
un système à jour avant de soumettre le
rapport de bogue. Il y peu de choses qui ennuieront plus un
développeur que de recevoir un rapport de bogue au sujet
d'un problème déjà corrigé.
Et finalement, un bogue qui ne peut être reproduit peut
rarement être corrigé. Si le bogue se produit une
seule fois et que vous ne pouvez pas le reproduire, et qu'il ne
semble pas faire une autre victime, il y des chances qu'aucun des
développeurs ne sera en mesure de le reproduire ou de comprendre
ce qui ne va pas. Cela ne signifie pas que rien ne s'est produit,
mais plutôt que les chances que votre rapport de bogue
mène à un correctif sont très minces, et que
vous devriez envisager de laisser tomber.
Préparations
Une bonne règle à suivre est de toujours
effectuer une recherche avant de soumettre un rapport de bogue.
Peut-être que votre problème a déjà
été signalé; peut-être même qu'on en
discute actuellement sur les listes de diffusion, ou l'était
récemment; il se peut qu'il soit même déjà
corrigé dans une nouvelle version de ce que vous utilisez.
Vous devriez donc vérifier tous les lieux d'information
avant de soumettre votre rapport de bogue. Pour FreeBSD, cela
signifie:
La FAQ.
Les listes de diffusion—si vous n'êtes pas inscrit,
utilisez l'outil de recherche des archives sur le site de
FreeBSD. Si votre problème n'a pas été
abordé sur les listes, vous pourriez essayer de poster
un message à ce sujet et attendre quelques jours pour
voir si quelqu'un peut déceler quelque chose que vous
n'avez pas remarqué.
Eventuellement, l'intégralité du
web—utilisez votre moteur de recherche favoris pour
chercher toutes les références à votre
problème. Vous pouvez même obtenir des
résultats des archives des listes de diffusion ou des forums
de discussion que vous ne connaissiez pas ou parmi lesquels
vous n'aviez pas pensé chercher.
Et finalement, la base de données des PRs. A
moins que votre problème ne soit récent ou
obscure, il y a assez de chance pour qu'il soit
déjà signalé.
Ensuite, vous devez être sûr que le rapport de
bogue est envoyé aux bonnes personnes.
Le premier point ici est que si un problème est un
bogue dans un logiciel tiers (un logiciel porté ou
pré-compilé que vous avez installé), vous
devrez rapporter le bogue à l'auteur originel, et
pas au projet FreeBSD. Il y a deux exceptions à cette
règle: la première est que si le bogue
- n'apparaît pas sur d'autres plateformes, dans quel cas le
+ n'apparaît pas sur d'autres plate-formes, dans quel cas le
problème peut venir de la façon dont le logiciel a
été porté sous FreeBSD; la seconde est si
l'auteur original a déjà corrigé le
problème et sorti un correctif ou une nouvelle version de
son logiciel, et que le logiciel porté de
FreeBSD n'a pas encore été mis à jour.
Le second point est que le système de suivi des bogues de
FreeBSD classe les rapports de bogue en fonction de la
catégorie que l'auteur a choisie. Donc, si vous choisissez
la mauvaise catégorie, il y a de fortes chances qu'il
passera inaperçu pendant un moment, jusqu'à ce que
quelqu'un le re-catégorise.
Ecrire le rapport de bogue
Maintenant que vous avez décidé que votre
problème mérite un rapport de bogue, et que c'est
un problème avec FreeBSD, il est temps d'écrire
le rapport. Assurez-vous que votre variable d'environnement
VISUAL (ou EDITOR si
VISUAL n'existe pas) est configurée avec
quelque chose de pratique, et lancez &man.send-pr.1;.
Attacher des correctifs ou des fichiers
Le programme &man.send-pr.1; prévoit l'attachement de
fichiers à un rapport de bogue. Vous pouvez attacher
autant de fichiers que vous le désirez à condition
que chacun ait un nom de base unique (i.e. le nom propre du
fichier, sans le chemin). Utilisez juste l'option en ligne de
commande pour spécifier le nom des
fichiers que vous souhaitez attacher:
&prompt.user; send-pr -a /var/run/dmesg -a /tmp/errors
Ne vous inquiétez pas pour les fichiers binaires;
ils seront automatiquement encodés de façon
à ne pas déranger votre logiciel de courrier.
Si vous attachez un correctif, assurez-vous d'employer
l'option ou avec
&man.diff.1; pour créer un fichier diff unifié
ou contextuel, et soyez sûr d'indiquer les numéros
exacts des révisions CVS des fichiers que vous avez
modifiés afin que les développeurs qui
liront votre rapport soient capables d'appliquer facilement vos
correctifs.
Vous devez également prendre note à moins que
vous ne le précisiez explicitement dans votre PR, que
tous les correctifs que vous soumettez seront
présumés être sous les mêmes termes de
licence que le fichier original que vous avez modifié.
Remplir le formulaire
Le formulaire se compose d'une liste de champs, dont
certains sont déjà préremplis, et qui
peuvent avoir des commentaires expliquant leur but et la liste
des valeurs utilisables. Ne vous inquiétez pas des
commentaires; ils seront retirés automatiquement si vous
ne les modifiez ou retirez pas vous-même.
En haut du formulaire, sous les lignes
SEND-PR:, se trouvent les entêtes
d'émail. Vous n'avez normalement pas besoin de les
modifier, à moins que vous envoyiez le rapport de bogue
à partir d'une machine ou d'un compte qui peut envoyer
mais pas recevoir de courrier, dans ce cas vous voudrez remplir
les champs From: et Reply-To:
suivant votre adresse émail réelle. Vous pouvez
vouloir vous envoyer (ou à quelqu'un d'autre) une copie
carbone du rapport de bogue en ajoutant une ou plusieurs
adresses émail au champ Cc:.
Ensuite vient une série de champ à une ligne:
Submitter-Id: ne rien changer.
La valeur par défaut current-users est
correcte, même si vous utilisez FreeBSD-STABLE.
Originator: ceci est normalement
complété avec le champ gecos de l'utilisateur
actuellement attaché au système. Veuillez
indiquer votre véritable nom,
suivi optionnellement de votre émail entre les symboles
inférieur et supérieur.
Organization: comme vous le sentez.
Ce champ n'est pas employé pour quelque chose de
significatif.
Confidential: ceci est prérempli
avec no; le changer ne signifie pas grand
chose car il n'y a aucun rapport de bogue confidentiel pour
FreeBSD—la base de données des PRs est
distribuée dans le monde entier par CVSup.
Synopsis: complétez ceci
avec une description courte et précise du
problème. Le synopsis est utilisé comme sujet
du rapport de bogue, et est employé dans
les listes et résumés de rapport de bogue; les
rapports de bogue avec d'obscures sujets ont tendance à
être ignorés.
Si votre rapport de bogue inclus un correctif, veuillez
utiliser un synopsis débutant avec le mot
[PATCH].
Severity: une parmi
non-critical,
serious ou
critical. Pas de surestimation,
abstenez-vous de marquer votre problème comme
critical à moins qu'il ne le soit
vraiment (e.g. root exploit, panique du système facilement
reproductible). Les développeurs ont tendance à
ignorer ce champ et le suivant, précisément parce
que les auteurs ont tendance à surestimer l'importance
de leurs problèmes.
Priority: une parmi
low, medium ou
high. Voir ci-dessus.
Category: choisir l'une des
suivantes:
advocacy: problèmes concernant
l'image publique de FreeBSD. Rarement utilisé.
alpha: problèmes
spécifiques à la
plateforme Alpha.
bin: problèmes avec les
programmes utilisateur du système de base.
conf: problèmes avec les fichiers
de configuration, les valeurs par défaut etc...
docs: problèmes avec les pages de
manuel ou la documentation en ligne.
gnu: problèmes avec les logiciels
GNU comme &man.gcc.1; ou &man.grep.1;.
i386: problèmes
spécifiques à la
plateforme i386.
kern: problèmes avec le
noyau.
misc: tout ce qui ne va pas dans
une des autres catégories.
ports: problèmes concernant le
catalogue des logiciels portés.
sparc: problèmes
spécifiques à la
- plateforme Sparc.
+ plate-forme Sparc.
Class: choisissez une des
suivantes:
sw-bug: bogues logiciel.
doc-bug: erreurs dans la
documentation.
change-request: demande de
fonctionnalités supplémentaires ou de
changement dans
des fonctionnalités existantes.
update: mise à jour de logiciels
portés ou d'autres logiciels.
maintainer-update: mise à
jour de logiciels portés dont vous êtes le
responsable.
Release: La version de FreeBSD que
vous utilisez. Ceci sera complété
automatiquement par &man.send-pr.1; et devra être
modifié seulement si vous envoyez le rapport de
bogue à partir d'un système différent
de celui qui présente le problème.
Et enfin, il y a une série de champs à plusieurs
lignes:
Environment: Ceci devrait décrire,
le plus exactement que possible, l'environnement dans lequel
le problème a été observé. Cela
inclus la version du système d'exploitation, la version
du programme spécifique
ou fichier qui contient le problème, et tout autre
élément
important comme la configuration du système, d'autres
- logiciels qui influencent le problème, etc... —
+ logiciels qui influencent le problème, etc. —
presque tout ce dont a besoin un développeur pour
reconstruire l'environnement dans lequel le problème
apparaît.
Description: une description
complète et précise du problème que vous
expérimentez.
Essayez d'éviter de spéculer au sujet des causes
du problème à moins que vous soyez certain
d'être dans le vrai, car cela
peut tromper le développeur.
How-To-Repeat: Un résumé
des actions nécessaires pour reproduire le
problème.
Fix: De préférence un
correctif, ou au moins une solution de fortune (qui n'aidera
pas seulement les autres personnes avec le même
problème, mais peut aussi
aider un développeur à comprendre la cause du
problème),
mais si vous n'avez aucune idée pour l'un ou l'autre, il
vaut mieux laisser ce champ en blanc plutôt que de
spéculer.
Envoi du rapport de bogue
Une fois que vous avez rempli et sauvegardé le formulaire,
puis quitté votre éditeur, &man.send-pr.1; vous
proposera
s)end, e)dit or a)bort? (envoyer, éditer ou
abandonner?). Vous pouvez alors taper s
pour continuer et envoyer le rapport, e
pour relancer l'éditeur et faire d'autres modifications, ou
encore a pour abandonner. Si vous
choisissez cette dernière votre rapport de bogue restera sur le
disque (&man.send-pr.1; vous donnera le nom du fichier avant de
terminer), ainsi vous pouvez l'éditer à loisir,
ou peut-être
même le transférer sur un système avec une
meilleure connexion à
l'Internet, avant de l'envoyer avec l'option
de &man.send-pr.1;:
&prompt.user; send-pr -f ~/my-problem-report
Il lira le fichier spécifié, en validera le contenu,
retirera les commentaires et l'enverra.
Suivi
Une fois que votre rapport de bogue a été
classé, vous
recevrez une confirmation par courrier qui contiendra le
numéro de suivi qui a été assigné
à votre rapport de bogue et l'URL que vous
pouvez utiliser pour vérifier son statut. Avec un peu de chance,
quelqu'un sera intéressé par votre problème et
essaiera de s'en
occuper, ou, quand ce sera le cas, expliquera pourquoi ce n'est
pas un problème. Vous serez automatiquement prévenu
de tout changement d'état, et vous recevrez des copies de
tout commentaire
ou correctif que quelqu'un pourra attacher au suivi de votre
rapport de bogue.
Si quelqu'un vous demande des informations supplémentaires, ou
vous vous rappelez ou découvrez quelque chose que vous n'avez pas
mentionné dans le rapport initial, envoyez-le juste à
bug-followup@FreeBSD.org, en vous assurant que le
numéro de suivi est inclus dans le sujet ainsi le système
de suivi des bogues connaîtra à quel rapport de
problème l'attacher.
Si le rapport de bogue reste ouvert après que le
problème soit
corrigé, envoyez juste un courrier de suivi (de la manière
prescrite ci-dessus) disant que le rapport de bogue peut être
fermé, et, si possible, expliquant comment et quand le
problème
fut corrigé.
Lecture supplémentaire
Voici une liste des ressources concernant l'écriture et le
traitement appropriés des rapports de bogue. Cela ne veut pas
dire exhaustive.
Comment rapporter efficacement les bogues—un
excellent essai de Simon G. Tatham sur l'écriture de
rapports de bogue utiles
(non spécifique à FreeBSD).
diff --git a/fr_FR.ISO8859-1/articles/programming-tools/article.sgml b/fr_FR.ISO8859-1/articles/programming-tools/article.sgml
index 57a9e42ff3..fc2a931c4a 100755
--- a/fr_FR.ISO8859-1/articles/programming-tools/article.sgml
+++ b/fr_FR.ISO8859-1/articles/programming-tools/article.sgml
@@ -1,2001 +1,2001 @@
%man;
%urls;
%abstract;
%artheader;
%translators;
%authors;
%mailing-lists;
]>
Les outils de développement sous FreeBSD : Guide de
l'utilisateur
James
Raynard
jraynard@freebsd.org
17 Août 1997
Copyright © James Raynard, 1997.
Ce document est une introduction à l'utilisation de
quelques-uns des outils de programmation fournis avec FreeBSD,
quoique l'essentiel reste aussi valable pour de nombreuses autres
versions d'Unix. Il ne cherche pas à
expliquer en détail comment coder. La plus grande partie du
document suppose que vous n'avez aucune ou peu de notions
préalables de programmation, bien que l'on espère
que la plupart des programmeurs y trouveront quelque chose qui leur
sera utile.
&abstract.disclaimer;
&trans.a.haby;
Introduction
FreeBSD fournit un excellent environnement de développement.
Le système de base comprend des compilateurs C, C++ et Fortran,
et un assembleur, pour ne pas mentionner l'interpréteur Perl et
les outils Unix classiques comme sed et
awk. Si cela ne vous suffit pas, il y a beaucoup
d'autres compilateurs et interpréteurs au catalogue des logiciels
portés. FreeBSD est très largement compatible avec les
standards comme POSIX et ANSI C,
de même qu'avec son propre héritage BSD, il est donc
possible d'écrire des applications qui compilent et
s'exécutent sur une grande variété de
plates-formes.
Toute cette puissance, toutefois, peut submerger au premier abord,
si vous n'avez jamais auparavant écrit de programme sur une
plate-forme Unix. Ce document vise à vous aider à vous
y mettre, sans approfondir trop les questions les plus avancées.
L'intention est de vous fournir suffisamment de bases pour vous
permettre de tirer ensuite profit de la documentation.
La plus grande partie du document ne demande aucune ou peu de
connaissance de la programmation mais suppose une compétence de
base dans l'utilisation d'Unix et la volonté d'apprendre!
Introduction à la programmation
Un programme est une série d'instructions qui dit à
l'ordinateur de faire des choses diverses; l'instruction qu'il doit
exécuter dépend parfois de ce qui s'est passé
lorsqu'il a exécuté une instruction
précédente. Cette section vous donne un aperçu
des deux principales méthodes pour transmettre ces instructions,
ou “commandes” comme on les appellent. L'une est d'utiliser
un interpréteur, l'autre de se servir d'un
compilateur. Comme les langues humaines sont trop
compliquées pour être comprises sans ambiguïté
par un ordinateur, les commandes sont généralement
écrites dans l'un ou l'autre des languages spécialement
conçus à cet effet.
Interpréteurs
Dans le cas d'un interpréteur, le langage s'accompagne d'un
environnement, sous lequel vous tapez des commandes à son invite
et qui les exécute pour vous. Pour des programmes plus
compliqués, vous pouvez saisir les commandes dans un fichier
et le faire charger et exécuter les commandes qu'il contient par
l'interpréteur. Si quelque chose se passe mal, la plupart des
interpréteurs passeront le contrôle à un
débogueur pour vous aider à trouver l'origine du
problème.
Cela a l'avantage de vous permettre de voir immédiatement
le résultat de vos commandes et de corriger sur le champ vos
erreurs. Le principal inconvénient survient lorsque vous voulez
partager vos programmes avec d'autres. Il faut qu'ils aient le
même interpréteur que vous ou que vous ayez le moyen de
leur fournir cet interpréteur; il faut aussi qu'ils comprennent
comment s'en servir. Les utilisateurs peuvent aussi ne pas
apprécier de se retrouver sous un débogueur s'ils
- appuyent sur la mauvaise touche! Du point de vue de la performance,
+ appuient sur la mauvaise touche! Du point de vue de la performance,
les interpréteurs utilisent parfois beaucoup de mémoire
- et ne générent habituellement pas le code aussi
+ et ne génèrent habituellement pas le code aussi
efficacement que les compilateurs.
A mon avis, les langages interprétés sont le meilleur
moyen de débuter si vous n'avez jamais programmé
auparavant. On trouve typiquement ce genre d'environnement avec des
langages tels que Lisp, Smalltalk, Perl et Basic. On peut aussi
avancer que le shell Unix est
lui-même un interpréteur, beaucoup écrivent en fait
avec des
procédures - scripts - pour
se faciliter le travail d'administration de leur machine. De fait,
- une partie de la philosphie d'origine d'Unix était de fournir
+ une partie de la philosophie d'origine d'Unix était de fournir
nombre de petits programmes utilitaires qui puissent être
utilisés de concert dans des procédures pour effectuer
des tâches utiles.
Interpréteurs disponibles pour FreeBSD
Voici une liste des interpréteurs disponibles sous forme de
“paquetages”
FreeBSD, accompagnée d'une brève description des langages
interprétés les plus répandus.
Pour vous procurer l'un de ces “paquetages”, il vous
suffit de cliquer sur le lien correspondant et d'exécuter
ensuite:
&prompt.root; pkg_add nom_du_paquetage
sous le compte super-utilisateur root. Il faut
bien évidemment que vous ayez un système FreeBSD 2.1.0
ou ultérieur en état de marche pour que le logiciel
fonctionne.
BASIC
Abréviation pour “Beginner's
All-purpose Symbolic Instruction
Code” - code d'instructions
symbolique universel pour les débutants.
Développé dans les années 50 pour apprendre
la programmation aux étudiants des Universités et
fourni avec tout ordinateur personnel qui se respectait dans les
années 80, BASIC a été le
premier langage pour de nombreux programmeurs. C'est aussi la base
de Visual Basic.
L'interpréteur
Basic Bywater et
l'interpréteur
Basic de Phil Cockroft (appelé auparavant
“Rabbit Basic”) sont disponibles sous forme de
“paquetages”
FreeBSD.
Lisp
Un langage développé à la fin des
années 1950 comme alternative aux langages
“dévoreurs de nombres” qui e´taient
populaires à l'époque. Au lieu d'être
basé sur les nombres, Lisp repose sur les listes; de fait,
son nom est une abréviation pour “List
Processing” - traitement de
- listes. Trés répandu dans les milieux de l'IA
+ listes. Très répandu dans les milieux de l'IA
(Intelligence Artificielle).
Lisp est un langage très puissant et
sophistiqué, mais peut être assez lourd et
bavard.
FreeBSD dispose de
GNU
Common Lisp sous forme de “paquetage”.
Perl
Très employé par les administrateurs
système pour écrire des procédures; et
souvent aussi sur les serveurs World Wide
Web pour écrire des procédures
CGI.
La Version 4, qui est probablement encore la version la plus
largement répandue est fournie avec FreeBSD; le plus
récent
Perl
Version 5 est disponible sous forme de
“paquetage”.
Scheme
Un dialecte de Lisp qui est plutôt plus compact et plus
propre que Common Lisp. Courant dans les Universités parce
qu'il est assez facile à enseigner en premier cycle comme
langage d'initiation et présente un niveau d'abstraction
suffisant pour être utilisé pour du travail de
recherche.
FreeBSD offre en “paquetages”
l'Interpréteur
Scheme Elk,
l'Interpréteur Scheme du MIT et
l'Interpréteur
Scheme SCM.
Icon
Le
langage de programmation Icon.
Logo
L'interpréteur
LOGO de Brian Harvey.
Python
Le
langage de programmation orienté objet Python.
Compilateurs
Les compilateurs sont assez différents. Vous écrivez
d'abord votre code dans un(des) fichiers(s) à l'aide d'un
éditeur. Vous exécutez ensuite le compilateur et voyez
s'il valide votre programme. S'il ne le compile pas, serrez les dents et
retournez sous l'éditeur. S'il le compile et vous en fait un
programme, vous pouvez l'utiliser soit à l'invite de
l'interpréteur de commande, soit en vous servant d'un
débogueur pour voir s'il fonctionne
correctementDans
le cas contraire, si vous l'exécutez sur la ligne de commande, il
peut éventuellement
planter - “core
dump”..
Ce n'est évidemment pas aussi immédiat que de se
servir d'un interpréteur. Cela vous permet cependant de faire
beaucoup de choses qui sont très difficiles ou même
irréalisables avec un interpréteur, comme écrire
du code qui interagisse étroitement avec le système
d'exploitation - ou même écrire votre propre
système d'exploitation! C'est aussi utile si vous avez besoin
d'écrire du code très efficace, parce que le compilateur
peut prendre son temps et optimiser le code, ce qui ne serait pas
acceptable d'un interpréteur. Distribuer un programme
écrit pour un compilateur est généralement plus
facile - il suffit de livrer une copie de l'exécutable,
en supposant que les destinataires aient le même système
d'exploitation que vous.
Les langages compilés incluent Pascal, C et C++. C et C++
sont des langages qui pardonnent assez peu, et plus adaptés aux
programmeurs plus expérimentés. Pascal, d'un autre
côté, a été conçu pour l'enseignement,
et est un assez bon langage avec lequel commencer. Malheureusement,
FreeBSD n'a aucun support pour Pascal, à l'exception d'un
convertisseur de Pascal en C, au catalogue des logiciels
portés.
Comme le cycle
“édition-compilation-exécution-débogage”
est assez fastidieux, de nombreux fournisseurs de compilateurs
commerciaux
ont produit des Environnements de Développement
Intégrés (EDI en abrégé).
FreeBSD ne dispose pas d'EDI en tant que tel; il est
cependant possible d'utiliser Emacs à cet effet. C'est
expliqué à la section Utiliser
Emacs comme environnement de développement.
Compiler avec cc
Cette section ne s'occupe que du compilateur GNU pour C et C++, qui
est fourni de base avec le système FreeBSD. Il peut être
appelé soit avec la commande cc, soit avec
gcc. Les détails de la réalisation
d'un programme avec un interpréteur varient considérablement
d'un interpréteur à l'autre, est sont
généralement bien décrits par l'aide en ligne de
l'interpréteur.
Une fois que vous avez écrit votre chef-d'oeuvre,
l'étape suivante consiste à le convertir en quelque chose
qui (espérons-le!) s'exécutera sous FreeBSD. Cela demande
habituellement plusieurs opérations successives, dont chacune est
confiée à un programme différent.
Pré-processer votre code source pour en éliminer les
commentaires et faire diverses autres choses, comme la substitution
des macros-instructions en C.
Vérifier la syntaxe de votre code pour s'assurer que vous
avez respecté les règles du langage. Si ce n'est pas le
cas, il rouspétera.
Convertir le code source en langage
assembleur - c'est très proche du code machine, mais
encore compréhensible par des êtres humains. C'est du
moins ce que l'on prétendPour être
rigoureusement exact, cc convertit le code source
en un P-code qui lui est propre, et ne
dépend pas de la machine, et non en assembleur à ce
stade..
Convertir le langage assembleur en code machine - oui,
nous parlons ici de bits et d'octets, de zéros et de
uns.
Vérifier que vous avez utilisé de façon
cohérente les fonctions et les variables globales. Si, par
exemple, vous avez appelé une fonction qui n'existe pas, il
s'en plaindra.
Si vous essayez de générer un programme à
partir de plusieurs fichiers de source, faire ce qu'il faut pour
les regrouper.
S'arranger pour produire quelque chose que le chargeur de
programmes du système pourra mettre en mémoire et
exécuter.
Le mot compiler est souvent utilisé pour
ne désigner que les étapes 1 à 4 - les
autres sont appelées édition de
liens. L'étape 1 est parfois appelée
pré-processer et les étapes 3-4
assembler.
Heureusement, pratiquement tous ces détails vous sont
transparents, car la commande cc est une interface
qui gère pour vous l'appel de ces différents programmes
avec les bons arguments; taper simplement:
&prompt.user; cc foobar.c
effectue la compilation de foobar.c en passant
par toutes les étapes décrites ci-dessus. Si vous avez
à compiler plus d'un fichier, faites simplement quelque chose
comme:
&prompt.user; cc foo.c bar.c>
Notez que la vérification syntaxique ne consiste qu'en cela:
vérifier la syntaxe. Il n'y aura pas de contrôle sur les
erreurs logiques que vous auriez commises, comme faire exécuter
au programme une boucle infinie ou utiliser un tri à bulles au lieu
d'un tri par arbre binaireAu cas où vous ne le
sauriez pas, un tri par arbre binaire est une manière efficace
d'ordonner des données, ce qui n'est pas le cas du tri
à bulles..
cc dispose d'une quantité d'options, qui
sont toutes décrites dans les pages de manuel. En voici
quelques-unes des plus importantes, et la façon de les
utiliser.
Le nom du fichier résultat. Si vous n'utilisez pas cette
option, cc générera un
exécutable appelé
a.outLes raisons de cela se
sont perdues dans les brumes de
l'histoire..
&prompt.user; cc foobar.c l'exécutable est a.out
&prompt.user; cc -o foobar foobar.c l'exécutable est foobar
Uniquement compiler le fichier, ne pas faire l'édition de
liens. Utile pour des programmes d'essai, quand vous voulez
simplement vérifier la syntaxe, ou si vous vous servez d'un
Makefile.
&prompt.user; cc -c foobar.c
Cela générera un fichier
objet (et non un exécutable) appelé
foobar.o. Il pourra être lié avec
d'autres fichiers objet pour constituer un exécutable.
Crée une version débogable de l'exécutable
Le compilateur inclut alors dans l'exécutable des
informations de correspondance entre les numéros de ligne du
fichier source et les fonctions appelées. Un débogueur
peut alors utiliser ces informations pour vous afficher le code
source tandis que vous exécutez pas à pas le
programme, ce qui est très utile;
l'inconvénient est que toutes ces informations augmentent
considérablement la taille du programme. Normalement, vous
compilez avec quand vous développez le
programme, et compilez ensuite une “version de
livraison” quand vous êtes satisfait parce qu'il
fonctionne correctement.
&prompt.user; cc -g foobar.c
Cela produira une version débogable du
programmeRemarquez que nous n'avons pas
utilisé l'indicateur pour préciser
- le nom de l'exécutable, celui-ci s'appelera donc
+ le nom de l'exécutable, celui-ci s'appellera donc
a.out. Générer une version
débogable appelée foobar est
laissé à titre d'exercice aux soins du
lecteur!.
Génère une version optimisée de
l'exécutable. Le compilateur effectue alors diverses
opérations bien pensées pour essayer de construire
un programme qui aille plus vite que normalement. Vous pouvez
faire suivre d'un nombre pour demander un
degré plus important d'optimisation, mais cela met souvent
en évidence des bogues dans l'optimiseur du compilateur.
Par exemple, on sait que la version de cc de
FreeBSD 2.1.0 produit du code incorrect avec l'option
dans certaines circonstances.
On n'active en général l'optimisation
qu'à la compilation de la version de livraison.
&prompt.user; cc -O -o foobar foobar.c
Cela construira une version optimisée de
foobar.
Les trois indicateurs suivants demanderont à
cc de vérifier que votre code est conforme
à la norme internationale, souvent appelée norme
ANSI, bien que ce soit à proprement parler
une norme ISO.
Active tous les messages d'avertissement que les auteurs du
compilateur cc ont jugés
intéressants. Malgré son nom
(“all” - tous),
cela n'active pas tous les messages d'avertissement dont le
compilateur est capable.
Désactive la plupart, mais pas toutes, les
possibilités non-ANSI> C fournies par
cc. Malgré son nom, cela ne garantit pas
absolument que votre code soit conforme à la norme.
Désactive toutes les
possibilités non-ANSI> C de
cc.
Sans ces indicateurs, cc vous permet d'utiliser
ses extensions non-standard de la norme. Quelques-unes sont très
utiles, mais ne se retrouveront pas sur d'autres
compilateurs - de fait, l'un des objectifs principaux de la
norme est de permettre l'écriture de code qui puissent être
réutilisé avec n'importe quel compilateur sur n'importe
quel système. C'est cela que l'on appelle du code
portable.
En général, vous devriez vous efforcer de rendre votre
code aussi portable que possible, sans quoi vous risquez de devoir
- réécrire entièrement votre programme par la suite
+ récrire entièrement votre programme par la suite
pour qu'il fonctionne ailleurs - et qui peut dire ce que vous
utiliserez dans quelques années?
&prompt.user; cc -Wall -ansi -pedantic -o foobar foobar.c
Cela générera un exécutable
foobar après avoir vérifié que
foobar.c respecte la norme.
Définit une bibliothèque de fonctions à
utiliser pour l'édition de liens.
L'exemple le plus courant est la compilation d'un programme
qui utilise certaines des fonctions mathématiques de C. A
l'inverse de la plupart des autres plates-formes, ces fonctions
sont dans une bibliothèque différente de la
bibliothèque C standard et vous devez préciser au
compilateur qu'il doit l'utiliser.
La règle est que si la bibliothèque s'appelle
libquelque_chose.a,
vous donnez à cc l'argument
. Par
exemple, la bibliothèque mathématique s'appelle
libm.a, vous donnez donc à
cc l'argument . Un
détail à connaître à propos de la
bibliothèque mathématique est que ce doit
généralement être la dernière sur
la ligne de commande.
&prompt.user; cc -o foobar foobar.c -lm
Cela ajoutera à l'édition de liens de
foobar des fonctions de la
bibliothèque mathématique.
Si vous compilez du code C++, vous devrez ajouter
, ou si vous
utilisez la version 2.2 de FreeBSD ou une version
ultérieure, à la ligne de commande pour
éditer les liens avec les fonctions de la
bibliothèque C++. Au lieu de cela, vous pouvez utiliser la
commande c++ au lieu de cc,
qui fera la même chose à votre place. Sous FreeBSD,
- c++ peut aussi être appellé avec
+ c++ peut aussi être appelé avec
g++.
&prompt.user; cc -o foobar foobar.cc -lg++ Avec FreeBSD 2.1.6 et antérieurs
&prompt.user; cc -o foobar foobar.cc -lstdc++ Avec FreeBSD 2.2 et ultérieurs
&prompt.user; c++ -o foobar foobar.cc
Chacun de ces exemples construira un exécutable
foobar à partir du fichier source C++
foobar.cc. Remarquez que, sur les
systèmes Unix, les fichiers sources C++ ont
traditionnellement l'extension .C,
.cxx ou .cc,
plutôt que l'extension .cpp
de sytle MS-DOS (qui est déjà
utilisée pour autre chose). gcc se
fiait autrefois à l'extension pour savoir quel type de
compilateur utiliser avec le fichier source, mais cette
restriction ne s'applique plus, vous pouvez donc appeler vos
fichiers C++ .cpp en toute
impunité!
Questions et problèmes cc
Q. J'essaie d'écrire un programme qui utilise la fonction
sin() et j'obtiens une erreur qui ressemble
à ce qui suit. Qu'est-ce que cela veut dire?
/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
R. Quand vous utilisez des fonctions mathématiques telles
que sin(), vous devez dire à
cc d'inclure la bibliothèque
mathématique à l'édition de liens, comme ceci:
&prompt.user; cc -o foobar foobar.c -lm
Q. D'accord, j'ai écrit ce petit programme pour
m'entraîner à utiliser . Il ne fait
que calculer 2.1 à la puissance 6:
#include <stdio.h>
int main() {
float f;
f = pow(2.1, 6);
printf("2.1 ^ 6 = %f\n", f);
return 0;
}
et l'ai compilé comme ceci:
&prompt.user; cc temp.c -lm
comme vous avez dit qu'il fallait le faire, mais voilà ce que
j'obtiens à l'exécution:
&prompt.user; ./a.out
2.1 ^ 6 = 1023.000000
Ce n'est pas la bonne réponse! Que se
passe-t-il?
R. Quand le compilateur voit que vous appelez une fonction, il
regarde s'il en a déjà vu un prototype. Si ce n'est pas
le cas, il suppose que la fonction retourne un
int - entier, ce
qui n'est évidemment pas ce que vous souhaitez dans ce
cas.
Q. Comment alors régler ce problème?
R. Les prototypes des fonctions mathématiques sont dans
math.h. Si vous incluez ce fichier, le
compilateur trouvera le prototype et cessera de vous fournir un
résultat bizarre!
#include <math.h>
#include <stdio.h>
int main() {
...
Après l'avoir recompilé de la même
façon qu'auparavant, exécutez-le:
&prompt.user; ./a.out
2.1 ^ 6 = 85.766121
Si vous utilisez la moindre fonction mathématique, incluez
toujours math.h et n'oubliez
pas d'utiliser la bibliothèque mathématique à
l'édition de liens.
Q. J'ai compilé un fichier appelé
foobar.c et je ne trouve pas d'exécutable
appelé foobar. Où est-il
passé?
- R. N'oubliez pas, cc appelera
+ R. N'oubliez pas, cc appellera
l'exécutable a.out à moins que vous
ne lui disiez de faire autrement. Utilisez l'option
:
&prompt.user; cc -o foobar foobar.c
Q. OK, si j'ai un exécutable appelé
foobar, je le vois avec ls,
mais quand je tape foobar sur la ligne de commande,
il me dit que le fichier n'existe pas. Pourquoi ne le trouve-t-il
pas?
R. A l'inverse de MS-DOS, Unix ne regarde
pas dans le répertoire courant quand il cherche le programme
que vous voulez exécuter, à moins que vous ne le lui
disiez. Soit tapez ./foobar, ce qui veut dire
“exécuter le fichier appelé
foobar du répertoire courant”, ou
modifiez votre variable d'environnement
PATH pour qu'elle ressemble
à:
bin:/usr/bin:/usr/local/bin:.
Le dernier point signifie “chercher dans le répertoire
courant si le fichier n'est pas dans les autres
répertoires”.
Q. J'ai appelé mon exécutable
test, mais il ne se passe rien quand je le
lance. Pourquoi?
R. Il y a un programme appelé test dans
/usr/bin sur la plupart des systèmes Unix
et c'est celui-là que trouve l'interpréteur de commandes
avant de regarder dans le répertoire courant. Soit tapez:
&prompt.user; ./test
ou choisissez un meilleur nom pour votre programme!
Q. J'ai compilé et tout a commencé à
fonctionner correctement, puis il y a eu une erreur et il m'a dit
quelque chose à propos de core dumped.
Qu'est-ce que cela veut dire?
A. L'expression core dump date des tous
premiers jours d'Unix, quand les machines utilisaient la
mémoire
centrale - “core memory”
pour stocker les informations. Essentiellement, si le programme
“plantait” dans certaines conditions, le système
enregistrait sur disque le contenu de la mémoire centrale
dans un fichier appelé core, que le
programmeur pouvait ensuite disséquer pour trouver
où les choses avaient mal tournées.
Q. Fascinant, mais que suis-je censé faire
maintenant?
A. Servez-vous de gdb pour analyser l'image
mémoire (Reportez-vous à la section
Déboguer).
R. Quand mon programme a généré une image
mémoire, il a dit quelque chose à propose de
segmentation fault - “erreur
de segmentation”. Qu'est-ce que c'est?
Q. Cela signifie essentiellement que votre programme a
essayé d'effectuer une quelconque opération
illégale sur la mémoire; Unix est conçu pour
protéger le système d'exploitation des programmes
mal éduqués.
Les raisons les plus courantes en sont:
Essayer d'écrire en mémoire adressée par
un pointeur NULL, e.g.:
char *foo = NULL;
strcpy(foo, "bang!");
Utiliser un pointeur qui n'a pas été
initialisé, e.g.:
char *foo;
strcpy(foo, "bang!");
Le pointeur aura une valeur aléatoire qui, avec de la
chance, adressera une zone mémoire non accessible à
votre programme, de sorte que le noyau tuera ce dernier avant
- qu'il ne provoque de dégat. Si vous manquez de chance,
+ qu'il ne provoque de dégât. Si vous manquez de chance,
il pointera quelque part à l'intérieur de votre
programme et endommagera l'une de vos structures de
données, provoquant un dysfonctionnement mystérieux
de votre programme.
Tenter d'accéder au-delà du dernier
élément d'un tableau, e.g.:
int bar[20];
bar[27] = 6;
Essayer d'enregistrer quelque chose dans une zone de
mémoire accessible en lecture seule, e.g.:
char *foo = "Mon texte";
strcpy(foo, "bang!");
Les compilateurs Unix stockent souvent les chaînes de
caractères constantes comme "Mon texte"
en mémoire accessible en lecture seule.
Utiliser incorrectement les fonctions
malloc() et free(),
e.g.:
char bar[80];
free(bar);
ou:
char *foo = malloc(27);
free(foo);
free(foo);
Commettre l'une de ces fautes ne provoquera pas toujours une erreur,
mais ce sont malgré tout des choses à ne pas faire.
Certains systèmes et compilateurs sont plus tolérants que
d'autres, ce qui fait que des programmes qui s'exécutent
correctement sur un système peuvent ne plus fonctionner sur un
autre.
Q. Parfois, le programme provoque la génération d'une
image mémoire avec le message bus error.
Mon manuel Unix dit qu'il s'agit d'un erreur matériel, mais
l'ordinateur fonctionne apparemment correctement. Est-ce vrai?
R. Fort heureusement, non (à moins bien sûr que vous
n'ayez aussi un problème matériel). C'est habituellement
une autre façon de dire que vous avez accédé
incorrectement à la mémoire.
Q. Il me semble que cette histoire de core
dump peut être très utile, si je peux la
provoquer quand je veux. Est-ce possible, ou dois-je attendre qu'il se
produise une erreur?
R. Oui, allez simplement sur une autre console ou fenêtre
xterm et tapez:
&prompt.user; ps pour
connaître l'IDentifiant de processus de votre programme, puis:
&prompt.user; kill -ABRT pid
où pid est
l'ID de processus que vous avez recherché.
C'est par exemple utile si votre programme est parti dans une boucle
infinie. Au cas où votre programme piégerait les
interruptions SIGABRT, il y a plusieurs autres signaux
qui auront le même effet.
Make
Qu'est-ce que make?
Lorsque vous travaillez sur un programme simple avec seulement un
ou deux fichiers de source, taper:
&prompt.user; cc fichier1.c fichier2.c
n'est pas trop gênant, mais cela devient rapidement très
fastidieux lorsqu'il y a plusieurs fichiers - et cela peut
aussi mettre du temps à compiler.
Un façon d'éviter ces problèmes est
d'utiliser des fichiers objets et de ne
recompiler que les fichiers de source dont le contenu a changé.
Nous pourrions alors avoir quelque chose du style:
&prompt.user; cc fichier1.o fichier2.o … file37.c &hellip
si nous avons modifé fichier37.c, et
celui-là uniquement, depuis notre compilation
précédente. Cela peut sérieusement
- accélérer la compilation, mais ne résoud pas le
+ accélérer la compilation, mais ne résout pas le
problème de saisie à répétition de la
commande.
Nous pourrions aussi écrire une procédure pour
résoudre ce dernier problème, mais ne ne pourrions alors
que lui faire tout recompiler, ce qui serait très peu efficace
sur un gros projet.
Que ce passe-t-il si nous avons des centaines de fichiers de
sources? Si nous travaillons en équipe et que d'autres
oublient de nous prévenir des modifications qu'ils ont
apportées à un des fichiers que nous utilisons?
Peut-être pourrions-nous rassembler les deux solutions et
écrire quelque chose qui ressemble à une
procédure et comporte une sorte de règle magique
qui dise quand tel fichier de source doit être compilé.
Nous n'aurions plus besoin que d'un programme qui comprennent ces
règles, parce que c'est un peu trop compliqué pour une
procédure.
Ce programme s'appelle make. Il lit un fichier,
qu'on appelle un makefile, qui lui dit quelles
sont les dépendances entre les différents fichiers, et
en déduit lesquels ont besoin ou non d'être
recompilés. Par exemple, une règle peut signifier
quelque chose comme “si fromboz.o est plus
ancien que fromboz.c, cela veut dire que
fromboz.c doit avoir été
modifié, il faut donc le recompiler”. Le fichier
“makefile” inclut aussi
des règles qui lui disent comment
recompiler, ce qui en fait un outil encore plus puissant.
Ces fichiers “makefiles” sont habituellement
rangés dans le même répertoire que les sources
auxquels ils s'appliquent, et peuvent être appelés
makefile, Makefile ou
MAKEFILE. La plupart des programmeurs utilisent
le nom Makefile, ce qui fait qu'ils se trouvent
alors vers le début de la liste des fichiers et sont ainsi
facilement repérables Ils n'utilisent pas la
variante MAKEFILE parce que les noms en
majuscules servent souvent à désigner les fichiers de
documentation comme
README..
Exemple d'utilisation de make
Voici un fichier Makefile
élémentaire :
foo: foo.c
cc -o foo foo.c
Il contient deux lignes, une pour la dépendance et une
pour la génération.
La ligne décrivant la dépendance contient le
nom du programme (qu'on appelle la cible),
suivi de “deux points”, puis d'un blanc et du nom
du fichier source. Quand make lit cette ligne,
il regarde si foo existe; s'il existe, il
compare la date de dernière modification de
foo à celle de dernière
modification de foo.c. Si
foo n'existe pas, ou s'il est antérieur
à foo.c, il regarde alors la ligne de
génération pour savoir ce qu'il faut faire. En
d'autres termes, c'est la règle à appliquer pour
savoir si foo.c doit être
recompilé.
La ligne de génération commence par une
tabulation (appuyez sur la touche
Tab) suivie de la commande que vous taperiez
pour compiler foo si vous le faisiez sur
la ligne de commande. Si foo n'est pas
à jour ou s'il n'existe pas, make
exécute alors cette commande pour le créer. En
d'autres termes, c'est la règle qui dit à
make comment recompiler
foo.c.
Ainsi, quand vous tapez make, il
fera en sorte que foo soit en phase avec les
dernières modifications que vous avez apportées à
foo.c. Ce principe s'étend aux
Makefiles avec des centaines de
cibles - de fait, sur FreeBSD, il est possible de compiler
tout le système d'exploitation en tapant simplement
make world dans le répertoire
adéquat!
Une autre particularité de Makefiles
est que les cibles ne sont pas nécessairement des programmes.
Nous pourrions par exemple avoir le Makefile
suivant:
foo: foo.c
cc -o foo foo.c
install:
cp foo /home/me
Nous pouvons dire à make quelle cible
nous voulons atteindre en tapant:
&prompt.user; make cible
make examinera alors cette cible et ignorera
toutes les autres. Par exemple, si, avec le
Makefile précédent, nous tapons
make foo, make ignorera
la cible install.
Si nous tapons simplement make tout
court, il examinera toujours la première cible et
s'arrêtera ensuite sans s'occuper des autres. Si nous
avions tapé make dans ce cas, il
serait simplement allé à la cible
foo, aurait recompilé
foo si nécessaire, et se serait
arrêté sans passer à la cible
install.
Remarquez que la cible install ne dépend
en fait de rien du tout! Cela signifie que la commande sur la ligne
suivante est toujours exécutée si nous essayons de
reconstruire cette cible en tapant
make install. Dans ce cas, il copiera
foo dans le répertoire de l'utilisateur.
C'est souvent utilisé par les Makefiles
de logiciels, de sorte que l'application soit installée dans
le bon répertoire, une fois correctement
compilée.
C'est un point un peu délicat à expliquer. Si vous
ne comprenez pas exactement comment make
fonctionne, la meilleure chose à faire est d'écrire
un programme simple comme le classique “Bonjour, le
monde!”, un fichier Makefile et de
faire des essais. Compilez ensuite en utilisant plus d'un
fichier source, ou en ayant un fichier source qui inclut un
fichier d'en-tête. La commande touch
vous sera très utile - elle modifie la date
d'un fichier sans que vous ayez à l'éditer.
Makefiles FreeBSD
L'écriture de Makefiles peut
- être assez compliquée. Heurusement, les systèmes
+ être assez compliquée. Heureusement, les systèmes
basés sur BSD, comme FreeBSD, en fournissent de très
puissants, intégrés au système. Le catalogue des
logiciels portés de FreeBSD en est un excellent exemple. Voici
l'essentiel d'un de leurs Makefiles typiques:
MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
.include <bsd.port.mk>
Si nous allons maintenant dans le répertoire associé
à ce logiciel et tapons make, voici ce
qui se passe:
Il regarde si le code source de ce logiciel est
déjà présent sur le système.
S'il n'y est pas, une connexion FTP à l'URL
indiquée par MASTER_SITES est
établie pour télécharger le source.
La somme de contrôle est calculée sur le source et
comparée à celle calculée sur une version
connue et validée. Cela pour s'assurer que le source n'a
pas été corrompu pendant le transfert.
Les modifications nécessaires pour que le code
fonctionne sous FreeBSD sont appliquées - c'est
ce que l'on appelle patcher.
Les opérations particulières de configuration
du source sont effectuées. (De nombreuses distributions de
programmes Unix essayent de déterminer sur quel
système elles sont compilées et de quelles
fonctionnalités Unix optionnelles il
dispose - c'est à ce stade du scénario
d'installation de logiciels sous FreeBSD que leur sont fournies
ces informations).
Le code source du programme est compilé. De fait, on
passe dans le répertoire où le code a
été décompacté et
make y est exécuté - le
Makefile du programme lui-même contient
les informations nécessaires à sa
compilation.
Nous disposons maintenant d'une version compilée du
programme. Si nous le voulons, nous pouvons maintenant la tester;
si nous avons confiance dans le programme, nous pouvons taper
make install. Cela recopiera le programme
et tous les fichiers d'environnement dont il a besoin à
l'endroit adéquat; une entrée sera aussi
créée dans une base de données des
logiciels, de façon à ce qu'il puisse
être désinstallé par la suite, si nous
changeons d'avis.
Je pense que vous serez maintenant d'accord pour trouver que c'est
assez impressionnant pour une simple procédure de quatre
lignes!
Le secret se trouve à la dernière ligne, qui dit
à make d'aller voir ce qu'il y a dans le
Makefile appelé
bsd.port.mk. Il est facile de rater cette ligne,
mais c'est pourtant de là que vient toute la mécanique
subtile. Quelqu'un a écrit un Makefile
qui dit à make de faire tout ce qui a
été décrit ci-dessus (plus deux ou trois autres
choses dont je n'ai pas parlé, dont le traitement des erreurs
qui pourraient se produire) et tout le monde peut l'utiliser en
mettant simplement cette unique ligne dans son propre
Makefile!
Si vous voulez jeter un oeil à ces
Makefiles systèmes, ils sont dans le
répertoire /usr/share/mk, mais il vaut
mieux attendre d'avoir un peu d'expérience des
Makefiles, parce qu'ils sont très
compliqués (et si vous les regardez, ayez sous la main
une bonne dose de café serré!).
Utilisation plus poussée de make
make est un outil très puissant, et peut
faire beaucoup plus que l'exemple élémentaire que nous
avons donné. Il y a malheureusement plusieurs versions de
make, et elles sont très
différentes. La meilleure façon de savoir ce qu'elles
peuvent faire est certainement de lire la
documentation - espérons que cette introduction
vous aura fourni les bases pour le faire.
La version de make fournie avec FreeBSD est
Berkeley make; elle s'accompagne d'un guide
dans /usr/share/doc/psd/12.make. Pour le
visualiser, tapez:
&prompt.user; zmore paper.ascii.gz
dans ce répertoire.
Il y a des nombreux logiciels du catalogue des logiciels
portés qui utilisent GNU make, qui
est très bien documenté dans les pages
“info”. Si vous avez installé un de ces logiciels,
GNU make sera automatiquement installé
sont le nom gmake. Il est aussi disponible sous forme
de logiciel porté ou précompilé autonome.
Pour visualiser les pages “info” de
GNU make, il vous faut éditer le
fichier dir du répertoire
/usr/local/info et y ajouter une ligne pour ce
programme. C'est une ligne du genre:
* Make: (make). L'utilitaire GNU Make.
Une fois que c'est fait, vous pouvez taper info
puis sélectionner make dans le menu
(ou sous Emacs, taper C-h
i).
Déboguer
Le débogueur
Le débogueur qui est fourni avec FreeBSD s'appelle
gdb
(GNU débogueur). Vous le lancez en
tapant:
&prompt.user; gdb nom_du_programme
bien que la plupart des gens préfèrent l'exécuter
sous Emacs. Ce qui se fait avec:
M-x gdb RET progname RET
Se servir d'un débogueur vous permet d'exécuter le
programme sous contrôle. Vous pouvez typiquement
l'exécuter pas à pas, inspecter les valeurs des
variables, les modifier, dire au débogueur d'exécuter
le programme jusqu'à un certain endroit et de s'y
arrêter, et ainsi de suite. Vous pouvez même
le rattacher à un programme qui est déjà en
cours d'exécution, ou charger une image
mémoire - “core”.
Il est même possible de déboguer le noyau, bien que cela
soit un peu plus compliqué que dans le cas des programmes
utilisateurs, dont nous parlerons dans cette section.
gdb dispose d'une assez bonne aide en ligne,
ainsi que d'un jeu de pages “info”, cette section se
concentrera donc sur quelques commandes de base.
Enfin, si le mode de fonctionnement en ligne de commande vous
rebute, il existe une interface graphique appelée
xxgdb
au catalogue des logiciels portés.
Cette section est destinée à servir d'introduction
à l'utilisation du débogueur et ne couvre pas les
questions spécialisées comme le débogage du
noyau.
Exécuter un programme sous le débogueur
Il faudra que vous ayez compilé le programme avec l'option
pour tirer le meilleur parti de
gdb. Cela fonctionnera sans cela, mais vous ne
verrez que le nom de la fonction dans laquelle vous êtes, au
lieu du code source. Si vous avez un message du genre:
… (no debugging symbols found) …
au démarrage de gdb, vous saurez que le
programme n'a pas été compilé avec l'option
.
A l'invite de gdb, tapez break
main. Cela dira au débogueur d'exécuter le
code préliminaire de mise en oeuvre dans le programme et de
s'arrêter au début de votre programme. Tapez maintenant
run pour lancer le programme - il
commencera au début du code préliminaire et sera
interrompu par le débogueur sur l'appel de
main(). (Si vous vous étiez jamais
demandé d'où la fonction main()
était appelée, vous le savez maintenant!).
Vous pouvez maintenant exécuter le programme une ligne
à la fois, en appuyant sur n. Si
vous arrivez sur un appel de fonction, vous pouvez passer dans la
fonction en appuyant sur s. Une fois dans la
fonction, vous pouvez terminer son exécution et en sortir en
tapant f. Vous pouvez aussi utiliser
up et down pour jeter un
coup d'oeil au code appelant.
Voici un exemple simple de la manière de diagnostiquer une
erreur dans un programme avec gdb. Voici notre
programme (intentionnellement faux):
#include <stdio.h>
int bazz(int un_entier);
main() {
int i;
printf("C'est mon programme\n");
bazz(i);
return 0;
}
int bazz(int un_entier) {
printf("Vous m'avez donné %d\n", un_entier);
return un_entier;
}
Ce programme affecte à i la valeur
5 et la passe à la fonction
bazz() qui affiche la valeur que nous lui
donnons en paramètre.
Quand nous compilons et exécutons le programme, nous
obtenons:
&prompt.user; cc -g -o temp temp.c
&prompt.user; ./temp
C'est mon programme
Vous m'avez donné 4231
Ce n'est pas ce à quoi nous nous attendions! C'est le
moment d'aller voir ce qui ce passe!
&prompt.user; gdb temp
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) break main Exécuter le code d'initialisation
Breakpoint 1 at 0x160f: file temp.c, line 9. gdb met un pont d'arrêt à l'appel de main()
(gdb) run Exécuter jusqu'à main()
Starting program: /home/james/tmp/temp Le programme démarre
Breakpoint 1, main () at temp.c:9 gdb s'arrête à main()
(gdb) n Aller à la ligne suivante
C'est mon programme Le programme imprime
(gdb) s Aller dans bazz()
bazz (un_entier=4231) at temp.c:17 gdb affiche la position dans la pile d'appel
(gdb)
Une minute! Comment un_entier peut-il valoir
4231? Ne l'avons-nous pas initialisé
à 5 dans main()?
Revenons à main() et jetons un
oeil.
(gdb) up Remonter d'un cran dans la pile d'appel
#1 0x1625 in main () at temp.c:11 gdb affiche la position dans la pile d'appel
(gdb) p i Afficher la valeur de i
$1 = 4231 gdb affiche 4231
Et oui! Si nous regardons le code, nous avons oublié
d'initialiser i. Nous voulions mettre:
…
main() {
int i;
i = 5;
printf("C'est mon programme\n");
&hellip
mais nous avons oublié la ligne i=5;.
Comme nous n'avons pas initialisé i, il
prend la valeur qui se trouve à cet endroit de la
mémoire quand le programme s'exécute, dans notre
cas, il s'est trouvé que c'était
4231.
gdb affiche l'endroit où nous nous
trouvons dans la pile d'appel, chaque fois que nous entrons ou
sortons d'une fonction, même si nous utilisons
up et down pour nous
déplacer dans la pile. Cela nous donne le nom de la fonction
et les valeurs de ses paramètres, ce qui nous aide à
repérer où nous sommes et ce qu'il se passe. (La pile
d'appel est une zone de mémoire où le programme
enregistre les informations sur les paramètres passés
aux fonctions et où aller quand il ressort d'un fonction
appelée.)
Examiner un fichier
“core”
Un fichier “core” est
essentiellement un fichier qui contient l'état complet du
programme au moment où il s'est “planté”. Au
“bon vieux temps”, les programmeurs devaient imprimer le
contenu en hexadécimal des fichiers
“core” et transpirer sur des
manuels de code machine, mais la vie est aujourd'hui un peu plus facile.
Au passage, sous FreeBSD et les autres systèmes 4.4BSD, un
fichier “core” s'appelle
nom_du_programme.core,
et non core tout court,
de façon à ce que l'on sache à quel programme il
correspond.
Pour examiner un fichier
“core”, lancez
gdb comme d'habitude. Au lieu de taper
break ou run, tapez:
(gdb) core nom_du_programme.core
Si vous n'êtes pas dans le même répertoire que
le fichier “core”, vous
devrez d'abord faire
dir /ou/se/trouve/le/fichier/core.
Vous devriez voir quelque chose comme:
&prompt.user; gdb a.out
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Cannot access memory at address 0x7020796d.
#0 0x164a in bazz (un_entier=0x5) at temp.c:17
(gdb)
Dans ce cas, le programme s'appelait a.out, le
fichier “core” s'appelle
donc a.out.core. Nous constatons que le programme
s'est terminé en erreur à cause d'une tentative
d'accès à une zone de mémoire qui n'était
pas accessible dans une fonction appelé
bazz.
Il est parfois utile de pouvoir savoir comment une fonction a
été appelée, parce que le problème peut
s'être produit bien au-dessus dans la pile d'appel dans un
programme complexe. La commande bt dit à
gdb d'imprimer en remontant la pile d'appel:
(gdb) bt
#0 0x164a in bazz (un_entier=0x5) at temp.c:17
#1 0xefbfd888 in end ()
#2 0x162c in main () at temp.c:11
(gdb)
La fonction end() est appelée quand un
programme échoue; dans le cas présent, la fonction
bazz() a été appelée par
main().
Prendre le contrôle d'un programme en cours
d'exécution
Une des possibilités les plus intéressantes de
gdb est qu'il peut se rattacher à un
programme en cours d'exécution. Il faut bien sûr que vous
ayez les autorisations suffisantes pour le faire. Le cas d'un programme
qui “fourche” - fork - est
un problème classique, lorsque vous voulez suivre le
déroulement du processus fils, alors que le débogueur ne
vous permet que de tracer le processus père.
Vous lancez alors un autre gdb, utilisez
ps pour connaître l'IDentifiant de processus du
fils, puis faites:
(gdb) attach pid
sous gdb, et déboguez alors comme
d'habitude.
“Tout cela est bien beau”, vous dites vous
peut-être, “mais le temps que j'ai fait tout ça, le
processus fils aura déjà fait un bon bout de
chemin”. Rien à craindre, aimable lecteur, voici ce
qu'il faut faire (emprunté aux pages “info” de
gdb):
&hellip
if ((pid = fork()) < 0) /* _Toujours_ effectuer se contrôle */
error();
else if (pid == 0) { /* C'est le processus fils */
int PauseMode = 1;
while (PauseMode)
sleep(10); /* Attendre que quelqu'un se rattache à nous */
…
} else { /* parent */
…
Il n'y a plus qu'à se rattacher au fils, positionner
PauseMode à 0, et attendre
que l'appel de sleep() nous rende la main!
Utiliser Emacs comme environnement de développement
Emacs
Les systèmes Unix ne s'accompagnent malheureusement pas
du type d'environnement de développement
intégré du genre “tout ce que vous avez toujours
voulu et encore beaucoup plus en un seul monstrueux paquetage”
dont disposent d'autres systèmesAu moins, pas
à moins que vous ne soyez prêt à les payer une somme
astronomique.. Il est cependant possible de mettre
au point votre propre environnement. Il ne sera peut-être pas
aussi esthétique et il ne sera peut-être pas aussi
intégré, mais vous pourrez le configurer comme vous le
voulez. Et il est gratuit. En plus, vous en avez les sources.
Emacs est la clé de tout. Il y a bien des gens qui le
décrient, mais nombreux sont ceux qui l'aiment. Si vous
êtes des premiers, j'ai peur que cette section n'ait que peu
d'intérêt pour vous. Il vous faudra aussi pas mal de
mémoire pour l'utiliser. Je conseille 8Mo en mode texte et
16Mo sous X comme strict minimum pour avoir des temps de réponse
raisonnables.
Emacs est essentiellement un éditeur extrêmement
configurable - il a de fait été configuré
au point de ressembler plus à un système
d'exploitation qu'à un éditeur! De nombreux
développeurs et administrateurs système passent le plus
clair de leur temps à travailler sous Emacs, le quittant
seulement pour se déconnecter.
Il est impossible de même résumer ici tout ce qu'Emacs
est capable de faire, mais voici quelques fonctionnalités qui
intéressent les développeurs:
Editeur très puissant qui permet et de rechercher et
remplacer des chaînes de caractères et d'utiliser pour
le faire des expressions régulières (motifs), d'aller
au début ou à la fin de blocs syntaxiques, etc,
etc.
Menus déroulants et aide en ligne.
Mise en valeur et indentation en fonction de la syntaxe du
langage utilisé.
Complètement configurable.
Vous pouvez compiler et déboguer des programmes depuis
Emacs.
En cas d'erreur à la compilation, vous pouvez aller
directement à la ligne qui en est la cause.
Interface ergonomique au programme info
qui sert à lire la documentation hypertexte GNU, dont
celle d'Emacs lui-même.
Interface conviviale pour gdb, qui vous
permet de visualiser le code source en même temps que vous
exécutez pas à pas le programme.
Vous pouvez lire les “news” Usenet et votre
courrier électronique pendant que votre programme
compile.
Et sans aucun doute bien d'autres choses qui m'ont
échappées.
Emacs peut être installé sous FreeBSD sous forme de
logiciel
porté.
Une fois qu'il est installé, lancez-le et tapez
C-h t - ce qui signifie maintenir
enfoncée la touche Ctrl, taper
h, relâcher la touche Ctrl, et
appuyer ensuite sur t - pour lire le guide
d'Emacs (Vous pouvez aussi utiliser la souris pour sélectionner
Emacs
Tutorial - “Guide
Emacs” - depuis le menu
Help - “Aide”).
Bien qu'Emacs ait des menus, il vaut la peine d'apprendre à
utiliser les raccourcis claviers, parce qu'il est bien plus rapide
quand vous éditez quelque chose d'appuyer sur deux ou trois
touches que de courir après la souris et cliquer ensuite au bon
endroit. Si, par ailleurs, vous discutez avec des utilisateurs
- expérimentés d'Emacs, vous vous aperceverez qu'ils
+ expérimentés d'Emacs, vous vous apercevrez qu'ils
utilisent assez couramment des expressions comme
“M-x replace-s RET foo RET bar RET”,
il peut donc servir de comprendre ce qu'ils veulent dire. Et de toute
façon, Emacs a bien plus de fonctions utiles qu'il ne peut en
tenir sur une barre de menus.
Il est heureusement assez facile de découvrir les raccourcis
claviers, ils sont affichés dans les menus. Je vous conseille
d'utiliser les menus pour, par exemple, ouvrir un fichier
jusqu'à ce que vous compreniez comment cela marche et ayez
suffisamment confiance en vous, puis d'essayer C-x C-f. Une fois que
cela vous convient, passez à une autre des commandes des
menus.
Si vous ne vous rappelez pas ce que fait une combinaison
donnée de touches, choisissez Describe
Key - “Description d'une
touche” - dans le menu
Help - “Aide” - et
tapez cette combinaison - Emacs vous dira ce qu'elle fait.
Vous pouvez aussi utiliser le choix Command
Apropos - “A propos d'une
commande” - pour connaître
toutes les commandes comportant un mot donné et les touches qui
leur correspondent.
Au fait, l'expression plus haut signifie: enfoncer la touche
Méta, appuyer sur x,
relâcher la touche Méta, taper
replace-s (abréviation de
replace-string - “remplacer
une chaîne de caractères” - une autre
caractéristique d'Emacs est de vous permettre d'abréger
les commandes), appuyer sur Entrée, taper
foo (la chaîne que vous voulez remplacer),
appuyer sur Entrée, taper
bar (la chaîne avec laquelle vous voulez
remplacer foo) et appuyer encore sur
Entrée. Emacs effectuera alors
l'opération de recherche et remplacement que vous venez de
demander.
Si vous vous demandez ce qu'est la touche
Méta, c'est une touche spéciale qu'ont
beaucoup de stations Unix. Malheureusement, les PCs n'en ont pas, c'est
habituellement la touche Alt qui est utilisée
(ou si vous n'avez pas de chance, la touche
Echap).
Oh, et pour sortir d'Emacs, tapez C-x C-c
(Ce qui signifie: enfoncer la touche Ctrl, appuyer sur
c, appuyer sur x et relâcher la
touche Ctrl). S'il y a des fichiers ouverts que vous
n'avez pas sauvegardés, Emacs vous demandera si vous voulez les
sauvegarder. (Oubliez que la documentation dit que la méthode
habituelle pour quitter Emacs est d'utiliser
C-z - cela laisse Emacs actif en
tâche de fond et n'est réellement utile que si vous
êtes sur un système qui ne gère pas de terminaux
virtuels).
Configurer Emacs
Emacs fait des choses admirables; certaines fonctionnalités
sont incorporées, d'autres doivent être
configurées.
Au lieu d'utiliser un langage de macros-instructions
propriétaires, Emacs se sert d'une version de Lisp
spécialement adaptée aux éditeurs, connue sous le
nom de Emacs Lisp. Ce peut être très utile si vous voulez
aller plus loin et apprendre ensuite par exemple Common Lisp, parce
qu'il est considérablement plus léger que Common Lisp
(quoique qu'encore assez imposant!).
La meilleure façon d'apprendre Emacs Lisp est de
télécharger
le
Guide Emacs Lisp.
Il n'y a cependant pas besoin de connaître quoique ce soit
à Lisp pour commencer à configurer Emacs, parce que j'ai
inclu un fichier .emacs d'exemple, qui devrait
suffire au début. Copiez-le simplement dans votre
répertoire utilisateur et relancez Emacs, s'il s'exécute
déjà; il lira les commandes du fichier et (je
l'espère) vous fournira une configuration de base utile.
Un exemple de fichier .emacs
Il contient malheureusement beaucoup trop de choses pour tout
expliquer en détails; il y a cependant un ou deux points
intéressants à mentionner.
Tout ce qui commence par un ; est en
commentaire et est ignoré par Emacs.
La première ligne,
-*- Emacs-Lisp -*- permet
d'éditer le fichier .emacs
lui-même sous Emacs et de profiter de toutes les
fonctionnalitées liées à l'édition de
code Emacs Lisp. Emacs tente habituellement de deviner le type de
fichier en fonction de son nom, mais risque de ne pas y arriver
pour le fichier .emacs.
La touche Tab est utilisée pour
l'indentation dans certains modes, de sorte que si vous appuyez
sur cette touche cela indente la ligne de code courante. Si vous
voulez mettre un caractère tabulation dans
votre texte, enfoncer la touche Ctrl en
même temps que vous appuyez sur
Tab.
Ce fichier permet le mise en valeur syntaxique de code C,
C++, Perl, Lisp et Scheme, en déterminant le langage
d'après le nom du fichier édité.
Emacs a déjà une fonction
prédéfinie appelée
next-error - “erreur
suivante”. Dans la fenêtre de
résultats d'une compilation, cela vous permet d'aller
d'une erreur à la suivante avec M-n;
nous définissons la fonction complémentaire
previous-error - “erreur
précédente”, qui vous permet
de retourner à l'erreur précédente avec
M-p. Le plus sympathique est que
C-c C-c ouvrira le fichier source où
l'erreur s'est produite et ira à la ligne
concernée.
Nous activons la possibilité qu'a Emacs d'agir comme
serveur, de façon à ce que si vous travaillez hors
d'Emacs et voulez éditer un fichier, il vous suffise de
taper:
&prompt.user; emacsclient nom_du_fichier
pour pouvoir ensuite le modifier avec Emacs!De
nombreux utilisateurs d'Emacs affectent à leur variable
d'environnement EDITOR
la valeur emacsclient de façon à
ce que ce soit ce qui se produise chaque fois qu'ils ont besoin
d'éditer un fichier..
Un exemple de fichier .emacs
;; -*-Emacs-Lisp-*-
;; Ce fichier est conçu pour être relu; la variable
;; first-time est utilisée pour éviter les problèmes
;; que cela pourra poser.
(defvar first-time t
"Indicateur signifiant que le fichier .emacs est lu pour la première fois")
;; Méta
(global-set-key "\M- " 'set-mark-command)
(global-set-key "\M-\C-h" 'backward-kill-word)
(global-set-key "\M-\C-r" 'query-replace)
(global-set-key "\M-r" 'replace-string)
(global-set-key "\M-g" 'goto-line)
(global-set-key "\M-h" 'help-command)
;; Touches fonction
(global-set-key [f1] 'manual-entry)
(global-set-key [f2] 'info)
(global-set-key [f3] 'repeat-complex-command)
(global-set-key [f4] 'advertised-undo)
(global-set-key [f5] 'eval-current-buffer)
(global-set-key [f6] 'buffer-menu)
(global-set-key [f7] 'other-window)
(global-set-key [f8] 'find-file)
(global-set-key [f9] 'save-buffer)
(global-set-key [f10] 'next-error)
(global-set-key [f11] 'compile)
(global-set-key [f12] 'grep)
(global-set-key [C-f1] 'compile)
(global-set-key [C-f2] 'grep)
(global-set-key [C-f3] 'next-error)
(global-set-key [C-f4] 'previous-error)
(global-set-key [C-f5] 'display-faces)
(global-set-key [C-f8] 'dired)
(global-set-key [C-f10] 'kill-compilation)
;; Touches curseur
(global-set-key [up] "\C-p")
(global-set-key [down] "\C-n")
(global-set-key [left] "\C-b")
(global-set-key [right] "\C-f")
(global-set-key [home] "\C-a")
(global-set-key [end] "\C-e")
(global-set-key [prior] "\M-v")
(global-set-key [next] "\C-v")
(global-set-key [C-up] "\M-\C-b")
(global-set-key [C-down] "\M-\C-f")
(global-set-key [C-left] "\M-b")
(global-set-key [C-right] "\M-f")
(global-set-key [C-home] "\M-<")
(global-set-key [C-end] "\M->")
(global-set-key [C-prior] "\M-<")
(global-set-key [C-next] "\M->")
;; Souris
(global-set-key [mouse-3] 'imenu)
;; Divers
(global-set-key [C-tab] "\C-q\t") ; Ctrl tab = caractère tabulation.
(setq backup-by-copying-when-mismatch t)
;; 'y' ou <CR> équivaut à yes, 'n' à no.
(fset 'yes-or-no-p 'y-or-n-p)
(define-key query-replace-map [return] 'act)
(define-key query-replace-map [?\C-m] 'act)
;; Paquetages à charger
(require 'desktop)
(require 'tar-mode)
;; Mode diff évolué
(autoload 'ediff-buffers "ediff" "Interface Emacs intelligente pour diff" t)
(autoload 'ediff-files "ediff" "Interface Emacs intelligente pour diff" t)
(autoload 'ediff-files-remote "ediff"
"Interface Emacs intelligente pour diff")
(if first-time
(setq auto-mode-alist
(append '(("\\.cpp$" . c++-mode)
("\\.hpp$" . c++-mode)
("\\.lsp$" . lisp-mode)
("\\.scm$" . scheme-mode)
("\\.pl$" . perl-mode)
) auto-mode-alist)))
;; Mise en valeur syntaxique automatique
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
"Listes des modes à démarrer toujours avec mise en valeur")
(defvar font-lock-mode-keyword-alist
'((c++-c-mode . c-font-lock-keywords)
(perl-mode . perl-font-lock-keywords))
"Associations entre modes et mots-clés")
(defun font-lock-auto-mode-select ()
"Sélectionne automatiquement type de mise en valeur si le major mode courant est dans font-lock-auto-mode-list"
(if (memq major-mode font-lock-auto-mode-list)
(progn
(font-lock-mode t))
)
)
(global-set-key [M-f1] 'font-lock-fontify-buffer)
;; Nouveau dabbrev
;(require 'new-dabbrev)
(setq dabbrev-always-check-other-buffers t)
(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'c-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) nil)
(set (make-local-variable 'dabbrev-case-replace) nil)))
(add-hook 'text-mode-hook
'(lambda ()
(set (make-local-variable 'dabbrev-case-fold-search) t)
(set (make-local-variable 'dabbrev-case-replace) t)))
;; Mode C++ et C...
(defun my-c++-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c++-mode-map "\C-ce" 'c-comment-edit)
(setq c++-auto-hungry-initial-state 'none)
(setq c++-delete-function 'backward-delete-char)
(setq c++-tab-always-indent t)
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c++-empty-arglist-indent 4))
(defun my-c-mode-hook ()
(setq tab-width 4)
(define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key c-mode-map "\C-ce" 'c-comment-edit)
(setq c-auto-hungry-initial-state 'none)
(setq c-delete-function 'backward-delete-char)
(setq c-tab-always-indent t)
;; indentation style BSD
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 0)
(setq c-label-offset -4))
;; Mode Perl...
(defun my-perl-mode-hook ()
(setq tab-width 4)
(define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
(setq perl-indent-level 4)
(setq perl-continued-statement-offset 4))
;; Mode Scheme...
(defun my-scheme-mode-hook ()
(define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
;; Mode Emacs-Lisp...
(defun my-lisp-mode-hook ()
(define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
(define-key lisp-mode-map "\C-i" 'lisp-indent-line)
(define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
;; Ajouts des précédents
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
(add-hook 'perl-mode-hook 'my-perl-mode-hook)
;; L'inverse de next-error
(defun previous-error (n)
"Aller à l'erreur de compilation précédente et au code correspondant."
(interactive "p")
(next-error (- n)))
;; Divers...
(transient-mark-mode 1)
(setq mark-even-if-inactive t)
(setq visible-bell nil)
(setq next-line-add-newlines nil)
(setq compile-command "make")
(setq suggest-key-bindings nil)
(put 'eval-expression 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(put 'set-goal-column 'disabled nil)
;; Recherche dans les archives Elisp
(autoload 'format-lisp-code-directory "lispdir" nil t)
(autoload 'lisp-dir-apropos "lispdir" nil t)
(autoload 'lisp-dir-retrieve "lispdir" nil t)
(autoload 'lisp-dir-verify "lispdir" nil t)
;; Mise en valeur syntaxique
(defun my-make-face (face colour &optional bold)
"Créer une apparence pour une couleur, éventuellement en gras"
(make-face face)
(copy-face 'default face)
(set-face-foreground face colour)
(if bold (make-face-bold face))
)
(if (eq window-system 'x)
(progn
(my-make-face 'blue "blue")
(my-make-face 'red "red")
(my-make-face 'green "dark green")
(setq font-lock-comment-face 'blue)
(setq font-lock-string-face 'bold)
(setq font-lock-type-face 'bold)
(setq font-lock-keyword-face 'bold)
(setq font-lock-function-name-face 'red)
(setq font-lock-doc-string-face 'green)
(add-hook 'find-file-hooks 'font-lock-auto-mode-select)
(setq baud-rate 1000000)
(global-set-key "\C-cmm" 'menu-bar-mode)
(global-set-key "\C-cms" 'scroll-bar-mode)
(global-set-key [backspace] 'backward-delete-char)
; (global-set-key [delete] 'delete-char)
(standard-display-european t)
(load-library "iso-transl")))
;; X11 ou PC écrivant directement à l'écran
(if window-system
(progn
;; (global-set-key [M-f1] 'hilit-repaint-command)
;; (global-set-key [M-f2] [?\C-u M-f1])
(setq hilit-mode-enable-list
'(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
scheme-mode)
hilit-auto-highlight nil
hilit-auto-rehighlight 'visible
hilit-inhibit-hooks nil
hilit-inhibit-rebinding t)
(require 'hilit19)
(require 'paren))
(setq baud-rate 2400) ; Pour les connections série lentes
)
;; Terminal type TTY
(if (and (not window-system)
(not (equal system-type 'ms-dos)))
(progn
(if first-time
(progn
(keyboard-translate ?\C-h ?\C-?)
(keyboard-translate ?\C-? ?\C-h)))))
;; Sous UNIX
(if (not (equal system-type 'ms-dos))
(progn
(if first-time
(server-start))))
;; Ajouter ici toute modification d'apparence des caractères
(add-hook 'term-setup-hook 'my-term-setup-hook)
(defun my-term-setup-hook ()
(if (eq window-system 'pc)
(progn
;; (set-face-background 'default "red")
)))
;; Restaurer le "bureau" - le faire le plus tard possible
(if first-time
(progn
(desktop-load-default)
(desktop-read)))
;; Indique que le fichier a été lu au moins une fois
(setq first-time nil)
;; Plus besoin de déboguer quoi que ce soit maintenant.
(setq debug-on-error nil)
;; C'est tout
(message "OK, %s%s" (user-login-name) ".")
Permettre à Emacs de comprendre de nouveaux
langages
Bon, tout cela est très bien si vous ne voulez programmer
qu'avec les langages déjà introduits dans le fichier
.emacs (C, C++, Perl, Lisp et Scheme), mais que se
passe-t-il quand un nouveau langage appelé
“whizbang” fait son apparition, avec plein de nouvelles
fonctionnalités attrayantes?
La première chose à faire est de regarder si whizbang
s'accompagne de fichiers de configuration d'Emacs pour ce langage.
Ces fichiers ont généralement comme extension
.el, raccourci pour “Emacs Lisp”.
Par exemple, si whizbang est un logiciel porté pour FreeBSD,
ces fichiers peuvent être repérés par:
&prompt.user; find /usr/ports/lang/whizbang -name "*.el" -print
et il faut les installer en le copiant dans le répertoire du
“site Lisp” d'Emacs. Sous FreeBSD 2.1.0-RELEASE, c'est le
répertoire
/usr/local/share/emacs/site-lisp.
Ainsi par exemple, si la commande précédente nous
donnait:
/usr/ports/lang/whizbang/work/misc/whizbang.el
nous le copierions alors comme suit:
&prompt.user; cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp
Décidons ensuite de l'extension que doivent avoir les
fichiers source whizbang. Supposons, pour les besoins de l'exemple,
qu'ils se terminent tous par .wiz. Il faut ajouter
une entrée à notre fichier .emacs,
pour être sûr qu'Emacs puisse utiliser les informations du
fichier whizbang.el.
Recherchons l'entrée auto-mode-alist dans
.emacs et ajoutons une ligne pour whizbang, par
exemple:
…
("\\.lsp$" . lisp-mode)
("\\.wiz$" . whizbang-mode)
("\\.scm$" . scheme-mode)
…
Cela signifie qu'Emacs passera automatiquement en
whizbang-mode à l'édition d'un
fichier d'extension .wiz.
Juste après, il y a une entrée
font-lock-auto-mode-list. Ajoutez-y
whizbang-mode comme ceci:
;; Auto font-lock-mode
(defvar font-lock-auto-mode-list
(list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
"Listes des modes à démarrer toujours en font-lock-mode")
Ce qui signifie qu'Emacs activera toujours le
font-lock-mode (i.e., la mise en valeur
syntaxique) à l'édition d'un fichier
.wiz.
Cela suffit. S'il y a autre chose que vous voulez automatiser
à l'ouverture d'un fichier .wiz, vous
pouvez ajouter un whizbang-mode hook (voyez mon
my-scheme-mode-hook pour avoir un exemple simple
qui ajoute un auto-indent - indentation
automatique).
A lire pour aller plus loin
Brian Harvey et Matthew Wright Simply
Scheme MIT 1994. ISBN 0-262-08226-8
Randall Schwartz Learning Perl O'Reilly
1993 ISBN 1-56592-042-2
Patrick Henry Winston et Berthold Klaus Paul Horn
Lisp (3rd Edition) Addison-Wesley
1989 ISBN 0-201-08319-1
Brian W. Kernighan et Rob Pike The Unix Programming
Environment Prentice-Hall 1984 ISBN
0-13-937681-X
Brian W. Kernighan et Dennis M. Ritchie The C
Programming Language (2nd Edition) Prentice-Hall
1988 ISBN 0-13-110362-8
Bjarne Stroustrup The C++ Programming
Language Addison-Wesley 1991 ISBN
0-201-53992-6
W. Richard Stevens Advanced Programming in the Unix
Environment Addison-Wesley 1992 ISBN
0-201-56317-7
W. Richard Stevens Unix Network Programming
Prentice-Hall 1990 ISBN 0-13-949876-1
diff --git a/fr_FR.ISO8859-1/articles/pxe/article.sgml b/fr_FR.ISO8859-1/articles/pxe/article.sgml
index 5abf8beb29..c565031a0a 100644
--- a/fr_FR.ISO8859-1/articles/pxe/article.sgml
+++ b/fr_FR.ISO8859-1/articles/pxe/article.sgml
@@ -1,310 +1,310 @@
%man;
%urls;
%abstract;
%artheader;
%translators;
%authors;
]>
FreeBSD Jumpstart Guide
Alfred
Perlstein
alfred@FreeBSD.org
$FreeBSD$
Cet article décrit la méthode a utiliser pour
installer FreeBSD en utilisant la possibilité pour une
machine de booter depuis le réseau via la fonction Intel
PXE.
Introduction
Cette procédure rend le “Server” non
sécurisé et dangereux, il est
préférable de ne pas laisser le “Server”
accessible depuis d'autres machines que les
“Clients”.
Terminologie:
Server
La machine qui offre le démarrage par le
réseau et les options d'installation.
Client
La machine sur laquelle va etre installé
FreeBSD.
Prérequis:
Des Clients supportant l'option de démarrage par le
réseau, de type Intel PXE, et une connexion Ethernet.
SVP, faites moi savoir si vous avez un problème ou
des suggestions pour augmenter cette documentation.
Si vous désirez expliquer ou implémenter
une installation système spécifique, envoyez moi
un email que nous en discutions.
Je voudrais aussi remercier &a.ps; et &a.jhb; pour leur travail
sur le pxeboot, l'interface au système Intel PXE (netboot).
Configuration du Server
Installez DHCP: vous pouvez ensuite utiliser ce fichier
dhcpd.conf, et le déposer dans /usr/local/etc/
Activez tftp:
Créez un répertoire
/usr/tftpboot
Ajoutez la ligne suivant au fichier
/etc/inetd.conf:
tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /usr/tftpboot
Activez NFS:
Ajoutez la ligne suivante au fichier
/etc/rc.conf:
nfs_server_enable="YES"
Ajoutez la ligne suivante au fichier
/etc/exports:
/usr -alldirs -ro
Redémarrez pour activer ces nouveaux services ou
démarrez les manuellement.
Configuration du Bootstrap
Téléchargez les fichiers de démarrage:
téléchargez les images kern.flp
et
mfsroot.flp.
Configurez le répertoire tftp/pxe-boot:
Déposez pxeboot dans le répertoire de
démarrage:
&prompt.root; rm -rf /usr/obj/*
&prompt.root; cd /usr/src/sys/boot
&prompt.root; make
&prompt.root; cp /usr/src/sys/boot/i386/pxeldr/pxeboot /usr/tftpboot
Utilisez le montage d'un pseudo périphérique
pour monter le fichier kern.flp et copiez
son contenu dans /usr/tftpboot:
&prompt.root; vnconfig vn0 kern.flp # association d'un fichier a un vndevice
&prompt.root; mount /dev/vn0 /mnt # montage
&prompt.root; cp -R /mnt /usr/tftpboot # copie du contenu dans /usr/tftpboot
&prompt.root; umount /mnt # démontage
&prompt.root; vnconfig -u vn0 # dé-association du vndevice au fichier
Compilez un noyau personnalisé pour les clients
(particulièrement pour éviter la configuration
des périphériques au démarrage) et
déposez le dans le répertoire
/usr/tftpboot.
Créez un loader.rc spécial
et installez le dans /usr/tftpboot/boot/loader.rc
comme cela il ne demandera pas la deuxième disquette.
Le mien se trouve
ici.
Désarchivez l'installeur et les utilitaires d'aide de
la disquette mfsroot et décompressez les, puis
déposez les dans /usr/tftpboot
comme ceci:
- &prompt.root; vnconfig vn0 mfsroot.flp # assocication du fichier a un vndevice
+ &prompt.root; vnconfig vn0 mfsroot.flp # association du fichier a un vndevice
&prompt.root; mount /dev/vn0 /mnt # montage
&prompt.root; cp /mnt/mfsroot.gz /usr/tftpboot # copy du contenu dans /usr/tftpboot
&prompt.root; umount /mnt # démontage
&prompt.root; vnconfig -u vn0 # dé-association du fichier au vndevice
&prompt.root; cd /usr/tftpboot # on se déplace dans le répertoire pxeboot
&prompt.root; gunzip mfsroot.gz # on décompresse l'image mfsroot
Créez votre propre procédure sysinstall
install.cfg, vous pouvez utilisez
le mien comme exemple, mais vous devez l'editer.
Copiez le script à l'endroit ou vous avez extrait
et décompressé l'image mfsroot:
&prompt.root; cd /usr/tftpboot
&prompt.root; vnconfig vn0 mfsroot
&prompt.root; mount /dev/vn0 /mnt
&prompt.root; cp install.cfg /mnt
&prompt.root; umount /mnt
&prompt.root; vnconfig -u vn0
Configuration de l'installation
Déposez les fichiers d'installation dans un
répertoire accessible par NFS sur le serveur.
Créez un répertoire correspondant à la
directive “nfs” du fichier
install.cfg et copiez les fichiers
d'installation de FreeBSD a cet endroit, cela devrait
ressembler à quelque chose comme ceci:
ABOUT.TXT TROUBLE.TXT compat20 floppies ports
ERRATA.TXT UPGRADE.TXT compat21 games proflibs
HARDWARE.TXT XF86336 compat22 info src
INSTALL.TXT bin compat3x kern.flp
LAYOUT.TXT catpages crypto manpages
README.TXT cdrom.inf dict mfsroot.flp
RELNOTES.TXT compat1x doc packages
Copiez les paquetages compressés dans le
répertoire packages/All sous le répertoire
nfs.
Vérifiez la présence du fichier
INDEX dans le répertoire des
paquetages. Vous pouvez créer vos propres
entrées comme ceci:
alfred-1.0||/|Utilitaires d'installation d'Alfred||alfred@FreeBSD.org||||
Vous pouvez alors installer vos paquetages
personnalisés, en particulier vos paquetages de
post-installation.
Paquetages de post-installation
Vous pouvez utiliser le script pkgmaker.sh
pour créer votre propre paquetage de post-installation,
- l'idéee étant de l'avoir installer et
+ l'idée étant de l'avoir installer et
configuré avec les options spécifiques que vous voulez.
pkgmaker se lance dans le répertoire
au dessus du paquetage que vous voulez créer, en donnant
uniquement le nom du paquetage (par ex mypkg) en argument, cela
créera un mypkg.tgz a inclure dans le paquetage de
sysinstall.
Dans le répertoire de votre paquetage, vous devez
créer un fichier nommé PLIST
qui contient l'ensemble des fichiers que vous désirez
installer et qui seront incorporés dans votre
paquetage.
Vous pouvez aussi créer des fichiers appelés
pre et post dans ce
répertoire, ceux-ci sont des scripts qui seront
- executés avant et après l'installation de votre
+ exécutés avant et après l'installation de votre
paquetage.
Si le paquetage se trouve dans votre fichier
install.cfg il sera lancé et devra
effectuer sa configuration finale pour vous.
diff --git a/fr_FR.ISO8859-1/articles/zip-drive/article.sgml b/fr_FR.ISO8859-1/articles/zip-drive/article.sgml
index 428dc9256c..bb218c525d 100644
--- a/fr_FR.ISO8859-1/articles/zip-drive/article.sgml
+++ b/fr_FR.ISO8859-1/articles/zip-drive/article.sgml
@@ -1,304 +1,304 @@
%man;
%urls;
%abstract;
%artheader;
%translators;
%authors;
%mailing-lists;
]>
Les lecteurs ZIP
Jason
Bacon
acadix@execpc.com
&abstract.license;
&abstract.disclaimer;
&trans.a.boucey;
Les bases au sujet des lecteurs ZIP
- Les disques ZIP sont des disques magnétiques amovibles de grande
- capacité, accessibles en lecture et en écriture par les lecteurs ZIP de
+ Les disques ZIP sont des disques magnétiques amovibles de grande
+ capacité, accessibles en lecture et en écriture par les lecteurs ZIP de
marque IOMEGA. Les disques ZIP sont similaires aux disquettes, en
- étant cependant bien plus rapides et en ayant une capacité bien
- supérieure. Alors qu'une disquette comporte typiquement 1.44 Mo,
- les disques ZIP sont disponibles en deux capacités, à savoir 100 Mo
- et 250 Mo. Les lecteurs ZIP ne doivent pas être confondus avec
- super-disquette, un lecteur de disquette de 120 Mo de capacité,
+ étant cependant bien plus rapides et en ayant une capacité bien
+ supérieure. Alors qu'une disquette comporte typiquement 1.44 Mo,
+ les disques ZIP sont disponibles en deux capacités, à savoir 100 Mo
+ et 250 Mo. Les lecteurs ZIP ne doivent pas être confondus avec
+ super-disquette, un lecteur de disquette de 120 Mo de capacité,
qui accepte aussi les traditionnelles disquettes de 1.44 Mo de
- capacité.
+ capacité.
- IOMEGA vends aussi un lecteur à la capacité et aux performances
- supérieurs appelé JAZZ. Les lecteurs JAZZ sont livrés en 1 Go et 2
- Go de capacité.
+ IOMEGA vends aussi un lecteur à la capacité et aux performances
+ supérieurs appelé JAZZ. Les lecteurs JAZZ sont livrés en 1 Go et 2
+ Go de capacité.
- Les lecteurs ZIP sont disponibles en unité interne ou externe,
+ Les lecteurs ZIP sont disponibles en unité interne ou externe,
utilisant l'une des trois interfaces suivantes :
L'interface SCSI (Small Computer Standard Interface) est
- l'interface la plus rapide, la plus sophistiquée, la plus extensible,
- et la plus chère. L'interface SCSI est utilisée sur tous types
- d'ordinateur, du PC à la station de travail RISC, jusqu'aux
- mini-ordinateurs, pour connecter tous types de périphériques
+ l'interface la plus rapide, la plus sophistiquée, la plus extensible,
+ et la plus chère. L'interface SCSI est utilisée sur tous types
+ d'ordinateur, du PC à la station de travail RISC, jusqu'aux
+ mini-ordinateurs, pour connecter tous types de périphériques
tels que lecteurs de disque, lecteurs de bande, scanners, etc.
- Les lecteurs ZIP SCSI peuvent être internes ou externes, étant
- entendu que votre adaptateur SCSI possède un connecteur
+ Les lecteurs ZIP SCSI peuvent être internes ou externes, étant
+ entendu que votre adaptateur SCSI possède un connecteur
externe.
- Si vous utilisez un matériel SCSI externe, il est important
- de ne jamais le connecter ni le déconnecter tout pendant
+ Si vous utilisez un matériel SCSI externe, il est important
+ de ne jamais le connecter ni le déconnecter tout pendant
que l'ordinateur est en fonctionnement. Faire ceci risque de
- causer des dommages aux systèmes de fichiers sur les disques
+ causer des dommages aux systèmes de fichiers sur les disques
en cours de connection.
Si vous souhaitez le maximum de performance et la plus grande
- facilité d'installation, l'interface SCSI est le meilleur choix. Cela
+ facilité d'installation, l'interface SCSI est le meilleur choix. Cela
demandera certainement l'adjonction d'un adaptateur SCSI, puisque la
- majorité des PC (exception faite des serveurs hautes performances)
+ majorité des PC (exception faite des serveurs hautes performances)
ne comportent pas d'origine de support SCSI. Chaque adaptateur peut
- prendre en charge 7 ou 15 périphériques SCSI, selon le modèle.
+ prendre en charge 7 ou 15 périphériques SCSI, selon le modèle.
- Chaque périphérique SCSI a son propre contrôleur, et ces
- contrôleurs sont assez intelligents et bien standardisés (le
- second `S' de SCSI est l'abréviation de Standard), ce qui signifie
- , du point de vue du système d'exploitation, que tous les lecteurs de
+ Chaque périphérique SCSI a son propre contrôleur, et ces
+ contrôleurs sont assez intelligents et bien standardisés (le
+ second `S' de SCSI est l'abréviation de Standard), ce qui signifie
+ , du point de vue du système d'exploitation, que tous les lecteurs de
disques SCSI sont quasiment identiques, ceci vaut aussi pour les
- lecteurs de bandes, etc. Pour prendre en charge du matériel SCSI, le
- système d'exploitation n'a besoin que d'un pilote (driver) propre à
- l'adaptateur utilisé, et un pilote générique propre à chaque type de
- matériel, à savoir un pilote pour disque SCSI, un pilote pour lecteur
- de bande, et ainsi de suite. Il y a certains matériels SCSI qui
- peuvent être mieux utilisés grâce à des pilotes spécialisés (comme par
- exemple les lecteurs DAT), mais, généralement, ils fonctionnent bien
- avec le pilote générique. Il se peut alors que le pilote générique ne prenne pas
- en compte un certain nombre de caractèristiques spécifiques.
+ lecteurs de bandes, etc. Pour prendre en charge du matériel SCSI, le
+ système d'exploitation n'a besoin que d'un pilote (driver) propre à
+ l'adaptateur utilisé, et un pilote générique propre à chaque type de
+ matériel, à savoir un pilote pour disque SCSI, un pilote pour lecteur
+ de bande, et ainsi de suite. Il y a certains matériels SCSI qui
+ peuvent être mieux utilisés grâce à des pilotes spécialisés (comme par
+ exemple les lecteurs DAT), mais, généralement, ils fonctionnent bien
+ avec le pilote générique. Il se peut alors que le pilote générique ne prenne pas
+ en compte un certain nombre de caractéristiques spécifiques.
- Utiliser un lecteur ZIP SCSI consiste simplement à déterminer
- quel fichier matériel dans le répertoire /dev
- représente le lecteur ZIP. Pour ce faire, on peut observer les messages lors
- de l'amorçage de BSD (ou dans /var/log/messages après le
- démarrage), où vous verrez une ligne ressemblant fort à ceci:
+ Utiliser un lecteur ZIP SCSI consiste simplement à déterminer
+ quel fichier matériel dans le répertoire /dev
+ représente le lecteur ZIP. Pour ce faire, on peut observer les messages lors
+ de l'amorçage de BSD (ou dans /var/log/messages après le
+ démarrage), où vous verrez une ligne ressemblant fort à ceci:
da1: <IOMEGA ZIP 100 D.13> Removable Direct Access SCSI-2 Device
- Cela signifie que le lecteur ZIP est représenté par le fichier
+ Cela signifie que le lecteur ZIP est représenté par le fichier
/dev/da1.
L'interface IDE (Integrated Drive Electronics) est une interface
- de lecteur de disque bon marché utilisée pour les ordinateurs de bureau.
- La plus grande partie des matériels IDE est strictement interne.
+ de lecteur de disque bon marché utilisée pour les ordinateurs de bureau.
+ La plus grande partie des matériels IDE est strictement interne.
- Les performances des lecteurs ZIP IDE sont comparables à celles des
+ Les performances des lecteurs ZIP IDE sont comparables à celles des
lecteurs ZIP SCSI (l'interface IDE n'est pas aussi rapide que l'interface
- SCSI, mais les performances des lecteurs ZIP sont limitées essentiellement
- par leur mécanique, non pas à cause du bus SCSI).
+ SCSI, mais les performances des lecteurs ZIP sont limitées essentiellement
+ par leur mécanique, non pas à cause du bus SCSI).
- L'inconvénient de l'interface IDE sont les limites qu'elle impose.
+ L'inconvénient de l'interface IDE sont les limites qu'elle impose.
La plupart des adaptateurs IDE ne peuvent prendre en charge que deux
- périphériques, et ne sont en général pas conçues pour le long terme. Par
+ périphériques, et ne sont en général pas conçues pour le long terme. Par
exemple, l'interface originelle IDE ne prend pas en charge les disques durs
- comportant plus de 1024 cylindres, ce qui oblige de nombreuses personnes à
- mettre à jour prématurément leurs équipements. Si vous prévoyez d'étendre
+ comportant plus de 1024 cylindres, ce qui oblige de nombreuses personnes à
+ mettre à jour prématurément leurs équipements. Si vous prévoyez d'étendre
votre PC par l'adjonction d'un nouveau disque dur, d'un lecteur de bande,
ou d'un scanner, vous pouvez investir dans un adaptateur SCSI et ZIP SCSI
- afin d'éviter des problèmes dans le futur.
+ afin d'éviter des problèmes dans le futur.
- Les périphériques IDE sous FreeBSD sont préfixés par un w.
- Par exemple, un disque dur IDE peut être /dev/wd0,
- un lecteur de cdrom IDE (ATAPI) peut être /dev/wcd1,
+ Les périphériques IDE sous FreeBSD sont préfixés par un w.
+ Par exemple, un disque dur IDE peut être /dev/wd0,
+ un lecteur de CDROM IDE (ATAPI) peut être /dev/wcd1,
et ainsi de suite.
- L'interface port parallèle est populaire grâce aux périphériques externes
+ L'interface port parallèle est populaire grâce aux périphériques externes
portables tels que lecteurs ZIP externes, scanners, parce que potentiellement
- chaque ordinateur possède un port parallèle standard (habituellement utilisé
- pour les imprimantes). Ceci rend aisé pour tout un chacun le transfert de données
+ chaque ordinateur possède un port parallèle standard (habituellement utilisé
+ pour les imprimantes). Ceci rend aisé pour tout un chacun le transfert de données
entre ordinateurs par simple le transport de ces lecteurs ZIP.
- Les performances seront en général moindre qu'avec un lecteur ZIP ou IDE,
- du fait de la vitesse limitée du port parallèle. Cette vitesse varie
- considérablement d'un ordinateur à l'autre, et peut souvent être configurée
- à partir du système BIOS. Certaines machines demanderont une configuration du
- BIOS pour pouvoir faire fonctionner le port parallèle en mode bidirectionnel
- (Les ports parallèles ont seulement été conçus à l'origine pour fournir des
- données sortantes vers les imprimantes)
+ Les performances seront en général moindre qu'avec un lecteur ZIP ou IDE,
+ du fait de la vitesse limitée du port parallèle. Cette vitesse varie
+ considérablement d'un ordinateur à l'autre, et peut souvent être configurée
+ à partir du système BIOS. Certaines machines demanderont une configuration du
+ BIOS pour pouvoir faire fonctionner le port parallèle en mode bidirectionnel
+ (Les ports parallèles ont seulement été conçus à l'origine pour fournir des
+ données sortantes vers les imprimantes)
- ZIP parallèle : Le pilote vpo
+ ZIP parallèle : Le pilote vpo
- Pour utiliser un lecteur ZIP port parallèle sous FreeBSD, le pilote
- vpo doit être configuré dans le noyau. Les lecteurs
- ZIP port parallèle ont aussi un contrôleur SCSI intégré. Le pilote vpo authorise
- le noyau FreeBSD à communiquer avec le contrôleur SCSI du lecteur ZIP au travers
- du port parallèle.
+ Pour utiliser un lecteur ZIP port parallèle sous FreeBSD, le pilote
+ vpo doit être configuré dans le noyau. Les lecteurs
+ ZIP port parallèle ont aussi un contrôleur SCSI intégré. Le pilote vpo autorise
+ le noyau FreeBSD à communiquer avec le contrôleur SCSI du lecteur ZIP au travers
+ du port parallèle.
Depuis que le pilote vpo ne fait plus parti du noyau en standard (au
- moins pour FreeBSD 3.2), vous avez à reconstruire le noyau afin de rendre
- accessible ce périphérique. La démarche de reconstruction d'un noyau est indiquée
- en détails dans une autre section. Les étapes suivantes indiquent brièvement
- la démarche à suivre afin de mettre en état de marche le pilote vpo:
+ moins pour FreeBSD 3.2), vous avez à reconstruire le noyau afin de rendre
+ accessible ce périphérique. La démarche de reconstruction d'un noyau est indiquée
+ en détails dans une autre section. Les étapes suivantes indiquent brièvement
+ la démarche à suivre afin de mettre en état de marche le pilote vpo:
Lancer /stand/sysinstall, et installer les sources
- du noyau sur votre système.
+ du noyau sur votre système.
&prompt.root; cd /sys/i386/conf
&prompt.root; cp GENERIC MYKERNEL
Editer MYKERNEL, changer la ligne
- ident en MYKERNEL, et décommenter
- la ligne décrivant le pilote vpo.
+ ident en MYKERNEL, et décommenter
+ la ligne décrivant le pilote vpo.
- Si vous possédez un second port parallèle, vous pourriez avoir besoin
- de copier la section dédiée à ppc0 pour créer le
- périphérique ppc1. Le second port parallèle utilise
- généralement l'IRQ 5 et l'adresse 378. Seul l'IRQ est requise pour le
+ Si vous possédez un second port parallèle, vous pourriez avoir besoin
+ de copier la section dédiée à ppc0 pour créer le
+ périphérique ppc1. Le second port parallèle utilise
+ généralement l'IRQ 5 et l'adresse 378. Seul l'IRQ est requise pour le
fichier de configuration.
- Si votre disque dur est un SCSI, vous courez au devant d'un problème
- dans l'ordre de la détection des périphériques, qui entrainera le système
- à tenter d'utiliser le lecteur ZIP en tant que périphérique racine. Le démarrage
- échouera alors, à moins que vous ayez installé un système de fichiers racine
- sur le disque ZIP! Dans ce cas, vous aurez besoin de forcer le noyau à lier
- le disque SCSI racine à /dev/da0, à savoir le disque SCSI
+ Si votre disque dur est un SCSI, vous courez au devant d'un problème
+ dans l'ordre de la détection des périphériques, qui entraînera le système
+ à tenter d'utiliser le lecteur ZIP en tant que périphérique racine. Le démarrage
+ échouera alors, à moins que vous ayez installé un système de fichiers racine
+ sur le disque ZIP! Dans ce cas, vous aurez besoin de forcer le noyau à lier
+ le disque SCSI racine à /dev/da0, à savoir le disque SCSI
racine. Cela assignera alors le disque ZIP au prochain disque SCSI disponible,
- à savoir /dev/da1. Pour forcer votre disque dur SCSI en
+ à savoir /dev/da1. Pour forcer votre disque dur SCSI en
da0, changer la ligne
device da0
en
disk da0 at scbus0 target 0 unit 0
- Vous aurez probablement à changer la cible afin de la faire correspondre à
- l' ID SCSI de votre disque dur. vous devrez aussi forcer l'entrée scbus0 afin
- de l'ajuster à votre contrôleur. Par exemple, si vous avez un contrôleur 15xx
+ Vous aurez probablement à changer la cible afin de la faire correspondre à
+ l' ID SCSI de votre disque dur. Vous devrez aussi forcer l'entrée scbus0 afin
+ de l'ajuster à votre contrôleur. Par exemple, si vous avez un contrôleur 15xx
de chez Adaptec, vous changerez
controller scbus0
en
controller scbus0 at aha0
- En dernier lieu, puisque vous étes en train d'éditer le fichier de
- configuration du noyau, profitez-en pour ôter tous les pilotes inutiles.
- Cela doit être fait avec de grandes précautions, et seulement si vous avez
+ En dernier lieu, puisque vous êtes en train d'éditer le fichier de
+ configuration du noyau, profitez-en pour ôter tous les pilotes inutiles.
+ Cela doit être fait avec de grandes précautions, et seulement si vous avez
assez confiance en vous en ce qui concerne les modifications du noyau. Ôter
- les pilotes inutiles réduira la taille du noyau, laissant plus de mémoire disponible
- à vos applications. Afin de déterminer les pilotes qui ne sont pas nécessaires,
- allez à la fin du fichier /var/log/messages, et recherchez
- les lignes comportant "not found" (non trouvé). Commenter alors ces périphériques
- dans votre fichier de configuration (par un # en tête de ligne). Vous pouvez aussi
- changer d'autres options afin de réduire la taille et d'accroître la rapidité de
+ les pilotes inutiles réduira la taille du noyau, laissant plus de mémoire disponible
+ à vos applications. Afin de déterminer les pilotes qui ne sont pas nécessaires,
+ allez à la fin du fichier /var/log/messages, et recherchez
+ les lignes comportant "not found" (non trouvé). Commenter alors ces périphériques
+ dans votre fichier de configuration (par un # en tête de ligne). Vous pouvez aussi
+ changer d'autres options afin de réduire la taille et d'accroître la rapidité de
votre noyau. Lisez la section concernant la reconstruction du noyau pour de
plus amples informations.
Il est maintenant temps de compiler le noyau:
&prompt.root; /usr/sbin/config MYKERNEL
&prompt.root; cd ../../compile/MYKERNEL
&prompt.root; make clean depend && make all install
- Après le reconstruction du noyau, vous devez redémarrer. Assurez-vous
- que le lecteur ZIP est connecté au port parallèle avant que le démarrage ne
- commence. Vous devriez voir apparaître le lecteur ZIP parmi les messages de
- démarrage en tant que périphérique vp0 ou vp1, selon le port parallèle auquel
- le lecteur est rattaché. Vous devez pouvoir voir aussi à quel fichier
- périphérique le lecteur ZIP a été associé. Ce sera /dev/da0
- si vous n'avez pas d'autre disque SCSI dans le système, ou /dev/da1
- si vous avez un disque dur SCSI à la racine de votre système.
+ Après le reconstruction du noyau, vous devez redémarrer. Assurez-vous
+ que le lecteur ZIP est connecté au port parallèle avant que le démarrage ne
+ commence. Vous devriez voir apparaître le lecteur ZIP parmi les messages de
+ démarrage en tant que périphérique vp0 ou vp1, selon le port parallèle auquel
+ le lecteur est rattaché. Vous devez pouvoir voir aussi à quel fichier
+ périphérique le lecteur ZIP a été associé. Ce sera /dev/da0
+ si vous n'avez pas d'autre disque SCSI dans le système, ou /dev/da1
+ si vous avez un disque dur SCSI à la racine de votre système.
Monter les disques ZIP
- Pour accéder à un disque ZIP, vous avez simplement à le monter, comme
- n'importe quel autre périphérique. Le système de fichiers est représenté
- par la quatrième tranche sur le périphérique, que ce soit pour un disque ZIP
- en SCSI ou en parallèle, vous devriez faire:
+ Pour accéder à un disque ZIP, vous avez simplement à le monter, comme
+ n'importe quel autre périphérique. Le système de fichiers est représenté
+ par la quatrième tranche sur le périphérique, que ce soit pour un disque ZIP
+ en SCSI ou en parallèle, vous devriez faire:
&prompt.root; mount_msdos /dev/da1s4 /mnt
Pour les lecteurs ZIP IDE:
&prompt.root; mount_msdos /dev/wd1s4 /mnt
- Cela facilitera aussi les choses de mettre à jour /etc/fstab
- afin de rendre le montage plus aisé. Ajoutez une ligne telle que la suivante, ajustée
- à votre système:
+ Cela facilitera aussi les choses de mettre à jour /etc/fstab
+ afin de rendre le montage plus aisé. Ajoutez une ligne telle que la suivante, ajustée
+ à votre système:
/dev/da1s4 /zip msdos rw,noauto 0 0
- et créer le répertoire /zip.
+ et créer le répertoire /zip.
Vous pouvez alors monter simplement en tapant
&prompt.root; mount /zip
- et démonter en entrant
+ et démonter en entrant
&prompt.root; umount /zip
Pour savoir plus sur le format de /etc/fstab,
voir &man.fstab.5;.
- Vous pouvez aussi créer un système de fichiers FreeBSD sur un disque
+ Vous pouvez aussi créer un système de fichiers FreeBSD sur un disque
ZIP en utilisant &man.newfs.8;. Cependant, le disque ne sera utilisable
- que par un système FreeBSD, et peut-être par quelques clônes Unix
- reconnaissant le système de fichiers FreeBSD (mais certainement pas par
+ que par un système FreeBSD, et peut-être par quelques clônes Unix
+ reconnaissant le système de fichiers FreeBSD (mais certainement pas par
DOS ou Windows).