MAKEFILE简明指南(三)(转)
Target和dependent也可以不是一个文件,而是一个标号(label)。这时,就称之为pseudotarget(伪文件)。Pseudotarget的名字不能与当前目录下的任何文件名相同。一个pseudotarget如果要作为dependent,那么它必须要作为target出现在某个dependent line中。当使用pseudotarget作为target时,与之关联的commands block一定会被执行,同时NMAKE会赋予它一个假想的time stamp。该time stamp等于它的dependents中最大的time stamp,或者,如果它没有dependent,就等于当前时间。该假想的time stamp在pseudotarget作为dependent时会被用来进行有效性评估。这个特性最大的好处就是,你可以让NMAKE构造多个target,而不用将每个target都在NMAKE的命令行中列出来,例如: all : setenv project1.exe project2.exe project1.exe : project1.obj LINK project1; project2.exe : project2.obj LINK project2; setenv : set LIB=\project\lib 上例中有两个pseudotarget,一个是all,另一个是setenv。首先是setenv被评估,其作用是设置环境变量LIB,然后project1.exe和project2.exe依次被更新. Commands Block 第二行开始到下一个dependent line之间为commands block,其给出了当dependents中的任何一个的time stamp大于target时,需要执行的指令序列(commadns block也可以为空,此时,NMAKE什么也不干)。command line必须以空白开头(刚好与dependent line相反,NMAKE就是通过该特征来分辨二者的),并且在dependent line和commands block中的第一条语句之间不能有空白行(就是除了一个换行符,什么也没有的行。所以只有一个空格或制表符的行是合法的,此时NMAKE将其解释为一个null command),但在command lines之间可以有空白行。Commands block中的每一条命令可以是在控制台中合法的任何命令。事实上大可将commands block当成一个由控制台命令序列组成的批处理文件。 此外,对commands block中的命令,还可以在其前面添加一个或多个所谓的命令修饰符(command modifier),以实现对命令的一些额外的控制。命令修饰符有以下3种: 1) @command 消除该命令的所有到STDOUT的输出。 2) –[number]command 关掉对该命令返回值的检测。在默认的情况下,如果一条命令返回非0值,则NMAKE将会停止执行。但如果在命令前加上一“-”,则NMAKE将会忽略该命令的返回值。如果“-”紧接着一个整数,则NMAKE会忽略掉任何大于该整数的返回值。 3) !command 如果该命令的执行对象为$**或$?(这两个都是预定义的宏,前者表示相应的dependent line中所有的dependent,后者表示所有比target具有更大的time stamp的dependent),则该“!”修饰符将会使该命令施行于这两个宏所描述的每一个独立的文件上。 NMAKE还提供了一些语法可以在commands block中表示相应的dependent line中第一个dependent的文件名组成。例如: foo.exe : c:\sample\first.obj c:\sample\second.obj link %s NMAKE将“link %s”解释为: link c:\sample\first.obj 如果将命令改为“link %|pfF.exe”,则NMAKE将之解释为: link c:\sample\first.exe %s表示全文件名,%|[part]F表示文件名中的某个部分,part可以是下列字符中的一个或多个,如果part为空,%|F与%s的意思相同: 1) d:盘符; 2) p:路径; 3) f:文件基本名; 4) e:文件扩展名 |