Blocs de description
Les blocs de description forment le cœur d’un makefile. Ils décrivent les cibles, ou les fichiers à créer, ainsi que leurs dépendances, les fichiers nécessaires pour créer les cibles. Un bloc de description peut inclure des commandes qui décrivent comment créer les cibles à partir des dépendances. Un bloc de description est une ligne de dépendance, éventuellement suivie d’un bloc de commandes :
targets... : dependents...
commands...
Lignes de dépendance
Une ligne de dépendance spécifie une ou plusieurs cibles, et zéro ou plusieurs dépendants. Si une cible n’existe pas ou a un horodatage antérieur à un horodatage dépendant, NMAKE exécute les commandes dans le bloc de commandes. NMAKE exécute également le bloc de commandes si la cible est un pseudotarget. Voici un exemple de ligne de dépendance :
hi_bye.exe : hello.obj goodbye.obj helper.lib
Dans cette ligne de dépendance, hi_bye.exe
est la cible. Ses dépendances sont hello.obj
, goodbye.obj
et helper.lib
. La ligne de dépendance indique à NMAKE de générer la cible chaque fois hello.obj
que , goodbye.obj
ou helper.lib
a changé plus récemment que hi_bye.exe
.
Une cible doit être au début de la ligne. Il ne peut pas être mis en retrait avec des espaces ou des onglets. Utilisez un signe deux-points (:
) pour séparer les cibles des dépendants. Les espaces ou les onglets sont autorisés entre les cibles, le séparateur deux-points (:
) et les dépendants. Pour fractionner la ligne de dépendance, utilisez une barre oblique inverse (\
) après une cible ou une dépendance.
Avant d’exécuter des blocs de commandes, NMAKE analyse toutes les dépendances et toutes les règles d’inférence applicables pour générer une arborescence de dépendances. Une arborescence de dépendances spécifie les étapes requises pour mettre à jour entièrement la cible. NMAKE vérifie de manière récursive si un dépendant est lui-même une cible dans une autre liste de dépendances. Une fois l’arborescence des dépendances générée, NMAKE vérifie les horodatages. Si des dépendants de l’arborescence sont plus récents que la cible, NMAKE génère la cible.
Targets
La section cibles d’une ligne de dépendance spécifie une ou plusieurs cibles. Une cible peut être n’importe quel nom de fichier, nom de répertoire ou pseudotarget valide. Séparez plusieurs cibles à l’aide d’un ou plusieurs espaces ou onglets. Les cibles ne respectent pas la casse. Les chemins d’accès sont autorisés avec des noms de fichiers. Une cible et son chemin d’accès ne peuvent pas dépasser 256 caractères. Si la cible qui précède le signe deux-points est un caractère unique, utilisez un espace de séparation. Sinon, NMAKE interprète la combinaison de points de lettre comme spécificateur de lecteur.
Cibles multiples
NMAKE évalue plusieurs cibles dans une seule dépendance comme si chacune d’elles a été spécifiée dans un bloc de description distinct.
Par exemple, cette règle :
bounce.exe leap.exe : jump.obj
echo Building...
est évalué comme suit :
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
Dépendances cumulatives
Les dépendances sont cumulatives dans un bloc de description, si une cible est répétée.
Par exemple, cet ensemble de règles,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
est évalué comme suit :
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Lorsque vous avez plusieurs cibles dans plusieurs lignes de dépendance dans un bloc de description unique, NMAKE les évalue comme si chacune d’elles était spécifiée dans un bloc de description distinct. Toutefois, seules les cibles de la dernière ligne de dépendance utilisent le bloc de commandes. NMAKE tente d’utiliser une règle d’inférence pour les autres cibles.
Par exemple, cet ensemble de règles,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
est évalué comme suit :
leap.exe : jump.obj
# invokes an inference rule
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
climb.exe : up.obj
echo Building bounce.exe...
Cibles dans des blocs de description multiples
Pour mettre à jour une cible dans plusieurs blocs de description à l’aide de commandes différentes, spécifiez deux points-virgules consécutifs ( ::) entre les cibles et les dépendants.
target.lib :: one.asm two.asm three.asm
ml one.asm two.asm three.asm
lib target one.obj two.obj three.obj
target.lib :: four.c five.c
cl /c four.c five.c
lib target four.obj five.obj
Effets secondaires des dépendances
Vous pouvez spécifier une cible avec un signe deux-points (:) dans deux lignes de dépendance à différents emplacements. Si les commandes apparaissent après une seule ligne, NMAKE interprète les dépendances comme si les lignes étaient adjacentes ou combinées. Elle n’appelle pas de règle d’inférence pour la dépendance qui n’a aucune commande. Au lieu de cela, NMAKE suppose que les dépendances appartiennent à un bloc de description et exécute les commandes spécifiées avec l’autre dépendance. Tenez compte de cet ensemble de règles :
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
est évalué comme suit :
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Cet effet ne se produit pas si un double signe deux-points (::
) est utilisé. Par exemple, cet ensemble de règles :
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
est évalué comme suit :
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
Pseudocibles
Un pseudotarget est une étiquette utilisée à la place d’un nom de fichier dans une ligne de dépendance. Il est interprété comme un fichier qui n’existe pas, et il est donc obsolète. NMAKE suppose que l’horodatage d’un pseudotarget est le même que le plus récent de tous ses dépendants. S’il n’a pas de dépendance, l’heure actuelle est supposée. Si un pseudotarget est utilisé comme cible, ses commandes sont toujours exécutées. Un pseudotarget utilisé comme dépendant doit également apparaître en tant que cible dans une autre dépendance. Toutefois, cette dépendance n’a pas besoin d’avoir un bloc de commandes.
Les noms pseudotarget suivent les règles de syntaxe de nom de fichier pour les cibles. Toutefois, si le nom n’a pas d’extension, il peut dépasser la limite de 8 caractères pour les noms de fichiers et peut comporter jusqu’à 256 caractères.
Les pseudotargets sont utiles lorsque vous souhaitez que NMAKE génère automatiquement plusieurs cibles. NMAKE génère uniquement des cibles spécifiées sur la ligne de commande. Ou, si aucune cible de ligne de commande n’est spécifiée, elle génère uniquement la première cible dans la première dépendance dans le makefile. Vous pouvez indiquer à NMAKE de générer plusieurs cibles sans les répertorier individuellement sur la ligne de commande. Écrivez un bloc de description avec une dépendance contenant un pseudotarget et listez les cibles que vous souhaitez générer en tant que dépendants. Ensuite, placez ce bloc de description en premier dans le makefile, ou spécifiez le pseudo-target sur la ligne de commande NMAKE.
Dans cet exemple, UPDATE est un pseudotarget.
UPDATE : *.*
COPY $** c:\product\release
Lorsque UPDATE est évalué, NMAKE copie tous les fichiers du répertoire actif vers le lecteur et le répertoire spécifiés.
Dans le makefile suivant, le pseudotarget all
génère les deux project1.exe
et project2.exe
si l’une all
ou l’autre cible n’est spécifiée sur la ligne de commande. Le pseudotarget setenv
modifie la variable d’environnement LIB avant la mise à jour des .exe
fichiers :
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
Dépendants
Dans une ligne de dépendance, spécifiez zéro ou plusieurs dépendants après le signe deux-points (:
) ou le double-signe (::
), à l’aide de n’importe quel nom de fichier ou pseudotarget valide. Séparez plusieurs dépendants à l’aide d’un ou plusieurs espaces ou onglets. Les dépendants ne respectent pas la casse. Les chemins d’accès sont autorisés avec des noms de fichiers.
Dépendants inférés
Outre les dépendances que vous répertoriez explicitement dans la ligne de dépendance, NMAKE peut supposer une dépendance déduite. Une dépendance déduite est dérivée d’une règle d’inférence et est évaluée avant les dépendances explicites. Lorsqu’une dépendance déduite est obsolète par rapport à sa cible, NMAKE appelle le bloc de commandes pour la dépendance. Si une dépendance déduite n’existe pas ou est obsolète par rapport à ses propres dépendants, NMAKE met d’abord à jour la dépendance déduite. Pour plus d’informations sur les dépendances déduites, consultez les règles d’inférence.
Chemins de recherche des dépendants
Vous pouvez spécifier un chemin de recherche facultatif pour chaque dépendant. Voici la syntaxe permettant de spécifier un ensemble de répertoires à rechercher :
{directory[ ;répertoire...]}dépendant
Placez les noms de répertoires dans les accolades ({ }
). Séparez plusieurs répertoires avec un point-virgule (;
). Aucun espace ou onglet n’est autorisé. NMAKE recherche d’abord le dépendant dans le répertoire actif, puis dans la liste des répertoires dans l’ordre spécifié. Vous pouvez utiliser une macro pour spécifier une partie ou l’ensemble d’un chemin de recherche. Seul le dépendant spécifié utilise ce chemin de recherche.
Exemple de chemin de recherche d’annuaire
Cette ligne de dépendance montre comment créer une spécification de répertoire pour une recherche :
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
La cible reverse.exe
a un dépendant, retro.obj
. La liste entre accolades spécifie deux répertoires. NMAKE recherche d’abord retro.obj
dans le répertoire actif. Si ce n’est pas le cas, NMAKE recherche le \src\omega
répertoire, puis le e:\repo\backwards
répertoire.