|
Article on other languages:
|
make est un logiciel traditionnel d'UNIX. C'est un « moteur de production » : il sert à appeler des commandes créant des fichiers. À la différence d'un simple script shell, make exécute les commandes seulement si elles sont nécessaires. Le but est d'arriver à un résultat (logiciel compilé ou installé, documentation créée, etc.) sans nécessairement refaire toutes les étapes.
FonctionnementIl sert principalement à faciliter la compilation et l'édition de liens puisque dans ce processus le résultat final dépend d'opérations précédentes. Pour ce faire, make utilise un fichier de configuration appelé makefile qui porte souvent le nom de Makefile. Ce dernier décrit des cibles (qui sont souvent des fichiers, mais pas toujours), de quelles autres cibles elles dépendent, et par quelles actions (des commandes) y parvenir. Afin de reconstruire une cible spécifiée par l'utilisateur, make va chercher les cibles nécessaires à la reconstruction de cette cible, et ce récursivement. (Ce faisant, il crée de fait un tri topologique de la relation de dépendance sur les cibles.) Certaines variantes de make prévoient la possibilité d'exécution en parallèle des tâches, si possible. Les règles de dépendance peuvent être explicites (noms de fichiers donnés explicitement) ou implicites (via des motifs de fichiers ; par exemple fichier.o dépend de fichier.c, si celui-ci existe, via une recompilation). Histoiremake fut à l'origine développé par le docteur Stuart Feldman, en 1977. Ce dernier travaillait alors pour Bell Labs. Depuis, plusieurs dérivés ont été développés, les plus connus et utilisés sont ceux de BSD et celui de GNU, ce dernier étant généralement celui utilisé par défaut avec les systèmes Linux. Ils diffèrent par certaines fonctionnalités, et par exemple les scripts prévus pour GNU Make peuvent ne pas fonctionner sous BSD Make. De nos jours, les fichiers Makefile sont de plus en plus rarement générés à la main par le développeur mais construit à partir d'outils automatiques tels qu'autoconf qui facilitent la génération de Makefile complexes et spécifiquement adaptés à l'environnement dans lequel les actions de production sont censées se réaliser. Exemple de MakefileVoici un exemple de Makefile : # Indiquer quel compilateur est à utiliser CC ?= gcc # Spécifier les options du compilateur CFLAGS ?= -g LDFLAGS ?= -L/usr/openwin/lib LDLIBS ?= -lX11 -lXext # Reconnaître les Extension de nom de fichier *.c et *.o comme suffixe SUFFIXES ?= .c .o .SUFFIXES: $(SUFFIXES) . # Nom de l'exécutable PROG = life # Liste de fichiers objets nécessaires pour le programme final OBJS = main.o window.o Board.o Life.o BoundedBoard.o all: $(PROG) # Etape de compilation et d'éditions de liens $(PROG): $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $(PROG) $(OBJS) .c.o: $(CC) $(CFLAGS) -c $*.c Dans cet exemple, .c.o est une règle implicite. Par défaut les cibles sont des fichiers, mais lorsque c'est la juxtaposition de deux suffixes, c'est une règle qui dérive n'importe quel fichier se terminant par le deuxième suffixe à partir d'un fichier portant le même nom mais se terminant par le premier suffixe. Pour parvenir à cette cible, il faut exécuter l'action, la commande $(CC) $(CFLAGS) -c $*.c, où $* représente le nom du fichier sans suffixe. all, en revanche, est une cible qui dépend de $(PROG) (et donc de life, qui est un fichier). $(PROG) - c'est-à-dire life - est une cible qui dépend de $(OBJ) (et donc de main.o window.o Board.o Life.o et BoundedBoard.o). Pour y parvenir, l'action est d'exécuter la commande $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $(PROG) $(OBJS) La syntaxe CC ?= gcc, ou plus généralement <variable> ?= <valeur>, affecte <valeur> à <variable> seulement si <variable> n'en a pas déjà une. Si <variable> a déjà été affectée, cette instruction n'a aucun effet. LimitationsLes limitations de make découlent directement de la simplicité des concepts qui l'ont popularisé : fichiers et dates. Ces critères sont en effet insuffisants pour garantir à la fois l'efficacité et la fiabilité. Le critère de date associé à des fichiers, à lui seul, cumule les deux défauts. À moins que le fichier ne réside sur un support non réinscriptible rien n'assure que la date d'un fichier soit effectivement la date de sa dernière modification. Si pour un utilisateur non privilégié[1], il est assuré que les données ne peuvent être postérieures à la date indiquée, la date exacte de leur antériorité n'est pas pour autant garantie. Ainsi au moindre changement de date d'un fichier, toute une production peut-être considérée nécessaire s'il s'agit d'un source mais pire encore considérée inutile si au contraire il s'agit d'une cible.
Si date et fichier restent pour l'essentiel nécessaires à tout moteur de production voulu fiable et optimal, ils ne sont pas non plus suffisants et quelques exemples particuliers suffisent à l'illustrer :
Une autre limitation de make est qu'il ne génère pas la liste des dépendances et n'est pas capable de vérifier que la liste fournie soit correcte. Ainsi, le simple exemple précédent qui repose sur la règle
$(PROG): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $(PROG) $(OBJS)
main.o: main.c Board.h BoundedBoard.h Life.h global.h
$(CC) $(CFLAGS) -c main.c
window.o: window.c window.h global.h
$(CC) $(CFLAGS) -c window.c
Board.o: Board.c Board.h window.h global.h
$(CC) $(CFLAGS) -c Board.c
Life.o: Life.c Life.h global.h
$(CC) $(CFLAGS) -c Life.c
BoundedBoard.o: BoundedBoard.c BoundedBoard.h Board.h global.h
$(CC) $(CFLAGS) -c BoundedBoard.c
Il est raisonnable de considérer que les fichiers systèmes inclus (comme Ce sont pour ces raisons que les moteurs de productions de nouvelle génération se spécialisent dans le traitement de langages particuliers (sémantique du contenu des fichiers) ou sont encore couplés à une base de données dans laquelle sont enregistrées toutes les caractéristiques effectives de production (audit de production) des cibles (traçabilité). AlternativesIl existe plusieurs alternatives à make :
Notes et référencesVoir aussiLiens externes
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net