Make

Un article de Projet de documentation fug-fr .

Jump to: navigation, search

Traduction avec l'aimable autorisation de l'auteur, d'un article intitulé make for Nonprogrammers de Dru Lavigne, dans la série FreeBSD Basics sur le site BSDDevCenter d'ONLamp.


Si vous êtes un utilisateur ordinaire de FreeBSD, vous n'avez pas forcément de connaissances en langage C. Cependant, si vous avez utilisé make buildworld pour améliorer votre système d'exploitation, ou fait un make install quelque part dans votre arbre des ports, vous vous avez compilé du code C. Cet article couvre quelques aspects de make, pour vous donner une idée de ce qui se passe dans les coulisses. Il examine également certaines des options disponibles, quand on en envoie des commandes.

Sommaire

[modifier] Pourquoi C ?

Vous pouvez vous demander pourquoi s'inquiéter de C, si vous n'avez pas l'intention de devenir programmeur. La raison en est simple: La plupart des systèmes d'exploitation (FreeBSD y compris) sont écrits en C, de même que la plupart des programmes exécutables. Comme exemple, utilisez la commande file pour voir le type de programmes tiers installés sur votre système:

% file /usr/local/bin/* | more

Vous trouverez quelques scripts shell Bourne et Perl, mais le reste sera des exécutables compilés à partir du code source en C, quelque chose comme " ELF LSB 32 bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 5.3.0, dynamically linked (uses shared libs), stipped."" Gardez à l'esprit que vous pouvez utiliser FreeBSD pendant des années, sans jamais taper un make. Installez simplement le système d'exploitation à partir de zéro, à chaque fois que vous voulez passer à une nouvelle version. Laissez le noyau tel quel. C'est juste, le noyau est également écrit en C, et c'est pourquoi vous faites make buildkernel et make installkernel. N'installez pas la collection des ports, et installez toujours un applicatif en utilisant pkg_add -R. Pensez à tout espace disque que vous sauvegarderez, car vous n'aurez aucun besoin d'installer les sources ou les ports. Cependant, vous ne profiterez pas pleinement des nombreux avantages d'un système d'exploitation open source, autrement que par son prix.

[modifier] make, de base

OK, alors, qu'est ce que make? Selon man make, il met à jour les dépendances de programmes. Comme n'importe quel programmeur en C, qui a travaillé sur un projet de logiciel peut vous le dire, il peut y avoir des centaines de fichiers sources, fichiers d'en-tête, et fichiers d'exécution à compiler et lier afin de produire un programme exécutable. Le travail de make est de s'assurer que tout se déroule dans l'ordre. Pour que make fasse ceci, il lit un fichier makefile dans le même répertoire ou vous exécutez la commande make. Par exemple, j'essaye ceci dans mon home:

% cd
% make
make: no target to make.

Ce message signifie qu'il n'y a pas de fichier Makefile dans le répertoire. Par contre, la même commande (en tant que super-utilisateur) quelque part dans dans l'arbre des ports donnera:

# cd /usr/ports/shells/bash
# make

make se connectera sur l'Internet pour rechercher un code source à compiler. Ceci se comprend, car vous avez besoin du source en C, afin de construire ce programme. Comment make fait il pour aller sur Internet rechercher ce code source, et d'une manière primordiale, comment sait il quel site ftp contient le code source dont il a besoin ? Si vous devinez que les instructions se trouvent dans un fichier makefile de ce répertoire, vous etes "correct":

# ls /usr/ports/shells/bash
Makefile	files		pkg-descr	pkg-plist
distinfo	pkg-deinstall	pkg-install

Si vous parcourez ce fichier makefile, vous trouverez une variable MASTER_SITES qui énumère les URL des sites contenant le code source exigé. Note : Au cas où vous vous demanderiez où le téléchargement des sources aboutit, le fichier makefile, le copie dans /usr/ports/distfiles/ , comme tarball. Il extrait alors ce tarball dans un sous-répertoire de votre répertoire actuel, appelé répertoire de travail. Taper make install clean le nettoiera, sinon, ne rajoutez pas clean, si vous désirez le conserver.

[modifier] Compréhension du fichier makefile d'un port

Vous ne devrez pas forcément être courageux avant de patauger dans le fichier makefile d'un port, comme la plupart des variables majuscules ont des noms explicites. Si vous en trouvez une qui ne l'est pas, ou voulez avoir une vue détaillée de ce que chaque variable fait, vérifiez le fichier de make qui explique le format makefile des ports:

Je peux rechercher la variable man, pour déterminer quelle page man un port installera:
%# grep MAN /usr/ports/mail/postfix/Makefile
MAN1=	mailq.1 newaliases.1 postalias.1 postcat.1 postconf.1 postdrop.1 \
MAN5=	access.5 aliases.5 canonical.5 cidr_table.5 ldap_table.5 \
MAN8=	bounce.8 cleanup.8 defer.8 error.8 flush.8 lmtp.8 local.8

La variable man emploie un nombre pour représenter la section du manuel. En employant grep pour rechercher cette variable, je sais que ce port installera six pages man sur la section 1, cinq dans la section 5, et sept dans la section 8. Regardez comme j'aurais de la lecture si j'installe ce port !

[modifier] Make, targets

En plus d'utiliser grep pour glaner l'information hors d'un fichier makefile, vous pouvez également tirer profit des targets de make. target est la définition convenable, pour le mot que vous allez taper après la commande make. Par exemple, vous avez probablement utilisé les targets install et clean pour construire un port.
Naturellement, /usr/ports/Mk/bsd.port.mk contient une liste de tous les targets supportés en compilant un port. Vous trouverez cette liste en utilisant / pour rechercher la section Default target, une fois ouvert ce fichier dans un pager:

% more /usr/ports/Mk/bsd.port.mk
/Default targets

Cependant, vous pouvez trouver plus facile de lire man ports, car il explique mieux les targets les plus courants. Si vous n'avez jamais fait quelque chose de plus fantaisiste qu'un make install, Vous devriez vous entrainer sur un système test, car ils peuvent ne pas fonctionner comme vous l'avez compris, après la lecture des descriptions.
Par exemple, essayez make configure au lieu de make install sur /usr/ports/shells/bash/ . A première vue, ceci ressemble à une compilation normale, comme make va rechercher le code source, l'extrait, et le configure pour votre système. Notez que réellement il n'établit pas le code et n'installe pas le programme.
Si vous lisez man ports attentivement, vous verrez que l'habituel make install est vraiment un ensemble de targets exécutés dans cette commande: config, fetch, checksum, depends,extract, patch, configure, build, et install. Si vous utilisez n'importe quel autre target, make démarrera à config et exécutera chaque target jusqu'au target spécifié.
Ainsi, make configure exécute tout depuis make config, jusqu'à make configure. Ensuite, lancez make configure à partir de /usr/ports/courrier/postfix . Le processus make commencera, et selon la vitesse de votre connexion Internet, vous verrez quelques moments plus tard, un menu de dialogue dans lequel vous pourrez sélectionner et choisir des options à passer au script de configuration.
Vous avez déjà bien pu vous faire avoir avant: Vous tapez make pour installer, et laissez votre ordinateur se débrouiller tout seul, pour vous occuper d'autre chose. Et revenir une heure plus tard, pensant trouver un programme nouvellement compilé, mais trouver à la place un menu de dialogue attendant votre choix. Vous voulez savoir le secret ? Les ports qui affichent de tels menus ont toujours un répertoire de scripts nommé configure. Si vous voyez un tel répertoire quand vous allez dans le squelette d'un port, il demandera une réponse interactive avant de commencer la construction.

[modifier] Comprendre make config

Vous pouvez vous demander qu'elle est la différence entre make configure et make config. J'ai expliqué ici que make configure tourne avec plusieurs targets, et peut exiger ou non de l'utilisateur, d'agir sur l'un ou l'autre avec un script de dialogue.

En revanche, le target config est le premièr à s'exécuter, et emploie toujours un script de dialogue pour permettre de configurer des OPTIONS. Notez que les OPTIONS sont en majuscules, elles se rapportent à une variable de make.
Par exemple :

# cd /usr/ports/multimedia/xmms
# make config
===> No options to configure

ne devrait pas étonner, car le fichier makefile n'utilise aucune OPTION:

# grep -w OPTIONS /usr/ports/multimedia/xmms/Makefile
# 

Cependant, ce fichier makefile utilise cette variable :

# grep OPTIONS /usr/ports/graphics/kdegraphics3/Makefile
OPTIONS=  IMLIB "Build Kuickshow, a fast and versatile image viewer" off \

Notez que \ indique qu'il y a plus d'options; pour en voir plus, changez grep en grep -A 5, pour voir les cinq lignes commencant à (After) OPTIONS.
Maintenant, essai :

# cd /usr/ports/graphics/kdegraphics3
# make config

Un script de dialogue s'ouvre de suite, affichant toutes les options possibles. Ceux permis dans le fichier makefile seront cochées par défaut, tandis que celles non cochées sont hors fonction. Une fois faites vos propres sélections, et tabulé jusqu'à OK, vous reviendrez à votre invite de commande, comme make config est le seul target à exécuter.
Et savez vous que /var/db/ports/ vous sauvegarde vos sélections ?.

# more /var/db/ports/kdegraphics/options
# This file is auto-generated by 'make config'.
# No user-servicable parts inside!
# Options for kdegraphics-3.3.2_2
_OPTIONS_READ=kdegraphics-3.3.2_2
WITHOUT_IMLIB=true
WITHOUT_GPHOTO2=true
WITHOUT_SANE=true

Vous pouvez également visualiser vos sélections à partir du répertoire du port, en utilisant le target showconfig:

# pwd
/usr/ports/graphics/kdegraphics3
# make showconfig
===> The following configuration options are set for kdegraphics-3.3.2_2:
    IMLIB=off "Build Kuickshow, a fast and versatile image viewer"
    GPHOTO2=off "Enable support for digital cameras"
    SANE=off "Build Kooka, a SANE scanner frontend for KDE"

Si vous changez d'avis, vous pouvez toujours réexécuter make config. Alternativement, retirez les options de config:

# make rmconfig
===> Removing user-configured options for kdegraphics-3.3.2_2
# more /var/db/ports/kdegraphics/options
/var/db/ports/kdegraphics/options: No such file or directory

[modifier] Le fichier makefile de world

Rapidement, dans quel répertoire êtes-vous quand vous tapez une commande make pour mettre à jour le système, ou construire un nouveau noyau ? Il doit y avoir un fichier makefile dans le répertoire, ou bien votre commande make échouerait. Jetez y un oeil:

% more /usr/src/Makefile

C'est un fichier makefile intéressant, qui mentionne des targets que vous avez probablement utilisé avant, comme buildworld, buildkernel, installkernel, et installworld. Cependant, cherchez des targets et vous verrez cette section:

# Targets that begin with underscore are internal targets intended for
# developer convenience only.  They are intentionally not documented and
# completely subject to change without notice.
#
TGTS=	all all-man buildkernel buildworld checkdpadd clean \
	cleandepend cleandir depend distribute distributeworld everything \
	hierarchy install installcheck installkernel installkernel.debug\
	reinstallkernel reinstallkernel.debug installworld \
	kernel-toolchain libraries lint maninstall \
 	obj objlink regress rerelease tags toolchain update \
	_worldtmp _legacy _bootstrap-tools _cleanobj _obj \
	_build-tools _cross-tools _includes _libraries _depend

Note : Essayer de nouveaux targets dans l'arbre des ports est une mauvaise idée pouvant apporter certains problèmes, le meilleur d'entre eux étant l'échec de l'installation d'une application. Cependant, si vous avez besoin de sortir des 'targets décrits dans le Handbook, et souhaitez améliorer sans risque le système d'exploitation ou un noyau, faites le sur un système d'essai qui ne contient aucune données, qui vous manqueraient si quelque chose tournait terriblement mal.

Le reste du fichier makefile décrit les targets documentés. Il y a quelquechose d'intéressant à noter: Les avertissements du manuel avec l'utilisation de make world. Ce fichier makefile l'explique mieux:

#
# world
#
# Attempt to rebuild and reinstall everything. This target is not to be
# used for upgrading an existing FreeBSD system, because the kernel is
# not included. One can argue that this target doesn't build everything
# then.
#
world:
.	@echo "WARNING: make world will overwrite your existing FreeBSD"
.	@echo "installation without also building and installing a new"
.	@echo "kernel.  This can be dangerous.  Please read the handbook,"
.	@echo "'Rebuilding world', for how to upgrade your system."
.	@echo "Define DESTDIR to where you want to install FreeBSD,"
.	@echo "including /, to override this warning and proceed as usual."
.	@echo "You may get the historical 'make world' behavior by defining"
.	@echo "HISTORICAL_MAKE_WORLD.  You should understand the implications"
.      	@echo "before doing this."
.	@echo ""
.	@echo "Bailing out now..."

Ce fichier indique également que make kernel est en réalité make buildkernel suivi d' installkernel. Ceci signifie que vous pourriez substituer:

# make buildkernel KERNCONF=NEW && make installkernel KERNCONF=NEW

avec:

# make kernel KERNCONF=NEW

Notez que le fichier makefile utilise GENERIC, à moins que vous n'indiquiez un autre noyau avec KERNCONF.

Le dernièr targetque je veux mentionner est make update. Si vous essayez de le taper tel quel, vous reverrez juste votre invite de commande, comme si rien ne s'était produit. C'est parce que ce target lit le fichier /etc./make.conf pour savoir exactement ce que vous voulez mettre à jour.
Sur mon système d'essai, j'ai déjà cvsup en service, et j'avais créé un fichier supfile dans /root/cvs-supfile. Ainsi, j'ai ajouté ces lignes à /etc./make.conf :

SUP_UPDATE=		yes
SUP=			/usr/local/bin/cvsup
SUPFLAGS=		-g -L 2
SUPFILE=		/root/cvs-supfile

Note : Afin de pouvoir travailler, vous devez avoir cvsup-without-gui d'installé, et avoir configuré un supfile à l'emplacement indiqué. Si vous avez installé cvsup-without-gui mais n'avez pas encore créé de supfile, substituez ces lignes de supfile avec:

SUPHOST=		cvsup.ca.freebsd.org	
SUPFILE=		/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=		/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=		/usr/share/examples/cvsup/doc-supfile

En complétant SUPHOST=, choisissez s'il vous plaît, un miroir géographiquement près de chez vous. En outre, passez en revue les trois fichiers dans /usr/ports/examples/cvsup pour sélectionner et choisir les parties du système d'exploitation, des ports, et des Docs que vous souhaitez mettre à jour.
Quand vous avez terminé, lancez make updatedans /usr/src pour mettre à jour les sources indiquées.

[modifier] Conclusion

Peut-être vous êtiez vous déjà demandé comment font certaines personnes, sur les listes de diffusion, pour connaitre les commandes de make, et quels fichiers elles avaient bien pu lire pour avoir l'information. Rappelez-vous, si vous voulez essayer un nouveau target de make pour vous-même, utilisez un système de test, et sauvegardez toutes les données qui sont importantes.


Dru Lavigne enseigne les technologies Marketbridge à Ottawa, et participe à l'Open Ressource Protocole.


Page d'accueil