Bloques de descripción
Los bloques de descripción forman el núcleo de un archivo make. Describen los destinos o los archivos que se van a crear y sus dependencias, los archivos necesarios para crear los destinos. Un bloque de descripción puede incluir comandos que describen cómo crear los destinos a partir de las dependencias. Un bloque de descripción es una línea de dependencia, seguido opcionalmente de un bloque de comandos:
targets... : dependents...
commands...
Líneas de dependencia
Una línea de dependencia especifica uno o varios destinos y cero o más dependientes. Si un destino no existe o tiene una marca de tiempo anterior a un dependiente, NMAKE ejecuta los comandos en el bloque de comandos. NMAKE también ejecuta el bloque de comandos si el destino es un pseudodestino. A continuación se muestra un ejemplo de línea de dependencia:
hi_bye.exe : hello.obj goodbye.obj helper.lib
En esta línea de dependencia, hi_bye.exe
es el destino. Sus dependencias son hello.obj
, goodbye.obj
y helper.lib
. La línea de dependencia indica a NMAKE que compile el destino siempre que hello.obj
, goodbye.obj
o helper.lib
se hayan modificado más recientemente que hi_bye.exe
.
Un destino debe estar al principio de la línea. No se puede aplicar sangría a espacios ni pestañas. Use dos puntos (:
) para separar los destinos de los dependientes. Se permiten espacios o tabulaciones entre destinos, separadores de dos puntos (:
) y dependientes. Para dividir la línea de dependencia, use una barra diagonal inversa (\
) después de un destino o dependiente.
Antes de ejecutar bloques de comandos, NMAKE examina todas las dependencias y las reglas de inferencia aplicables para crear un árbol de dependencias. Un árbol de dependencias especifica los pasos necesarios para actualizar completamente el destino. NMAKE comprueba de forma recursiva si un dependiente es un destino en otra lista de dependencias. Después de compilar el árbol de dependencias, NMAKE comprueba las marcas de tiempo. Si alguno de los dependientes del árbol es más reciente que el destino, NMAKE compila el destino.
Destinos
La sección de destinos de una línea de dependencia especifica uno o varios destinos. Un destino puede ser cualquier nombre de archivo, nombre de directorio o pseudodestino válido. Separe varios destinos mediante uno o varios espacios o pestañas. Los destinos no distinguen mayúsculas de minúsculas. Se permiten rutas de acceso con nombres de archivo. Un destino y su ruta de acceso no pueden superar los 256 caracteres. Si el destino anterior a los dos puntos es un solo carácter, use un espacio de separación. De lo contrario, NMAKE interpreta la combinación de letra-dos puntos como especificador de unidad.
Destinos múltiples
NMAKE evalúa varios destinos en una sola dependencia como si cada uno se especificara en un bloque de descripción independiente.
Por ejemplo, esta regla:
bounce.exe leap.exe : jump.obj
echo Building...
se evalúa como:
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
Dependencias acumuladas
Las dependencias son acumulativas en un bloque de descripción, si se repite un destino.
Por ejemplo, este conjunto de reglas,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
se evalúa como:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Cuando tiene varios destinos en diversas líneas de dependencia en un único bloque de descripción, NMAKE los evalúa como si cada uno se especificara en un bloque de descripción independiente. Sin embargo, solo los destinos de la última línea de dependencia usan el bloque de comandos. NMAKE intenta usar una regla de inferencia para los demás destinos.
Por ejemplo, este conjunto de reglas,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
se evalúa como:
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...
Destinos de bloques de descripción múltiples
Para actualizar un destino en más de un bloque de descripción mediante comandos diferentes, especifique dos puntos consecutivos (::) entre destinos y dependientes.
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
Efectos secundarios de las relaciones de dependencia
Puede especificar un destino con dos puntos (:) en dos líneas de dependencia en diferentes ubicaciones. Si los comandos aparecen después de una de las líneas, NMAKE interpreta las dependencias como si las líneas estuvieran adyacentes o combinadas. No invoca una regla de inferencia para la dependencia que no tiene comandos. En su lugar, NMAKE asume que las dependencias pertenecen a un bloque de descripción y ejecuta los comandos especificados con la otra dependencia. Tenga en cuenta este conjunto de reglas:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
se evalúa como:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
Este efecto no se produce si se usan dos puntos consecutivos (::
). Por ejemplo, este conjunto de reglas:
bounce.exe :: jump.obj
echo Building bounce.exe...
bounce.exe :: up.obj
se evalúa como:
bounce.exe : jump.obj
echo Building bounce.exe...
bounce.exe : up.obj
# invokes an inference rule
Pseudodestinos
Un pseudodestino es una etiqueta que se usa en lugar de un nombre de archivo en una línea de dependencia. Se interpreta como un archivo que no existe, por lo que está obsoleto. NMAKE supone que la marca de tiempo de un pseudodestino es la misma que la más reciente de todos sus dependientes. Si no tiene dependientes, se presupone la hora actual. Si se usa un pseudodestino como destino, sus comandos siempre se ejecutan. Un pseudodestino utilizado como dependiente también debe aparecer como destino en otra dependencia. Sin embargo, esa dependencia no necesita tener un bloque de comandos.
Los nombres de pseudodestinos siguen las reglas de sintaxis de nombre de archivo para los destinos. Sin embargo, si el nombre no tiene una extensión, puede superar el límite de 8 caracteres para los nombres de archivo y puede tener hasta 256 caracteres.
Los pseudodestinos son útiles cuando se quiere que NMAKE compile más de un destino automáticamente. NMAKE solo compila destinos especificados en la línea de comandos. O bien, si no se especifica ningún destino de línea de comandos, solo compila el primer destino en la primera dependencia del archivo make. Puede indicar a NMAKE que compile varios destinos sin enumerarlos individualmente en la línea de comandos. Escriba un bloque de descripción con una dependencia que contenga un pseudodestino y enumere los destinos que desea compilar como sus dependientes. A continuación, coloque este bloque de descripción primero en el archivo make o especifique el pseudodestino en la línea de comandos de NMAKE.
En este ejemplo, UPDATE es un pseudodestino.
UPDATE : *.*
COPY $** c:\product\release
Cuando se evalúa UPDATE, NMAKE copia todos los archivos del directorio actual en la unidad y el directorio especificados.
En el siguiente archivo make, el pseudodestino all
compila project1.exe
y project2.exe
si se especifica o all
si no se especifica ningún destino en la línea de comandos. El pseudodestino setenv
cambia la variable de entorno LIB antes de actualizar los archivos .exe
:
all : setenv project1.exe project2.exe
project1.exe : project1.obj
LINK project1;
project2.exe : project2.obj
LINK project2;
setenv :
set LIB=\project\lib
Dependientes
En una línea de dependencia, especifique cero o más dependientes después de los dos puntos (:
) o dos puntos consecutivos (::
), usando cualquier nombre de archivo o pseudodestino válidos. Separe varios dependientes mediante uno o varios espacios o pestañas. Los dependientes no distinguen mayúsculas de minúsculas. Se permiten rutas de acceso con nombres de archivo.
Dependientes inferidos
Junto con los dependientes que se enumeran explícitamente en la línea de dependencia, NMAKE puede presuponer una dependencia inferida. Un dependiente inferido se deriva de una regla de inferencia y se evalúa antes de dependientes explícitos. Cuando un dependiente inferido está obsoleto en comparación con su destino, NMAKE invoca el bloque de comandos para la dependencia. Si no existe un dependiente inferido o está obsoleto en comparación con sus propios dependientes, NMAKE actualiza primero el dependiente inferido. Para obtener más información sobre los dependientes inferidos, vea Reglas de inferencia.
Rutas de búsqueda para dependientes
Puede especificar una ruta de búsqueda opcional para cada dependiente. Esta es la sintaxis para especificar un conjunto de directorios que se van a buscar:
{directorio[;directorio...]}dependiente
Incluya los nombres de directorio entre llaves ({ }
). Separe varios directorios con un punto y coma (;
). No se permiten espacios ni tabulaciones. NMAKE busca el dependiente primero en el directorio actual y, a continuación, en la lista de directorios en el orden especificado. Puede usar una macro para especificar toda una ruta de acceso de búsqueda o parte de la ruta. Solo el dependiente especificado usa esta ruta de acceso de búsqueda.
Ejemplo de ruta de acceso de búsqueda de directorios
Esta línea de dependencia muestra cómo crear una especificación de directorio para una búsqueda:
reverse.exe : {\src\omega;e:\repo\backwards}retro.obj
El destino reverse.exe
tiene un dependiente, retro.obj
. La lista entre llaves especifica dos directorios. NMAKE busca primero retro.obj
en el directorio actual. Si no está allí, NMAKE busca en el directorio \src\omega
y, a continuación, en el directorio e:\repo\backwards
.