Prétraitement d’un makefile
Vous pouvez contrôler la session NMAKE à l’aide de directives et d’expressions de prétraitement. Les instructions de prétraitement peuvent être placées dans le makefile ou dans Tools.ini
. À l’aide de directives, vous pouvez traiter de manière conditionnelle votre makefile, afficher des messages d’erreur, inclure d’autres makefiles, annuler la définition d’une macro et activer ou désactiver certaines options.
Directives de prétraitement d'un makefile
Les directives de prétraitement ne respectent pas la casse. Le point d’exclamation initial (!
) doit apparaître au début de la ligne. Zéro ou plusieurs espaces ou onglets peuvent apparaître après le point d’exclamation, pour la mise en retrait.
!CMDSWITCHES
{ option |-
} ...+
Active ou désactive chaque option répertoriée. Les espaces ou les onglets doivent apparaître avant l’opérateur ou
-
l’opérateur+
. Aucun espace ne peut apparaître entre l’opérateur et les lettres d’option. Les lettres ne respectent pas la casse et sont spécifiées sans barre oblique (/
). Pour activer certaines options et désactiver d’autres, utilisez des spécifications distinctes de!CMDSWITCHES
.Seuls
/D
,/I
,/N
et/S
peuvent être utilisés dans un makefile. DansTools.ini
, toutes les options sont autorisées, sauf/F
,/HELP
,/NOLOGO
,/X
et/?
. Les modifications spécifiées dans un bloc de description ne prennent pas effet tant que le bloc de description suivant n’est pas appliqué. Cette directive met à jourMAKEFLAGS
; les modifications sont héritées pendant la récursivité siMAKEFLAGS
elle est spécifiée.!ERROR
SMSAffiche le texte dans l’erreur U1050, puis arrête NMAKE, même si
/K
,/I
,.IGNORE
,!CMDSWITCHES
ou le modificateur de commande tiret (-
) est utilisé. Espaces ou onglets avant que le texte ne soit ignoré.!MESSAGE
SMSAffiche du texte en sortie standard. Espaces ou onglets avant que le texte ne soit ignoré.
!INCLUDE
[<
] filename [>
]Lit le nom de fichier en tant que makefile, puis continue avec le makefile actuel. NMAKE recherche d’abord le nom de fichier dans le répertoire spécifié ou actif, puis récursivement via les répertoires de tous les makefiles parents, puis, si le nom de fichier est placé entre crochets (), dans les répertoires
< >
spécifiés par laINCLUDE
macro, qui est initialement défini sur laINCLUDE
variable d’environnement. Utile pour passer des.SUFFIXES
paramètres,.PRECIOUS
et des règles d’inférence aux makefiles récursifs.!IF
constant_expressionTraite les instructions entre
!IF
et la suivante!ELSE
ou!ENDIF
si constant_expression est évaluée à une valeur différente de zéro.!IFDEF
macro_nameTraite les instructions entre
!IFDEF
et la suivante!ELSE
ou!ENDIF
si macro_name est définie. Une macro Null est considérée comme définie.!IFNDEF
macro_nameTraite les instructions entre
!IFNDEF
et la suivante!ELSE
ou!ENDIF
si macro_name n’est pas définie.!ELSE
[IF
constant_expression macro_nameIFDEF
| macro_name ] |IFNDEF
Traite les instructions entre
!ELSE
et la suivante!ENDIF
si l’instruction précédente!IF
,!IFDEF
ou!IFNDEF
l’instruction a évalué à zéro. Les mots clés facultatifs contrôlent davantage le prétraitement.!ELSEIF
Synonyme de
!ELSE IF
.!ELSEIFDEF
Synonyme de
!ELSE IFDEF
.!ELSEIFNDEF
Synonyme de
!ELSE IFNDEF
.!ENDIF
Marque la fin d’un ,
!IFDEF
ou!IFNDEF
d’un!IF
bloc. Tout texte après!ENDIF
la même ligne est ignoré.!UNDEF
macro_nameUndefines macro_name.
Expressions utilisées dans le prétraitement d’un makefile
L’ou !IF
!ELSE IF
l’constant_expression se compose de constantes entières (en notation de langage décimal ou C), de constantes de chaîne ou de commandes. Utilisez des parenthèses pour regrouper des expressions. Les expressions utilisent un entier long signé de type C arithmétique ; les nombres sont sous forme de complément 32 bits dans la plage -2147483648 à 2147483647.
Les expressions peuvent utiliser des opérateurs qui agissent sur des valeurs constantes, des codes de sortie à partir de commandes, de chaînes, de macros et de chemins de système de fichiers.
Opérateurs de prétraitement d’un makefile
Les expressions de prétraitement makefile peuvent utiliser des opérateurs qui agissent sur des valeurs constantes, les codes de sortie des commandes, chaînes, macros et chemins d’accès du système de fichiers. Pour évaluer l’expression, le préprocesseur développe d’abord les macros, puis exécute des commandes, puis effectue les opérations. Elle évalue les opérations dans l’ordre de regroupement explicite entre parenthèses, puis dans l’ordre de priorité de l’opérateur. Il en résulte une valeur constante.
L’opérateur DEFINED
est un opérateur logique qui agit sur un nom de macro. L’expression DEFINED( macro_name )
a la valeur true si macro_name est définie, même si elle n’a pas de valeur affectée. DEFINED
en combinaison avec !IF
ou !ELSE IF
équivaut à !IFDEF
ou !ELSE IFDEF
. Toutefois, contrairement à ces directives, DEFINED
peuvent être utilisées dans des expressions complexes.
L’opérateur EXIST
est un opérateur logique qui agit sur un chemin d’accès au système de fichiers. EXIST( path )
est true si le chemin existe. Le résultat de EXIST
peut être utilisé dans des expressions binaires. Si le chemin contient des espaces, placez-le entre guillemets doubles.
Pour comparer deux chaînes, utilisez l’opérateur d’égalité (==
) ou l’opérateur d’inégalité (!=
). Placez les chaînes entre guillemets doubles.
Les constantes entières peuvent utiliser les opérateurs unaires pour la négation numérique (-
), le complément (~
) et la négation logique (!
).
Les expressions peuvent utiliser les opérateurs suivants. Les opérateurs de même priorité sont regroupés ensemble et les groupes sont répertoriés dans l'ordre de priorité décroissante. Les opérateurs unaires s’associent avec l’opérande de droite. Les opérateurs binaires de même priorité associent les opérandes de gauche à droite.
Opérateur | Description |
---|---|
DEFINED( macro_name ) |
Produit une valeur logique pour l’état de définition actuel de macro_name. |
EXIST( chemin ) |
Produit une valeur logique pour l’existence d’un fichier au chemin d’accès. |
! |
NOT logique unaire. |
~ |
Le complément d’un unaire. |
- |
Négation unaire |
* |
Multiplication. |
/ |
Division. |
% |
Modulo (reste) |
+ |
Addition. |
- |
Soustraction. |
<< |
Déplacement à gauche au niveau du bit |
>> |
Déplacement à droite au niveau du bit |
<= |
Inférieur ou égal à. |
>= |
Supérieur ou égal à. |
< |
Inférieur à. |
> |
Supérieur à. |
== |
Égalité |
!= |
Inégalité |
& |
Opérateur AND au niveau du bit. |
^ |
XOR au niveau du bit. |
| |
Opérateur OR au niveau du bit. |
&& |
AND logique. |
|| |
OR logique. |
Remarque
L’opérateur XOR au niveau du bit (^
) est identique au caractère d’échappement et doit être échappé (en tant que ^^
) lorsqu’il est utilisé dans une expression.
Exécution d’un programme en prétraitement
Pour utiliser le code de sortie d’une commande pendant le prétraitement, spécifiez la commande, avec tous les arguments, entre crochets ([ ]
). Toutes les macros sont développées avant l’exécution de la commande. NMAKE remplace la spécification de commande par le code de sortie de la commande, qui peut être utilisé dans une expression pour contrôler le prétraitement.
Exemple
!IF [my_command.exe arg1 arg2] != 0
!MESSAGE my_command.exe failed!
!ENDIF