Gmake

Gmake

GNU Make

GNU make est la variante GNU du moteur de production make. Gmake est le fruit de la collaboration entre Richard Stallman et Roland McGrath.

Sommaire

Spécificités

Certaines des spécificités citées ci-après peuvent ne pas être strictement propres à GNU make dans la mesure où elles peuvent avoir été héritées d'autre variantes ou encore imitées par d'autres variantes mais également avoir été inventées indépendamment de part et d'autre.

Il n'est pas ici question de se substituer au (en)manuel utilisateur mais de mettre en évidences les éléments les plus remarquables.

Saveur des variables

Alors que la valeur d'une variable est traditionnellement traitée comme une macro de manière récursive au moment de son utilisation, GNU make permet la définition de variables dont la valeur est fixée au moment de leur définition.

Exemple traditionnel :

    titi = $(tata)
    tata = $(toto)
    toto = salut
    
    all:;echo $(titi)

affichera "salut" après que titi aura été évalué en tata à son tour évalué en toto finalement évalué en salut[1].

Cette première saveur est la seule connue des autres variantes de make. Celle-ci a des avantages, elle permet en particulier que la valeur finale effective ne puisse être déterminée qu'en dernière instance. Elle offre également un certaine souplesse dans l'ordre des déclarations, ainsi dans l'exemple ci-dessus, le résultat est indépendant de l'ordre des trois premières déclarations.

Cette première saveur a par contre deux désavantages. Le moindre est que les variables sont systématiquement révaluées à chacune de leur utilisation (même quand leur valeur reste constante) ce qui constitue une charge inutile dans ce cas précis. L'autre est que, dans le cas général, elle ne permet pas que sa redéfinition puisse se faire comme dans l'exemple ci-après[2]  :

    titi = jour
    toto = bon
    titi = $(toto)${titi}

Dans ce cas, la troisième ligne conduit à une définition récursive de titi qui sera rejetée comme erreur par GNU make.

La seconde saveur possible avec GNU make est illustrée par l'exemple ci-après[2] :

    x := titi
    y := $(x) tata
    x := toto

est équivalent à :

    y := titi tata
    x := toto

En d'autres termes, cette seconde saveur confère aux variables ainsi définies un comportement identique à celui des variables de la plupart des autres langages de programmation tel que le langage C par exemple.

Règles génériques

Make permet de définir des règles explicites et implicites ou génériques[3].

  • Dans une règle explicite les fichiers sources et cibles sont explicitement nommés soit sous directement forme littérale constante soit indirectement par l'intermédiaire de variables ou encore, dans le cas de GNU make par des appels de fonctions.
  • Dans une règle implicite, source et cibles sont décrites par des expressions régulières simplifiées. Quand, à défaut d'être décrite par une règle explicite, le nom d'une cible et de sa source potentielle sont conformes aux expressions régulières d'une règle générique, alors cette dernière peut s'appliquer.

Dans la plupart des variantes de make de telles expressions se réduisent à des simples couples de suffixes. Quand pour un nom de fichier cible il existe fichier source de même racine et qu'il existe un règle implicite liant le suffixe de la cible à celui du source alors la règle peut s'appliquer. Exemple :

       .c.o:
            $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

Décrit comment de manière implicite tout fichier de suffixe ".o" peut être produit à partir du fichier de suffixe ".c"

GNU make permet des expressions régulières un peu plus complexe et dont la syntaxe est analogue à celle des règles explicites. Exemple :

    %.o: %.c toto.h
            $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

On remarquera dans cet exemple que la règle génériques ainsi définie ne se limite pas à lier les suffixes ".o" et ".c" mais permet en outre d'imposer ou spécifier (selon le point de vue) une dépendance supplémentaire à un fichier particulier : "toto.h" (dans l'exemple). Dans cette syntaxe c'est le caractère "%" qui localise le motif (ou encore pattern) commun entre source et cible.

Cette syntaxe permet de ne pas se limiter au seul suffixe. Ainsi dans l'exemple :

    f%.o: g%.c 
            $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<

on impose par ailleurs que la règle générique ne s'appliquera qu'à des cible de suffixe ".o" dont le nom de fichier commence par "f" et pour un source de suffixe ".c" dont le nom de fichier commence par "g" et partageant le même motif "%". Ainsi seront concernée par la règle générique définie plus haut les couples :

     fifi.o gifi.c
     foto.o goto.c

mais pas les couples :

     fifi.o fifi.c
     goto.o goto.c

Fonctions

GNU make offre un jeu étendu de fonctions pouvant être utilisées en toute place où on pourrait trouver une référence de variable. La syntaxe d'appel à une fonction, très similaire à celle d'une référence de variable, est de la forme générale :

       ${fonction arguments}

Parmi les fonctions disponibles on peut identifier les catégories suivantes :

  • fonctions généralistes de traitement de chaînes de caractères : substitutions, extractions, recherches, filtrages, tris, etc.)
  • fonctions dédiées à la manipulations des noms de fichiers : extractions du nom de base, du suffixe, du chemin, exploitation d'expressions régulières de type "shell", de construction, de normalisation des noms(forme canonique), etc.
  • fonction permettant de construire des expressions conditionnelles simples (si, ou, et) dans le contexte de l'utilisation des fonctions[4].
  • la fonction $(foreach nom,liste,texte) qui permet de construire des listes en répétant texte pour chaque mot présent dans liste en substituant celui-ci dans chaque occurrence de de référence à nom présent dans texte.
  • la fonction $(call variable,param,param,...) qui permet d'invoquer n'importe quelle fonction construite par l'utilisateur (voir plus loin) et dont la définition est donnée par variable.
  • la fonction $(shell texte) qui permet d'exécuter une fonction en dehors de l'environnement d'accueil (commandes disponibles dans l'environnement d'accueil) et usuellement utilisé pour affecter à une variable une information sur l'environnement extérieur à make (récupérer une date, le nom de la machine, de l'utilisateur, etc.).
  • diverses fonctions permettant de connaître l'état (définie ou non), l'origine de sa définition (dans le makefile, la ligne de commande, une variable d'environnement, etc.), la saveur, la portée de toute chaîne de caractères susceptible d'identifier une variable.
  • des fonction permettant de contrôler l'exécution en levant des erreurs, des avertissement ou simplement en affichant des messages.

GNU make permet également à l'utilisateur de définir ses propres fonctions en factorisant via la définition d'une variable (le nom de la fonction) dont la valeur est combinaison d'autres fonctions et variables (formelles ou réelles).

Notes et références

  1. salut n'étant pas lui-même défini comme une variable il est traité comme une chaîne de caractères constante
  2. a  et b Il s'agit bien sûr ici juste d'un cas d'école
  3. Les règles implicites sont juste des règles génériques prédéfinies
  4. À ne pas confondre avec le code conditionnel qui permet d'exclure ou inclure de manière conditionnelle la prise en compte de certaines parties du makefile

Liens externes

  • Portail de l’informatique Portail de l’informatique
  • Portail GNU/Linux Portail GNU/Linux
Ce document provient de « GNU Make ».

Wikimedia Foundation. 2010.

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

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

Regardez d'autres dictionnaires:

  • Gmake — GNU Make (kurz gmake) ist die GNU Implementierung des in der UNIX Welt häufig gebrauchten Programms make. Gegenüber dem traditionellen Funktionsumfang enthält es eine Reihe von Erweiterungen. Auf Linux Rechnern wird als make Utility prinzipiell… …   Deutsch Wikipedia

  • FreeSWITCH — Desarrollador Equipo de desarrollo de FreeSWITCH www.freeswitch.org Información general Diseñador Anthony Minessale …   Wikipedia Español

  • FreeSWITCH — Infobox Software name = FreeSWITCH caption = status = Active language = multi lingual platform = Unix like, Windows, Sun Solaris, Mac OS X author = Anthony Minessale developer = Many contributors latest release version = 1.0.1 latest release date …   Wikipedia

  • List of build automation software — Build automation involves scripting or automating the process of compiling computer source code into binary code. Below is a list of notable tools associated with the build automation process. Contents 1 Make based tools 2 Non Make based tools 3… …   Wikipedia

  • GNU Make — Maintainer Paul D. Smith Aktuelle Version 3.82 (28. Juli 2010) Betriebssystem POSIX, Windows Lizenz GPL (Freie Software) …   Deutsch Wikipedia

  • 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

  • Microsoft Windows Services for UNIX — (SFU) is a software package produced by Microsoft which provides a Unix subsystem and other parts of a full Unix environment on Windows NT and its successors. The subsystem included is called Interix. Like the Microsoft POSIX subsystem in Windows …   Wikipedia

  • Richard Stallman — Richard Matthew Stallman Richard Stallman at the University of Pittsburgh 2010 Born March 16, 1953 (1953 03 16) (age 58) New York City, New York …   Wikipedia

  • Gnu-make — (kurz gmake) ist die GNU Implementierung des in der UNIX Welt häufig gebrauchten Programms make. Gegenüber dem traditionellen Funktionsumfang enthält es eine Reihe von Erweiterungen. Auf Linux Rechnern wird als make Utility prinzipiell diese GNU… …   Deutsch Wikipedia

  • Autotools — Logo GNU Autotools (ou GNU build system) est un terme général utilisé par la communauté anglosaxonne pour désigner l ensemble des outils de build du projet GNU. Autotools n est pas un projet GNU, mais l expression est souvent utilisée à l… …   Wikipédia en Français

Share the article and excerpts

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