Macros MAKE
Remonter à MAKE.EXE
Une macro est une variable que MAKE traduit par une chaîne à chaque fois qu'il rencontre la macro dans un fichier make. Par exemple, vous pouvez définir une macro appelée LIBNAME
, qui représente la chaîne mylib.lib
. Pour cela, tapez la ligne LIBNAME = mylib.lib
au début de votre fichier make. Puis, lorsque MAKE rencontre la macro $(LIBNAME)
, il substitue la chaîne mylib.lib
. Les macros vous permettent de créer des fichiers make modèle que vous pouvez ensuite ajuster à vos besoins.
Pour utiliser une macro dans un fichier make, tapez $(MacroName)
, où MacroName
est une macro définie. Vous pouvez utiliser des parenthèses ou accolades pour délimiter MacroName
.
MAKE interprète les macros à différents moments suivant leur emplacement dans le fichier make :
- Les macros imbriquées sont interprétées lorsque la macro de niveau le plus élevé est évoquée.
- Les macros des règles et directives sont traduites lorsque MAKE regarde en premier dans le fichier make.
- Les macros des commandes sont interprétées lorsque les commandes sont exécutées.
Si MAKE trouve une macro non définie dans un fichier make, il recherche une variable d'environnement du système d'exploitation portant le même nom (habituellement définie par SET) et utilise sa définition comme valeur. Par exemple, si vous écrivez $(PATH)
dans un fichier make sans définir PATH, MAKE utilisera la valeur de PATH définie dans AUTOEXEC.BAT. Reportez-vous aux manuels de votre système d'exploitation pour savoir comment définir des variables d'environnement.
Sommaire
Syntaxe
<NomMacro> = <texte_expansion>
Elément | Description |
---|---|
<NomMacro> |
Est sensible à la casse ( |
<texte_expansion> |
Est limité à 4 096 caractères. Le texte peut inclure les caractères alphanumériques, les signes de ponctuation et les espaces. |
Vous devez définir chaque macro sur une ligne distincte dans le fichier make, et chaque définition de macro doit commencer sur le premier caractère de la ligne. Pour plus de lisibilité, les définitions de macro sont habituellement mises au début du fichier make. Si MAKE trouve plusieurs définitions de NomMacro, la nouvelle définition remplace la précédente.
Vous pouvez également définir une macro en utilisant l'option en ligne de commande -D
. Aucun espace n'est admis avant ou après le signe égal =
. Pourtant, vous pouvez définir plusieurs macros en séparant les définitions par des espaces. Les exemples suivants montrent des macros définies sur la ligne de commande :
make -Dsourcedir=c:\projecta make -Dcommand="bcc32 -c" make -Dcommand=bcc32 option=-c
Remarque : Les macros définies dans un fichier make remplacent les macros définies sur la ligne de commande.
Substitution de chaînes dans les macros de MAKE
MAKE vous permet de substituer temporairement des caractères dans une macro déjà définie. Par exemple, si vous définissez la macro suivante :
SOURCE = f1.cpp f2.cpp f3.cpp
Vous pouvez substituer les caractères .cpp par .obj en utilisant la commande de MAKE suivante :
$(SOURCE:.cpp=.obj)
Cette substitution ne redéfinit pas la macro.
Voici les règles de substitution dans les macros :
- Syntaxe :
$(MacroName:original_text=new_text)
. - Ne placez pas d'espaces avant ou après les deux points.
- Les caractères de
texte_original
doivent être absolument identiques, en terme de majuscules et de minuscules, à la définition de la macro.
MAKE vous permet également d'utiliser les macros au sein des macros de substitution. Par exemple :
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp $(SOURCE:.cpp=$(MYEXT)) #Changes 'f1.cpp' to 'f1.C', etc.
Le symbole ^
indique à MAKE d'interpréter littéralement le prochain caractère. Cela est utile pour l'insertion d'un caractère de nouvelle ligne. Par exemple :
MYEXT=.C SOURCE=f1.cpp f2.cpp f3.cpp ($(SOURCE):.cpp=$(MYEXT)^ ) # changes 'f1.cpp f2.cpp f3.cpp' to: # f1.C # f2.C # f3.C
Le symbole ^ indique ici à MAKE de changer chaque occurrence de .cpp
en .C
suivi du caractère de nouvelle ligne.
Vous pouvez utiliser cela pour créer des règles explicites qui génèrent des fichiers de réponse pour TLIB.EXE. Par exemple :
myfile.lib: file1.obj file2.obj file3.obj TLIB $@ @&&! +-$(**: = &^ +-) !
MAKE substitue ici tous les caractères espace de la liste de dépendance par un espace suivi d'un caractère &
, du caractère de nouvelle ligne et de +-
. Le fichier de réponse résultant devrait ressembler à :
+-file1.obj & +-file2.obj & +-file3.obj & +-
Macros par défaut de MAKE
MAKE contient plusieurs macros par défaut que vous pouvez utiliser dans vos fichiers make. Le tableau suivant donne la liste de leur définition et leur interprétation dans les règles explicites et implicites :
Macro | Interprétation implicite | Interprétation explicite |
---|---|---|
$* |
chemin\fichier dépendant |
chemin\fichier cible |
$< |
chemin\fichier dépendant+ext |
chemin\fichier cible+ext |
$: |
chemin des dépendants |
chemin de la cible |
$. |
fichier dépendant+ext |
fichier cible + ext |
$& |
fichier dépendant |
fichier cible |
$** |
chemin\fichier dépendant+ext |
tous les fichiers dépendants+ext |
$? |
chemin\fichier dépendant+ext |
anciens dépendants |
Macro | Interprétation | Commentaire |
---|---|---|
_ _MSDOS_ _ |
1 |
Si DOS actif |
_ _MAKE_ _ |
0x0370 |
Version de MAKE en hexadécimal |
MAKE |
make |
Nom du fichier exécutable MAKE |
MAKEFLAGS |
options |
Les options tapées sur la ligne de commande |
MAKEDIR |
répertoire |
Répertoire de MAKE.EXE |
Modification des macros de MAKE par défaut
Si les macros par défaut ne donnent pas exactement la chaîne que vous voulez, les modificateurs de macro vous permettent d'extraire des parties de la chaîne pour correspondre à votre besoin. Les modificateurs de macro sont habituellement utilisés avec $<
ou $@
.
Pour modifier une macro par défaut, utilisez cette syntaxe :
$(NomMacro [modificateur])
Le tableau suivant donne la liste des modificateurs de macro, ainsi que des exemples d'utilisation :
Modificateur | Partie du nom de fichier développé | Exemple | Résultat |
---|---|---|---|
D |
Lecteur et répertoire |
$(<D) |
C:\PROJECTA\ |
F |
Base et extension |
$(<F) |
MYSOURCE.C |
B |
Base uniquement |
$(<B) |
MYSOURCE |
R |
Lecteur, répertoire et base |
$(<R) |
C:\PROJA\SOURCE |