Makefile

Makefile

make

Cet article a pour sujet le logiciel intitulé make. Pour une définition du mot « make », voir l’article make du Wiktionnaire. Wiktfavicon en.svg

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.

Sommaire

Fonctionnement

Il 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).

Histoire

make 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 ou cmake 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 Makefile

Voici 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.

Limitations

Les 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.

  • Dans le premier cas il y a perte d'efficacité.
  • Dans le second cas il y a perte de fiabilité.

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 :

  • Make en lui même ignore complètement la sémantique des fichiers dont il assure le traitement, il en ignore tout simplement le contenu. Par exemple, aucune distinction n'est faite entre code effectif et commentaires. Ainsi, dans le cas de l'ajout ou même seulement de la modification d'un commentaire au sein d'un fichier C make considérera que bibliothèques ou programmes cibles qui en dépendent devront être reconstruits.
  • Si le résultat final dépend des données en entrée, il dépend tout autant des traitements appliqués. Ces traitements sont décrits dans le fichier makefile. Rares sont les écritures de fichiers makefile qui prévoient d'invalider tout production antérieurement réalisée dans le cas de l'évolution du fichier makefile ; en effet pour ce faire il conviendrait de mettre systématiquement le fichier makefile en dépendance de toutes les règles de production qu'il définit lui-même. S'il n'est techniquement pas difficile d'envisager que cela puisse être directement réalisé par une variante de make, cela aurait pour effet de bord de toucher toutes les cibles même si elles ne sont pas concernées par les modifications opérées dans le makefile.
  • Une variante de l'exemple précédent est le cas où des variables régissant la production sont positionnées soit par des variables d'environnement ou encore via la ligne de commande. Là encore, make n'a aucun moyen de détecter si ces variables touchent ou non la production et notamment quand ces variables désignent des options et non des fichiers.

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 .c.o est erroné : en effet, les fichiers objets ne sont pas seulement dépendants du fichier source .c associé, mais également de tous les fichiers du projet inclus par le fichier .c. Une liste de dépendances plus réaliste serait :

$(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 stdio.h) ne changent pas et de ne pas les lister comme dépendances. Au prix de l'écriture de parsers capable de produire des liste dynamiques de dépendances, certaines versions de make[2] permettent de contourner ce problème.

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é).

Alternatives

Il existe plusieurs alternatives à make :

  • makepp : un dérivé de (GNU) make, mais qui offre en plus un analyseur extensible de commandes et de fichiers inclus afin de reconnaître automatiquement les dépendances. Les options de commandes changées et autres influences sont reconnues. Le grand problème de make récursif peut être facilement évité, pour garantir une construction correcte. [1]
  • NMake est la version Microsoft de Make.
  • clearmake est la version intégrée à ClearCase. Fortement couplé à la gestion des révision des fichiers, il réalise et stocke un audit de toutes les fabrications. Ces audits lui permettent de s'affranchir de la problématique des dates, des variables d'environnement, des dépendances implicites ou cachées ainsi que celles des paramètres passés en ligne de commande (Cf. limitations).
  • ant : plutôt lié au monde Java.
  • rake : un équivalent en ruby.
  • SCons : complètement différent de make, il inclut certaines des fonctions d'outil de compilation comme autoconf. On peut utiliser Python pour étendre l'outil.
  • Speedy Make utilise XML pour les makefiles, très simple à écrire, offre plus d'automatismes que make.

Notes et références

  1. On supposera qu'un utilisateur privilégié est suffisamment responsable pour ne pas rétrograder de manière inconsidérée la date d'un fichier
  2. Par exemple avec GNU Make qui facilite la construction de liste dynamique même s'il ne fournit pas de tels parsers.

Voir aussi

Liens externes

Wikibooks-logo-fr.png

Wikibooks propose un ouvrage abordant ce sujet : make.

  • Portail des logiciels libres Portail des logiciels libres
  • Portail de l’informatique Portail de l’informatique
Ce document provient de « Make ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Makefile de Wikipédia en français (auteurs)

Игры ⚽ Нужно решить контрольную?

Regardez d'autres dictionnaires:

  • Makefile — make (engl. machen, erstellen) ist ein Computerprogramm, das Shellskript ähnlich Kommandos in Abhängigkeit von Bedingungen ausführt. Es wird hauptsächlich bei der Softwareentwicklung eingesetzt. Genutzt wird es beispielsweise, um in einem Projekt …   Deutsch Wikipedia

  • Makefile.am — Programmablaufplan von autoconf und automake, zwei Tools im GNU Build System Das GNU Build System, auch bekannt als Autotools, ist eine Sammlung von Tools für die Computerprogrammierung, die vom GNU Projekt entwickelt wurden. Diese Tools sind für …   Deutsch Wikipedia

  • makefile — komponavimo failas statusas T sritis informatika apibrėžtis Failas, turintis informaciją, kaip automatiškai parengti programą iš pirminių tekstų ir turimų komponentų. Faile yra komandos, makroapibrėžtys, parinktys ir visa kita, kas apibrėžia… …   Enciklopedinis kompiuterijos žodynas

  • Makefile — …   Википедия

  • Makefile — ● ►en n. m. ►PROG Fichier contenant la liste des fichiers à compiler, dans quel ordre, avec quel sous module du compilateur... Voir make …   Dictionnaire d'informatique francophone

  • MARM — Makefile for MARM platform (EPOC) (Computing » File Extensions) …   Abbreviations dictionary

  • MKG — Makefile (Computing » File Extensions) Mallinckrodt, Inc. (Business » NYSE Symbols) ** Mohandas Karamchand Gandhi (Governmental » Politics) * Muskegon, Michigan USA (Regional » Airport Codes) …   Abbreviations dictionary

  • Make (software) — make Original author(s) Stuart Feldman Initial release 1977 Type build automation tool In software development, Make is a utility that automatically builds executable programs and libraries from source code by rea …   Wikipedia

  • Make — Saltar a navegación, búsqueda make es una herramienta de generación o automatización de código, muy usada en los sistemas operativos tipo Unix/Linux. Por defecto lee las instrucciones para generar el programa u otra acción del fichero makefile.… …   Wikipedia Español

  • make — es una herramienta de generación o automatización de código, muy usada en los sistemas operativos tipo Unix/Linux. Por defecto lee las instrucciones para generar el programa u otra acción del fichero makefile. Las instrucciones escritas en este… …   Wikipedia Español

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”