MAKEFILE简明指南(六)(转)

MAKEFILE简明指南(六)
2010/06/08 14:54

宏(MARCRO)

       这个相信大家都十分熟悉了。在makefile中通过使用宏将可以获得很大的灵活性。下面就是在makefile中定义宏的语法:

       macroname=string

在makefile中,macroname是宏的名字,其可以是任何字母,数字和下划线的组合,最多可以有1024个字符。另外要注意的是,macroname是大小写敏感的。string是宏的定义体,可以有高达65510个字符。任何包含0个字符或只包含空白的字符串都被视为空字串(null string),此时,该宏也被视为NULL,任何其出现的地方,都会被替换为空白。

       在使用宏时,还应知道以下几个具有特殊意义的符号:

l         #  用于注释,例如:

command=ML       # compile asm file

l         \    将宏定义分作多行来写,例如:

LINKCMD = link myapp\

another, , NUL, mylib, myapp

“\”后面的回车换行符会被空格替换,上面两行相当于:

LINKCMD = link myapp another, , NUL, mylib, myapp

l         $    将宏展开,用法在后面介绍。

l         ^    如果要在宏中包含以上符号,但又不使用它们的特殊语义,则可以这样:

dir=c:\windows^\

此时,dir相当于字符串”c:\windows\”。

       以下是一些语法上的细节:

1)        在定义宏时,宏名字的第一个字符必须是该行的第一个字符;

2)        每行只能定义一个宏;

3)        在”=”两边可以有空格,但它们都会被忽略;

4)        在宏定义体中可以有空格,它们都会被视为宏的一部分;

除了可以在makefile中定义宏之外,宏定义也可以出现在NMAKE命令行中。此时,如果在宏定义中有任何空白,则必须用双引号将之括起来,例如:

NMAKE "LINKCMD = LINK /MAP"

NMAKE LINKCMD="LINK /MAP"

而像下面这样则是不允许的(等号两边有空格):

       NMAKE LINKCMD = "LINK /MAP"

       使用宏的语法如下(注意,整个语句中不能有任何空格):

       $macroname

       NMAKE会将整个语句用宏替换掉。如果宏未定义,NMAKE会用空白替换之,不会产生任何错误。如果宏的名字只有一个字符,则括号可以省略,例如:$L和$(L)是等价的。

       NMAKE为宏的使用还提供了一个很有用的特性,那就是substitution(子替换)。即是在展开宏的时候,你还可以指明将展开的宏中的某部分文本用另外的文本替换掉。例如:

       SOURCE=one.c two.c

foo.exe : $(SOURCE:.c=.obj)

       LINK $**;

展开来就是这样:

SOURCE=one.c two.c

foo.exe : one.obj two.obj

       LINK one.obj two.obj;

语句$(SOURCE:.c=.obj)表示将SOURCE中出现的所有”.c”替换为”.obj”。

由以上的例子可以看出,substitution的语法如下(注意,没有空格):

$(macroname:str1=str2)

       此外,NMAKE还提供了4组预定义的宏,它们分别是文件名宏,递归宏,命令宏和参数宏。它们都可以被重新定义,但可能会引起一些不必要的麻烦,因为它们被广泛使用。正所谓“动一发而牵全身”,一个小小的改动,甚至有可能会影响到太阳黑子的运动(蝴蝶效应),这就是使用宏的最大的弊端。

posted @ 2010-11-23 16:33  董雨  阅读(302)  评论(0编辑  收藏  举报