MAKEFILE简明指南(六)(转)
宏(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组预定义的宏,它们分别是文件名宏,递归宏,命令宏和参数宏。它们都可以被重新定义,但可能会引起一些不必要的麻烦,因为它们被广泛使用。正所谓“动一发而牵全身”,一个小小的改动,甚至有可能会影响到太阳黑子的运动(蝴蝶效应),这就是使用宏的最大的弊端。 |