前面我们所讲的在 Makefile
中定义的变量都是全局变量,在整个文件,我们都可以访问这些变量。当然,自动化变量除外,如 $<
等这种类量的自动化变量就属于规则型变量,这种变量的值依赖于规则的目标和依赖目标的定义。
当然,我也同样可以为某个目标设置局部变量,这种变量被称为 Target-specific Variable
,它可以和全局变量同名,因为它的作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。而不会影响规则链以外的全局变量的值。
其语法是:
<target ...> : <variable-assignment>; <target ...> : overide <variable-assignment>点击复制复制失败已复制
<variable-assignment>;
可以是前面讲过的各种赋值表达式,如 =
、 :=
、 +=
或是 ?=
。第二个语法是针对于 make
命令行带入的变量,或是系统环境变量。
这个特性非常的有用,当我们设置了这样一个变量,这个变量会作用到由这个目标所引发的所有的规则中去。如:
prog : CFLAGS = -g prog : prog.o foo.o bar.o $(CC) $(CFLAGS) prog.o foo.o bar.o prog.o : prog.c $(CC) $(CFLAGS) prog.c foo.o : foo.c $(CC) $(CFLAGS) foo.c bar.o : bar.c $(CC) $(CFLAGS) bar.c点击复制复制失败已复制
在这个示例中,不管全局的 $(CFLAGS)
的值是什么,在 prog
目标,以及其所引发的所有规则中( prog.o foo.o bar.o
的规则), $(CFLAGS)
的值都是 -g