nmake是微软的make工具,用来管理多文件的c++工程。基本的使用方法是
nmake /F makefile_name target_name
如果没有指定/F选项,nmake就在当前目录下查找名为makefile的文件;如果不指定target的话nmake会使用makefile中的缺省target。
一个makefile由Discription Block,Commands,Macros,Inference Rules,Dot Directives和Preprecessing Directives组成。
1. 依赖关系和命令行
依赖关系和命令行是makefile最基本的组成单元。每个依赖关系由target及其dependent组成,其基本格式如下所示:
target_1 ... target_m: dependent_1 ... dependent_n
表示target_1 ... target_m依赖于 dependent_1 ... dependent_n。每个target和dependent都是一个文件名。target和dependent不是绝对的概念,都是相对某个依赖关系而言的,一个依赖关系中的target可能在另外一个依赖关系中是dependent,反过来说一个依赖关系中的dependent在另外一个依赖关系中可能是一个target。
如果target表示的文件并不真实存在,这样的target称为虚假target。虚假target也可以作为dependent,但前提是它必须在某个依赖关系中是target。
依赖关系后会跟有0或多个命令行,其基本格式如下
target_1 ... target_m: dependent_1 ... dependent_n
command_1
...
command_k
注意格式:依赖关系描述中至少有一个target,而dependent可以有0个或者多个。target必须在每行的起始处,前面不能有任何空格或者制表符。target和dependent之间用冒号分开,冒号前后允许有空格或者制表符。命令行和依赖关系描述行之间不能有空行,但是允许有只包含空格和制表符的行(这样的行看起来是空行,实际不是,因为它包含不可见的空格或者制表符)。命令行之间允许有空行,但是每行命令必须空格、制表符的任意组合开头。
target和dependent满足特定的条件时,命令行才会执行,暂时把这个条件称之为target过期(out-of-date),把命令行的执行称之为target更新。如果某个target 满足以下三个条件中的任何一个
(a) 不存在
(b) 存在,但它的时间戳比某个dependent的新
(c) 是虚假target
这个target就过期了,它的命令行就会执行,即该target被更新。如果该target的某个dependent本身也是一个target,并且这个dependent也过期了,那么该dependent会先于它的target进行更新。由此可见,target更新是个递归的过程,而且dependent会先于它的target进行更新。
如果没有指定/S、.SILENT、!CMDSWITCHES、或者@,命令行在执行的过程中会首先把命令打印出来。
nmake /F makefile_name target_name
如果没有指定/F选项,nmake就在当前目录下查找名为makefile的文件;如果不指定target的话nmake会使用makefile中的缺省target。
一个makefile由Discription Block,Commands,Macros,Inference Rules,Dot Directives和Preprecessing Directives组成。
1. 依赖关系和命令行
依赖关系和命令行是makefile最基本的组成单元。每个依赖关系由target及其dependent组成,其基本格式如下所示:target_1 ... target_m: dependent_1 ... dependent_n
表示target_1 ... target_m依赖于 dependent_1 ... dependent_n。每个target和dependent都是一个文件名。target和dependent不是绝对的概念,都是相对某个依赖关系而言的,一个依赖关系中的target可能在另外一个依赖关系中是dependent,反过来说一个依赖关系中的dependent在另外一个依赖关系中可能是一个target。
如果target表示的文件并不真实存在,这样的target称为虚假target。虚假target也可以作为dependent,但前提是它必须在某个依赖关系中是target。
依赖关系后会跟有0或多个命令行,其基本格式如下
target_1 ... target_m: dependent_1 ... dependent_n
command_1
...
command_k
注意格式:依赖关系描述中至少有一个target,而dependent可以有0个或者多个。target必须在每行的起始处,前面不能有任何空格或者制表符。target和dependent之间用冒号分开,冒号前后允许有空格或者制表符。命令行和依赖关系描述行之间不能有空行,但是允许有只包含空格和制表符的行(这样的行看起来是空行,实际不是,因为它包含不可见的空格或者制表符)。命令行之间允许有空行,但是每行命令必须空格、制表符的任意组合开头。
target和dependent满足特定的条件时,命令行才会执行,暂时把这个条件称之为target过期(out-of-date),把命令行的执行称之为target更新。如果某个target 满足以下三个条件中的任何一个
(a) 不存在
(b) 存在,但它的时间戳比某个dependent的新
(c) 是虚假target
这个target就过期了,它的命令行就会执行,即该target被更新。如果该target的某个dependent本身也是一个target,并且这个dependent也过期了,那么该dependent会先于它的target进行更新。由此可见,target更新是个递归的过程,而且dependent会先于它的target进行更新。
如果没有指定/S、.SILENT、!CMDSWITCHES、或者@,命令行在执行的过程中会首先把命令打印出来。