Recherche…


Référencement d'une variable

Pour utiliser la valeur stockée dans une variable, utilisez le signe dollar suivi du nom de la variable entre parenthèses ou accolades.

x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same

Si le nom d'une variable ne comporte qu'un seul caractère, les parenthèses / accolades peuvent être omises (par exemple, $x ). Cette pratique est utilisée pour les variables automatiques (voir ci-dessous), mais n'est pas recommandée pour les variables à usage général.

Variables simplement étendues

Les variables simplement développées se comportent comme des variables issues des langages de programmation traditionnels. L'expression du côté droit est évaluée et le résultat est stocké dans la variable. Si la partie droite contient une référence de variable, cette variable est développée avant que l’affectation ait lieu.

x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"

Une autre forme consiste à utiliser l'attribution à deux points:

x ::= hello

L'attribution des deux points et des deux points est équivalente. Le standard make POSIX ne mentionne que le formulaire ::= , de sorte que les mises en œuvre avec une conformité stricte aux normes peuvent ne pas prendre en charge la version à un seul point.

Variables à extension récursive

Lorsque vous définissez une variable récursivement étendue, le contenu du côté droit est stocké tel quel. Si une référence de variable est présente, la référence elle-même est stockée (pas la valeur de la variable). Attendez de développer les références de variable jusqu'à ce que la variable soit réellement utilisée.

x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"

Dans cet exemple, la définition de y est récursive. La référence à $(x) n'est pas développée tant que $(y) n'est pas développé. Cela signifie que chaque fois que la valeur de x change, la valeur de y change également.

Les variables récursivement étendues sont un outil puissant mais facilement incompris. Ils peuvent être utilisés pour créer des constructions qui ressemblent à des modèles ou des fonctions, ou même pour générer automatiquement des parties d'un fichier Make. Ils peuvent également être la source de problèmes difficiles à déboguer. Veillez à utiliser uniquement les variables récursivement étendues si nécessaire.

Variables Automatiques

Dans le contexte d'une règle individuelle, Make définit automatiquement un certain nombre de variables spéciales. Ces variables peuvent avoir une valeur différente pour chaque règle d'un fichier makefile et sont conçues pour simplifier l'écriture des règles. Ces variables ne peuvent être utilisées que dans la partie recette d'une règle.

Variable La description
$@ Nom de fichier de la cible de la règle
$% Le nom du membre cible, si la cible de la règle est une archive
$< Nom de fichier du premier prérequis
$^ Liste de tous les prérequis
$? Liste de tous les prérequis plus récents que la cible
$* La "racine" d'une règle implicite ou de motif

L'exemple suivant utilise des variables automatiques pour générer une règle générique. Cela indique comment créer un fichier .o à partir d'un fichier .c portant le même nom. Comme nous ne connaissons pas le nom spécifique des fichiers affectés, nous utilisons $@ comme espace réservé pour le nom du fichier de sortie et $^ comme espace réservé pour la liste de prérequis (dans ce cas, la liste des fichiers d'entrée).

%.o: %.c
    cc -Wall $^ -c $@

Affectation variable conditionnelle

L'opérateur ?= Est une extension qui se comporte comme = , sauf que l'affectation ne se produit que si la variable n'est pas déjà définie.

x = hello
x ?= world
# $(x) will yield "hello"

Ajout de texte à une variable existante

L'opérateur += est une extension commune qui ajoute le contenu spécifié à la fin de la variable, séparés par un espace.

x = hello
x += world

Les références de variable dans la partie droite seront étendues si et seulement si la variable d'origine a été définie comme une variable simplement développée.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow