commande make

Objectif

Gère, met à jour et régénère des groupes de programmes.

Syntaxe

make [ -DVariable ] [ -d Option ] [ -e ] [ -i ] [ -j[Travaux] ] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ Cible ... ]

Descriptif

La commande make vous aide à gérer un ensemble de programmes. L'entrée de la commande make est une liste de spécifications de dépendance de fichier.

Il existe quatre types de ligne dans un fichier makefile: les spécifications de dépendance de fichier, les commandes shell, les affectations de variables et les commentaires. En général, les lignes peuvent être continuées d'une ligne à la suivante en les terminant par une barre oblique inversée (\). Le caractère de retour à la ligne de fin et l'espace blanc initial de la ligne suivante sont compressés dans un espace unique.

Spécifications de dépendance de fichier

Les lignes de dépendance se composent d'une ou plusieurs cibles, d'un opérateur et de zéro ou plusieurs prérequis (sources). Cela crée une relation dans laquelle les cibles dépendent des prérequis et sont généralement créées à partir de ces derniers. La relation exacte entre la cible et le prérequis est déterminée par l'opérateur qui les sépare. Les opérateurs sont les suivants:

Article Descriptif
: Une cible est considérée comme obsolète si son heure de modification est inférieure à celle de l'un de ses prérequis. Les prérequis d'une cible s'accumulent sur les lignes de dépendance lorsque cet opérateur est utilisé. La cible est supprimée si la commande make est interrompue, sauf si la cible possède le .Attribut PRECIOUS .
:: Si aucun prérequis n'est spécifié, la cible est toujours recréée. Sinon, une cible est considérée comme obsolète si l'un de ses prérequis a été modifié plus récemment que la cible. Les prérequis d'une cible ne s'accumulent pas sur les lignes de dépendance lorsque cet opérateur est utilisé. La cible n'est pas supprimée si la commande make est interrompue.

Les spécifications de dépendance de fichier comportent deux types de règles: inférence et cible. Les règles d'inférence spécifient comment une cible doit être actualisée. Ces règles ont une cible sans / (barre oblique) et un minimum de 1. (point). Les règles cible spécifient comment générer la cible. Ces règles peuvent avoir plusieurs cibles.

Exécution de fichier makefile

La commande make exécute les commandes dans le fichier makefile ligne par ligne. Lorsque make exécute chaque commande, il écrit la commande dans la sortie standard (sauf indication contraire, par exemple, à l'aide de l'indicateur -s ). Un fichier makefile doit avoir un onglet devant les commandes sur chaque ligne.

Lorsqu'une commande est exécutée via la commande make , elle utilise l'environnement d'exécution de make. Cela inclut toutes les macros de la ligne de commande vers la commande make et toutes les variables d'environnement spécifiées dans la variable MAKEFLAGS . Les variables d'environnement de la commande make écrasent toutes les variables du même nom dans l'environnement existant.
Remarque: Lorsque la commande make rencontre une ligne commençant par le mot include suivi d'un autre mot qui correspond au nom d'un fichier makefile (par exemple, include dépend), la commande make tente d'ouvrir ce fichier et de traiter son contenu comme si le contenu était affiché à l'emplacement de la ligne d'inclusion. Ce comportement se produit uniquement si la première ligne de non-commentaire du premier fichier makefile lu par la commande make n'est pas la cible .POSIX ; sinon, une erreur de syntaxe se produit.

Commentaires: Les commentaires commencent par un caractère #, n'importe où mais dans une ligne de commande shell, et se poursuivent jusqu'à la fin de la ligne.

Environnement: La commande make utilise la variable d'environnement MAKEFLAGS , si elle existe.

Règles cible

Les règles cible ont le format suivant:

target[target...] : [prerequisite...] [;command]
<Tab>command
Plusieurs cibles et prérequis sont séparés par des espaces. Tout texte qui suit le ; (point-virgule) et toutes les lignes suivantes commençant par un caractère de tabulation sont considérées comme des commandes à utiliser pour mettre à jour la cible. Une nouvelle entrée cible est démarrée lorsqu'une nouvelle ligne ne commence pas par un caractère de tabulation ou #.
Remarque: La liste des prérequis peut être vide.

Cibles spéciales

Les cibles spéciales ne peuvent pas être incluses avec d'autres cibles, c'est-à-dire qu'elles doivent être la seule cible spécifiée. Ces cibles contrôlent le fonctionnement de la commande make . Ces cibles sont les suivantes:

Article Descriptif
:VALEUR PAR DEFAUT Elle est utilisée comme règle pour toute cible (qui a été utilisée uniquement en tant que prérequis) que la commande make ne peut pas créer autrement. Seul le script shell est utilisé. La variable < (crochet du côté gauche) d'une cible qui hérite de .Les commandes DEFAULTsont définies sur le nom propre de la cible.
:IGNORER Les prérequis de cette cible sont des cibles elles-mêmes ; les erreurs provenant des commandes qui leur sont associées sont ignorées. Si aucun prérequis n'est spécifié, il s'agit de l'équivalent de la spécification de l'indicateur -i .
.POSIX Permet à la commande make d'utiliser un autre fichier de règles par défaut. Le fichier /usr/ccs/lib/posix.mkfournit les règles par défaut spécifiées dans la norme POSIX .
:PRECIOUS Les prérequis de cette cible sont les cibles elles-mêmes. :PRECIOUS empêche la suppression de la cible. Si aucun prérequis n'est spécifié, le .L'attribut PRECIOUS est appliqué à chaque cible du fichier. Généralement, lorsque make est interrompu (par exemple, avec SIGHUP, SIGTERM, SIGINTou SIGQUIT), il supprime toutes les cibles partiellement réalisées. Si make a été appelé avec les indicateurs -n, -pou -q , la cible est considérée comme ayant le paramètre .Attribut PRECIOUS .
.SCCS_GET Cette cible spéciale doit être spécifiée sans prérequis. Si cette cible spéciale est incluse dans un fichier makefile, les commandes associées à cette cible spéciale sont utilisées pour obtenir tous les fichiers SCCS introuvables dans le répertoire en cours. Les commandes par défaut utilisées pour extraire les fichiers source de SCCS sont remplacées par les commandes associées à cette cible spéciale. Lorsque des fichiers source sont nommés dans une liste de dépendances, make les traite comme n'importe quelle autre cible. Lorsqu'une cible n'a pas de dépendances, mais qu'elle est présente dans le répertoire, make suppose que le fichier est à jour. Toutefois, si un fichier SCCS nommé SCCS/s.source_file est trouvé pour une cible source_file, make vérifie également que la cible est à jour. Si la cible est manquante ou si le fichier SCCS est plus récent, make émet automatiquement les commandes spécifiées pour la cible spéciale .SCCS_GET afin d'extraire la version la plus récente. Toutefois, si la cible est accessible en écriture par quiconque, make n'extrait pas une nouvelle version.
sILENCIEUX Les prérequis de la cible sont les cibles elles-mêmes. Ainsi, les commandes associées à la cible ne sont pas écrites dans la sortie standard avant d'être exécutées. Si aucun prérequis n'est spécifié, l'attribut .SILENT est appliqué à chaque commande du fichier.
sUFFIXES Utilisez ce nom pour ajouter d'autres suffixes à la liste des suffixes de fichier reconnus par make . Les prérequis de la cible sont ajoutés à la liste des suffixes connus. Si aucun suffixe n'est spécifié, tous les suffixes précédemment spécifiés sont supprimés. Ces suffixes sont utilisés par les règles d'inférence. Pour modifier l'ordre des suffixes, vous devez spécifier une entrée .SUFFIXES vide, puis une nouvelle liste d'entrées .SUFFIXES . Un fichier makefile ne doit pas associer de commandes à .SUFFIXES.

Règles d'inférence

La commande make comporte un ensemble par défaut de règles d'inférence, que vous pouvez compléter ou remplacer par des définitions de règles d'inférence supplémentaires dans le fichier makefile. Les règles par défaut sont stockées dans le fichier externe /usr/ccs/lib/aix.mk. Vous pouvez remplacer votre propre fichier de règles en définissant la variable MAKERULES sur votre propre nom de fichier à partir de la ligne de commande. La ligne suivante montre comment modifier le fichier de règles à partir de la ligne de commande:

make MAKERULES=/pathname/filename

Les règles d'inférence sont constituées de suffixes et de commandes cible. A partir des suffixes, la commande make détermine les prérequis, et à partir des suffixes et de leurs prérequis, la commande make détermine comment mettre à jour une cible. Les règles d'inférence ont le format suivant:

rule:
<Tab>command
...

ruleprésente l'une des formes suivantes:

Article Descriptif
.s1 Règle d'inférence à suffixe unique qui décrit comment générer une cible à laquelle est ajouté l'un des suffixes uniques.
.s1.s2 Règle d'inférence à double suffixe qui décrit comment générer une cible ajoutée à .s2 avec un prérequis ajouté à .s1.

Les suffixes .s1 et .s2 sont définis comme prérequis de la cible spéciale, .SUFFIXES. Les suffixes .s1 et .s2 doivent être des suffixes connus au moment où la règle d'inférence est affichée dans le fichier makefile. Les règles d'inférence utilisent les suffixes dans l'ordre dans lequel ils sont spécifiés dans .SUFFIXES. Une nouvelle règle d'inférence est démarrée lorsqu'une nouvelle ligne ne commence pas par un<Tab>ou #.

Plusruleest vide, par exemple:

rule: ;

L'exécution n'a aucun effet et la commande make reconnaît que le suffixe existe, mais n'effectue aucune action lorsque les cibles sont obsolètes.

Un ~ (tilde) dans les règles précédentes fait référence à un fichier SCCS. Par conséquent, la règle .c~.otransforme un fichier de prérequis en langage C SCCS en fichier objet (.o). Parce que les . du fichier SCCS est un préfixe, il est incompatible avec la vue de suffixe de la commande make . Le ~ (tilde) est un moyen de changer une référence de fichier en une référence de fichier SCCS.

Bibliothèques

Une cible ou un prérequis peut également être membre d'une bibliothèque d'archives et est traité comme tel s'il existe des parenthèses dans le nom. Par exemple, library (name) indique que name est un membre de la bibliothèque d'archives library. Pour mettre à jour un membre d'une bibliothèque à partir d'un fichier particulier, vous pouvez utiliser le format .s1.a, où un fichier avec le suffixe .s1 est utilisé pour mettre à jour un membre de la bibliothèque d'archives. Le fichier .a fait référence à une bibliothèque d'archives.

Utilisation de macros

Dans les fichiers makefile, les définitions de macro sont définies au format suivant:

variable=value

Les macros peuvent être affichées dans le fichier makefile, comme suit:

  • Si une macro est affichée dans une ligne cible, elle est évaluée lorsque la ligne cible est lue.
  • Si une macro est affichée dans une ligne de commande, elle est évaluée lors de l'exécution de la commande.
  • Si une macro est affichée dans une ligne de définition de macro, elle est évaluée lorsque la nouvelle macro est affichée dans une règle ou une commande.

Si une macro n'a pas de définition, elle prend par défaut la valeur NULL. Une nouvelle définition de macro remplace une macro existante du même nom. Les affectations de macros peuvent provenir des éléments suivants, dans l'ordre indiqué:

  1. Règles d'inférence par défaut
  2. Contenu de l'environnement
  3. Fichiers makefile
  4. Lignes de commande.
    Remarque: L'indicateur -e permet aux variables d'environnement de remplacer celles définies dans le fichier makefile.
La macro SHELL est spéciale. Elle est définie par la commande make sur le nom de chemin de l'interpréteur de commandes shell (/usr/bin/sh). Toutefois, s'il est redéfini dans le fichier makefile ou sur la ligne de commande, ce paramètre par défaut est remplacé.
Remarque: La macro SHELL n'affecte pas et n'est pas affectée par la variable d'environnement SHELL .

Commandes Shell

Chaque cible peut être associée à une série de commandes shell, généralement utilisées pour créer la cible. Chacune des commandes de ce script doit être précédée d'un onglet. N'importe quelle cible peut être affichée sur une ligne de dépendance, mais une seule de ces dépendances peut être suivie d'un script de création, sauf si l'opérateur :: est utilisé.

Si le premier ou les deux premiers caractères de la ligne de commande sont @ (signe arobase),-(trait d'union) et + (signe plus), la commande est traitée comme suit:

Article Descriptif
@ Fait en sorte que la commande ne soit pas répercutée avant son exécution.
- Permet d'ignorer tout état de sortie différent de zéro de la ligne de commande.
+ Entraîne l'exécution d'une ligne de commande, même si les options -n, -qou -t sont spécifiées.

Une commande qui ne comporte pas de métacaractères est directement exécutée par la commande make . Par exemple, la commande make consigne la première commande de l'exemple suivant dans le shell car elle contient le métacaractère shell > (signe supérieur à). La deuxième commande de l'exemple suivant ne contient pas de métacaractères de shell, c'est pourquoi la commande make l'exécute directement:

target: dependency
        cat dependency > target
        chmod a+x target

Le contournement de l'interpréteur de commandes permet de gagner du temps, mais il peut entraîner des problèmes. Par exemple, en tentant d'exécuter un script shell C à partir d'un fichier makefile en définissant la macro SHELL sur/bin/cshne fonctionnera pas sauf si la ligne de commande contient également au moins un métacaractère shell.

SHELL=/bin/csh
   
target: dependency
        my_csh_script

Ce fichier makefile échoue car la commande make tente de s'exécutermy_csh_scriptau lieu de l'envoyer à la coque C.

Affectations de variables

Les variables de la commande make sont similaires aux variables de l'interpréteur de commandes et sont composées de toutes les lettres majuscules. L'opérateur = affecte des valeurs à des variables. Toute variable précédente est ensuite remplacée. Tout espace avant la valeur affectée est supprimé.

Les valeurs peuvent être ajoutées aux valeurs de macro comme suit:
macro += word ... 
macro += macro1 

L'opérateur + =, lorsqu'il est utilisé à la place de =, ajoute la nouvelle valeur avec un espace unique entre le contenu précédent de la variable et la valeur ajoutée.

Les variables sont utilisées en entourant le nom de la variable avec { } (accolades) ou () (parenthèses) et le faire précéder d'un signe $ (dollar). Si le nom de la variable ne contient qu'une seule lettre, les accolades ou les parenthèses ne sont pas obligatoires. Cette forme plus courte n'est pas recommandée.

La substitution de variable se produit à deux moments distincts, selon l'endroit où la variable est utilisée. Les variables des lignes de dépendance sont développées à mesure que la ligne est lue. Les variables des commandes shell sont développées lors de l'exécution de la commande shell .

Les quatre classes de variables (par ordre de priorité croissante) sont les suivantes:

Article Descriptif
Environnement Variables définies dans l'environnement de la commande make .
Global Variables définies dans le fichier makefile ou dans les fichiers makefile inclus.
Ligne de commande Variables définies dans le cadre de la ligne de commande.
Locale Variables définies spécifiques à une cible donnée. Les variables locales sont les suivantes:
$<
Représente soit le nom complet d'un prérequis qui a rendu une cible obsolète (règle d'inférence), soit le nom complet d'une cible (.DEFAULT ).
$*
Représente la section de nom de fichier d'un prérequis qui a rendu une cible obsolète (dans une règle d'inférence) sans suffixe.
$@
Représente le nom de cible complet de la cible en cours ou la partie du nom de fichier archive de la cible d'archivage de bibliothèque.
$%
Représente un membre de bibliothèque dans une règle cible si la cible est un membre de la bibliothèque d'archivage.

Vous pouvez également utiliser ces variables locales ajoutées à D ou F:

D
Indique que la variable locale s'applique à la partie répertoire du nom. Il s'agit du préfixe de nom de chemin sans barre oblique (/) de fin. Pour les répertoires en cours, D est un. (point).
F
Indique que la variable locale s'applique à la partie nom de fichier du nom.

En outre, la commande make définit ou connaît les variables suivantes:

$ Un seul $ (signe dollar), c'est-à-dire que $$ se développe en un seul signe dollar.
LANG Détermine l'environnement local à utiliser pour les catégories d'environnement local lorsque LC_ALL et la variable d'environnement correspondante (commençant par LC_) ne spécifient pas d'environnement local.
LC_ALL Détermine l'environnement local à utiliser pour remplacer les valeurs des catégories d'environnement local spécifiées par le paramètre LANG ou toute autre variable d'environnement LC_ .
LC_CTYPE Détermine l'environnement local pour l'interprétation des séquences d'octets de données texte en tant que caractères ; par exemple, les caractères mono-ou multi-octets dans les arguments.
LC_MESSAGES Détermine la langue dans laquelle les messages doivent être écrits.
MAKEFLAGS La variable d'environnement, MAKEFLAGS, peut contenir tout ce qui peut être spécifié sur la ligne de commande de make. Tout élément spécifié sur la ligne de commande de makeest ajouté à la variable MAKEFLAGS , qui est ensuite entrée dans l'environnement pour tous les programmes exécutés par make . Notez que l'opération des indicateurs -f et -p dans la variable MAKEFLAGS n'est pas définie. Les indicateurs de ligne de commande sont prioritaires sur les indicateurs -f et -p dans cette variable.
VPATH Permet de spécifier une liste de répertoires pour la recherche de prérequis. La liste des répertoires fonctionne comme la variable PATH dans SHELL. La variable VPATH peut spécifier plusieurs répertoires séparés par deux points. Par exemple :
VPATH=src:/usr/local/src

Cela indique à la commande make de rechercher les répertoires suivants dans l'ordre indiqué:

  • Le répertoire en cours (cela se produit même sans VPATH)
  • src(un sous-répertoire du répertoire en cours)
  • /usr/local/src.

Indicateurs

Article Descriptif
-D Variable Définit la valeur de Variable sur 1.
Option -d Affiche des informations détaillées sur les fichiers et les heures examinés par make (mode débogage). L'option -d sans option ou avec l'option A affiche toutes les informations de débogage disponibles. Les options de débogage sélectionnables individuellement sont les suivantes:
A
Affiche toutes les informations de débogage possibles.
a
Affiche des informations de débogage sur la recherche et la mise en cache d'archives.
d
Affiche des informations de débogage sur la recherche dans un répertoire.
g1
Affiche des informations de débogage sur le graphique d'entrée avant de créer quoi que ce soit.
g2
Affiche des informations de débogage sur le graphique d'entrée après avoir tout créé ou avant de quitter en cas d'erreur.
m
Affiche des informations de débogage sur la création de cibles, y compris les dates de modification.
s
Affiche des informations de débogage sur la recherche de suffixe.
v
Affiche des informations de débogage sur les affectations de variables.
-e Indique que les variables d'environnement remplacent les affectations de macro dans les fichiers makefile.
-f MakeFile Indique un fichier makefile à lire à la place du fichier makefile par défaut. Si MakeFile est-(trait d'union), l'entrée standard est lue. Plusieurs fichiers makefile peuvent être spécifiés et sont lus dans l'ordre spécifié.
-i Ignore la sortie non nulle des commandes shell dans le fichier makefile. Equivalent à la spécification de-(trait d'union) avant chaque ligne de commande dans le fichier makefile.
-j[Travaux] Indique le nombre de travaux parallèles que make doit utiliser pour générer les cibles indépendantes. Le paramètre Travaux peut prendre n'importe quelle valeur intégrale positive. Si Travaux n'est pas spécifié, la commande make ne limite pas le nombre de travaux parallèles pour la génération de la cible principale.
-k Poursuit le traitement après la détection d'erreurs, mais uniquement sur les cibles qui ne dépendent pas de la cible dont la création a provoqué l'erreur.
-n Affiche les commandes, mais ne les exécute pas. Toutefois, les lignes commençant par un signe + (signe plus) sont exécutées.
-P Affiche l'ensemble complet des définitions de macro et des descriptions de cible avant d'exécuter des commandes.
-q Renvoie un code de statut zéro si le fichier cible est à jour ; renvoie un code de statut unique si le fichier cible n'est pas à jour. Les cibles ne seront pas mises à jour lorsque cette option sera spécifiée. Toutefois, une ligne de commande avec le préfixe + (signe plus) sera exécutée.
-r N'utilise pas les règles par défaut.
-S Arrête la commande make si une erreur se produit. Il s'agit de la valeur par défaut et de l'opposé de l'indicateur -k .
-S N'affiche pas les commandes à l'écran lorsqu'elles sont exécutées.
-t Crée une cible ou met à jour son heure de modification pour qu'elle soit à jour. Exécute les lignes de commande commençant par un signe + (signe plus).
target Indique un nom de cible de la forme Cible ou définit la valeur des variables.

Statut de sortie

Lorsque l'option -q est spécifiée, cette commande renvoie les valeurs de sortie suivantes :

Article Descriptif
0 % L'opération a abouti.
1 seul La cible n'était pas à jour.
> 1 Une erreur s'est produite.

Sinon, cette commande renvoie les valeurs de sortie suivantes:

Article Descriptif
0 % L'opération a abouti.
> 1 Une erreur s'est produite.

Exemples

  1. Pour créer la première cible trouvée dans le fichier makefile, entrez:
    make
  2. Pour afficher, mais pas exécuter, les commandes utilisées par la commande make pour créer un fichier:
    make  -n search.o
    Cela permet de vérifier qu'un nouveau fichier de description est correct avant de l'utiliser.
  3. Pour créer un fichier makefile indiquant que pgm dépend de deux fichiers, a.o et b.o, et qu'ils dépendent à leur tour des fichiers prérequis correspondants (a.c et b.c) et d'un fichier commun, incl.h, entrez:
    pgm: a.o b.o
              c89 a.o b.o -o pgm
    a.o: incl.h a.c
              c89 -c a.c
    b.o: incl.h b.c
              c89 -c b.c
  4. Pour créer des fichiers .o optimisés à partir de fichiers .c , entrez:
    .c.o:
              c89 -c -o $*.c
    or:
    .c.o:
              c89 -c -o $<
  5. Pour afficher le contenu des règles intégrées, entrez:
    make  -p  -f /dev/null 2>/dev/null
  6. Pour utiliser la commande make en mode parallèle avec un maximum de 10 travaux parallèles à utiliser pour la génération de la cible spécifiée dans le fichier makefile, entrez:
    make -j10

Fichiers

Article Descriptif
fichier makefile Contient une liste de dépendances.
fichier makefile Contient une liste de dépendances.
s.makefile Contient une liste de dépendances. Il s'agit d'un fichier SCCS.
s.Makefile Contient une liste de dépendances. Il s'agit d'un fichier SCCS.
/usr/ccs/lib/posix.mk Contient les règles POSIX par défaut pour la commande make .
/usr/ccs/lib/aix.mk Contient des règles par défaut pour la commande make .