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.
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>commandCibles 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/filenameLes 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
...où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=valueLes 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é:
- Règles d'inférence par défaut
- Contenu de l'environnement
- Fichiers makefile
- Lignes de commande.Remarque: L'indicateur -e permet aux variables d'environnement de remplacer celles définies dans le fichier makefile.
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 targetLe 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_scriptCe 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é.
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:
Vous pouvez également utiliser ces variables locales ajoutées à D ou F:
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 :Cela indique à la commande make de rechercher les répertoires suivants dans l'ordre indiqué:
|
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:
|
| -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
- Pour créer la première cible trouvée dans le fichier makefile, entrez:
make - Pour afficher, mais pas exécuter, les commandes utilisées par la commande make pour créer un fichier:make -n search.oCela permet de vérifier qu'un nouveau fichier de description est correct avant de l'utiliser.
- 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 - 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 $< - Pour afficher le contenu des règles intégrées, entrez:
- 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 . |