更多参见:NMAKE makefile内容和功能
描述块构成makefile的核心。它们描述了要创建的目标或文件,以及它们的依赖关系,以及创建目标所需的文件。描述块可以包括描述如何从依赖项创建目标的命令。描述块是一个依赖项行,可以选择后跟一个命令块:
targets... : dependents...
commands...
依赖行
依赖项行指定一个或多个目标,以及零个或多个依赖项。如果目标不存在,或者其时间戳早于依赖项,则NMAKE将执行命令块中的命令。如果目标是伪目标,NMAKE还会执行命令块。下面是一个依赖关系行示例:
hi_bye.exe : hello.obj goodbye.obj helper.lib
在此依赖项行中,hi_bye.exe是目标。它的依赖项是hello.obj、goodbye.obj和helper.lib。当hello.obj、goodbyee.obj或helper.lib的更改时间比hi_bye.exe的更改时间更早时,依赖项行告诉NMAKE构建目标。
目标必须位于行的开头。它不能用空格或制表符缩进。使用冒号(:)将目标与从属项分开。目标、冒号分隔符(:)和从属项之间允许使用空格或制表符。要拆分依赖项行,请在目标或依赖项后使用反斜杠(\)。
在执行命令块之前,NMAKE扫描所有依赖项和任何适用的推理规则,以构建依赖项关系树。依赖项关系树指定完全更新目标所需的步骤。NMAKE递归检查依赖项本身是否是另一个依赖项列表中的目标。在构建依赖关系树之后,NMAKE检查时间戳。如果树中的任何依赖项比目标新,NMAKE将构建目标。
目标
依赖项行的目标部分指定一个或多个目标。目标可以是任何有效的文件名、目录名或伪目标。使用一个或多个空格或制表符分隔多个目标。目标不区分大小写。目标可以是具有文件名的路径。目标及其路径不能超过256个字符。如果冒号前面的目标是单个字符,请使用分隔空格。否则,NMAKE将字母冒号组合解释为驱动器说明符。
多个目标
NMAKE在单个依赖项中计算多个目标,就像在单独的描述块中指定每个目标一样。
例如,此规则:
bounce.exe leap.exe : jump.obj
echo Building...
评估结果如下:
bounce.exe : jump.obj
echo Building...
leap.exe : jump.obj
echo Building...
累积相关性
如果目标重复,则依赖项在描述块中是累积的。
比如这套规则,,
bounce.exe : jump.obj
bounce.exe : up.obj
echo Building bounce.exe...
评估结果如下:
bounce.exe : jump.obj up.obj
echo Building bounce.exe...
当在单个描述块中的多个依赖关系行中有多个目标时,NMAKE将对其进行求值,就像在单独的描述块中指定了每个目标一样。但是,只有最后一个依赖关系行中的目标才使用命令块。NMAKE尝试对其他目标使用推理规则。
比如这套规则,,
leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
echo Building bounce.exe...
评估结果如下:
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...
同时出现在多个描述块中的目标
要使用不同的命令更新同时出现在多个描述块中的目标,请在目标和从属项之间指定两个连续的冒号(::)。
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