Makefile中的变量
2010年03月25日
[b]Makefile[/b][b]中的变量[/b]
[b][/b]
[b][/b]
[b]在Makefile中,变量就是一个名字(像是C语言中的宏),代表一个文本字符串(变量的值)。在Makefile的目标、依赖、命令中引用一个变量的地方,变量会被它的值所取代(与C语言中宏引用的方式相同,因此其他版本的make也把变量称之为[/b][b]“[/b][b]宏[/b][b]”[/b][b])。[/b]
[b][/b]
[b]当我们定义了一个变量之后,就可以在Makefile的很多地方使用这个变量。变量的引用方式是:使用[/b][b]“[/b][b]$[/b][b](VARIABLE_NAME)[/b][b]”[/b][b]或者[/b][b]“[/b][b]${ VARIABLE_NAME }[/b][b]”[/b][b]来引用一个变量的定义。[/b]
[b][/b]
[b]美元符号[/b][b]“[/b][b]$[/b][b]”[/b][b]在Makefile中有特殊的含义,所有在命令或者文件名中使用[/b][b]“[/b][b]$[/b][b]”[/b][b]时需要用两个美元符号[/b][b]“[/b][b]$$[/b][b]”[/b][b]来表示。[/b]
[b][/b]
[b]对一个变量的引用可以在Makefile的任何上下文中,目标、依赖、命令、绝大多数指示符和新变量的赋值中。[/b]
[b][/b]
[b]变量引用的展开过程是严格的文本替换过程,就是说变量值的字符串被精确的展开在此变量被引用的地方。[/b]
[b][/b]
[b]Makefile[/b][b]中在对一些简单变量的应用,我们也可以不使用[/b][b]“[/b][b]()[/b][b]”[/b][b]和[/b][b]“[/b][b]{}[/b][b]”[/b][b]来标记变量名,而直接使用[/b][b]“[/b][b]$x[/b][b]”[/b][b]的格式来实现,此种用法仅限于变量名为单字符的情况。另外自动化变量也使用这种格式。[/b]
[b]两种变[/b][b]量定[/b][b]义[/b][b]([/b][b]赋值[/b][b]) [/b]
[b]变量的这两种不同的风格的区别在于:1. 定义方式;2. 展开时机。[/b]
[b]一 递归展开式变量 [/b]
[b]这一类型的变量的定义是通过[/b][b]“[/b][b]=[/b][b]”[/b][b]或者使用指示符[/b][b]“[/b][b]define[/b][b]”[/b][b]定义的变量。[/b]
[b][/b]
[b]这种变量的引用,在引用的地方是严格的文本替换过程,此变量值的字符串原模原样的出现在引用它的地方。[/b]
[b][/b]
[b]如果此变量定义中存在对其他变量的引用,这些被引用的变量会在它被展开的同时被展开。就是说在变量定义时,变量值中对其他变量的引用不会被替换展开,而是,变量在引用它的地方进行替换展开的同时,它所引用的其它变量才会被替换展开。[/b]
[b]看一个例子: [/b]
[b]foo = $(bar) [/b]
[b]bar = $(ugh) [/b]
[b]ugh = Huh? [/b]
[b]all:;echo $(foo) [/b]
[b]执行[/b][b]“[/b][b]make[/b][b]”[/b][b]将会打印出[/b][b]“[/b][b]Huh?[/b][b]”[/b][b]。整个变量的替换过程时这样的:首先[/b][b]“[/b][b]$(foo)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]$(bar)[/b][b]”[/b][b],接下来[/b][b]“[/b][b]$(bar)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]$(ugh)[/b][b]”[/b][b],最后[/b][b]“[/b][b]$(ugh)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]Hug?[/b][b]”[/b][b]。整个替换的过程是在执行[/b][b]“[/b][b]echo $(foo)[/b][b]”[/b][b]是进行的。[/b]
[b]其优点是: 这种类型变量的定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)。看一个这样的例子: [/b]
[b]CFLAGS = $(include_dirs) -O [/b]
[b]include_dirs = -Ifoo -Ibar [/b]
[b]“[/b][b]CFLAGS[/b][b]”[/b][b]会在命令中被展开为[/b][b]“[/b][b]-Ifoo -Ibar -O[/b][b]”[/b][b]。我们可以看到在[/b][b]“[/b][b]CFLAGS[/b][b]”[/b][b]定义中使用到了之后定义的变量[/b][b]“[/b][b]include_dirs[/b][b]”[/b][b]。[/b]
[b][/b]
[b]其缺点是: [/b]
[b](1). [/b][b]使用此风格的变量定义,可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败。[/b]
[b]CFLAGS = $(CFLAGS) [/b][b][/b]
2010年03月25日
[b]Makefile[/b][b]中的变量[/b]
[b][/b]
[b][/b]
[b]在Makefile中,变量就是一个名字(像是C语言中的宏),代表一个文本字符串(变量的值)。在Makefile的目标、依赖、命令中引用一个变量的地方,变量会被它的值所取代(与C语言中宏引用的方式相同,因此其他版本的make也把变量称之为[/b][b]“[/b][b]宏[/b][b]”[/b][b])。[/b]
[b][/b]
[b]当我们定义了一个变量之后,就可以在Makefile的很多地方使用这个变量。变量的引用方式是:使用[/b][b]“[/b][b]$[/b][b](VARIABLE_NAME)[/b][b]”[/b][b]或者[/b][b]“[/b][b]${ VARIABLE_NAME }[/b][b]”[/b][b]来引用一个变量的定义。[/b]
[b][/b]
[b]美元符号[/b][b]“[/b][b]$[/b][b]”[/b][b]在Makefile中有特殊的含义,所有在命令或者文件名中使用[/b][b]“[/b][b]$[/b][b]”[/b][b]时需要用两个美元符号[/b][b]“[/b][b]$$[/b][b]”[/b][b]来表示。[/b]
[b][/b]
[b]对一个变量的引用可以在Makefile的任何上下文中,目标、依赖、命令、绝大多数指示符和新变量的赋值中。[/b]
[b][/b]
[b]变量引用的展开过程是严格的文本替换过程,就是说变量值的字符串被精确的展开在此变量被引用的地方。[/b]
[b][/b]
[b]Makefile[/b][b]中在对一些简单变量的应用,我们也可以不使用[/b][b]“[/b][b]()[/b][b]”[/b][b]和[/b][b]“[/b][b]{}[/b][b]”[/b][b]来标记变量名,而直接使用[/b][b]“[/b][b]$x[/b][b]”[/b][b]的格式来实现,此种用法仅限于变量名为单字符的情况。另外自动化变量也使用这种格式。[/b]
[b]两种变[/b][b]量定[/b][b]义[/b][b]([/b][b]赋值[/b][b]) [/b]
[b]变量的这两种不同的风格的区别在于:1. 定义方式;2. 展开时机。[/b]
[b]一 递归展开式变量 [/b]
[b]这一类型的变量的定义是通过[/b][b]“[/b][b]=[/b][b]”[/b][b]或者使用指示符[/b][b]“[/b][b]define[/b][b]”[/b][b]定义的变量。[/b]
[b][/b]
[b]这种变量的引用,在引用的地方是严格的文本替换过程,此变量值的字符串原模原样的出现在引用它的地方。[/b]
[b][/b]
[b]如果此变量定义中存在对其他变量的引用,这些被引用的变量会在它被展开的同时被展开。就是说在变量定义时,变量值中对其他变量的引用不会被替换展开,而是,变量在引用它的地方进行替换展开的同时,它所引用的其它变量才会被替换展开。[/b]
[b]看一个例子: [/b]
[b]foo = $(bar) [/b]
[b]bar = $(ugh) [/b]
[b]ugh = Huh? [/b]
[b]all:;echo $(foo) [/b]
[b]执行[/b][b]“[/b][b]make[/b][b]”[/b][b]将会打印出[/b][b]“[/b][b]Huh?[/b][b]”[/b][b]。整个变量的替换过程时这样的:首先[/b][b]“[/b][b]$(foo)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]$(bar)[/b][b]”[/b][b],接下来[/b][b]“[/b][b]$(bar)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]$(ugh)[/b][b]”[/b][b],最后[/b][b]“[/b][b]$(ugh)[/b][b]”[/b][b]被替换为[/b][b]“[/b][b]Hug?[/b][b]”[/b][b]。整个替换的过程是在执行[/b][b]“[/b][b]echo $(foo)[/b][b]”[/b][b]是进行的。[/b]
[b]其优点是: 这种类型变量的定义时,可以引用其它的之前没有定义的变量(可能在后续部分定义,或者是通过make的命令行选项传递的变量)。看一个这样的例子: [/b]
[b]CFLAGS = $(include_dirs) -O [/b]
[b]include_dirs = -Ifoo -Ibar [/b]
[b]“[/b][b]CFLAGS[/b][b]”[/b][b]会在命令中被展开为[/b][b]“[/b][b]-Ifoo -Ibar -O[/b][b]”[/b][b]。我们可以看到在[/b][b]“[/b][b]CFLAGS[/b][b]”[/b][b]定义中使用到了之后定义的变量[/b][b]“[/b][b]include_dirs[/b][b]”[/b][b]。[/b]
[b][/b]
[b]其缺点是: [/b]
[b](1). [/b][b]使用此风格的变量定义,可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败。[/b]
[b]CFLAGS = $(CFLAGS) [/b][b][/b]