makefile中的变量特征和C语言中的宏一样。
变量使用 =,:=,?= 和 define 定义
一些特殊的自动化变量:$< $@ $^ $*
1.变量的引用
通过 $(VAR) 或 ${VAR} 使用变量
变量的展开是严格的文本替换,所以
foo = c prog.o : prog.$(foo) $(foo) $(foo) -$(foo) prog.$(foo) 被展开后就是: prog.c : prog.c cc -c prog.c
2.变量的赋值
变量有两种赋值方式。
(1)= 递归展开
使用 = 赋值的变量,如果赋值里存在对其他变量的展开,那么其他变量的展开也会执行,也就说,使用 = 赋值时,若字符串包含对其他变量的展开,则这时其他变量不会展开,而是在该变量被展开时,其他变量才被展开
foo = $(bar) bar = $(ugh) ugh = Huh? all:;echo $(foo)
foo = $(bar),这时 $(bar)不会被展开,foo的值就是 $(bar)
bar = $(ugh), 同样,bar的值就是$(ugh)
ugh = Hub?
all:;echo $(foo),这里foo被展开,首先得到$(bar),由于foo是递归展开变量,所以bar同样会被展开,得到$(ugh),同样ugh也会被展开,得到Hub?
递归展开的好处是,同上,foo=$(bar),bar可以在后面被赋值。
如:
CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar
(2):= 直接展开变量
赋值直接展开变量,若赋值的字符串 中有对其他变量的展开,则其他变量会立即展开。
x := foo y := $(x) bar x := later 就等价于: y := foo bar x := later
推荐使用直接展开,因为变量的表现更好预测。
(3)?= 操作符
做变量没有赋值,则被赋值,否则忽略
3.变量的高级用法
$(VAR:A=B),将变量VAR中以A结尾的字符,替换成以B结尾
foo := a.o b.o c.o
bar := $(foo:.o=.c)
也可以这样,这样更通用
oo := a.o b.o c.o
bar := $(foo:%.o=%.c)
4.变量的取值
一个变量可以通过以下几种方式来获得值: 在运行make时通过命令行选项来取代一个已定义的变量值。参考 6.7 override指示符 一节 在makefile文件中通过赋值的方式(参考 6.5 如何设置变量 一节)或者使 用“ define”来为一个变量赋值(参考 6.8 多行定义 一节)。 将变量设置为系统环境变量。 所有系统环境变量都可以被make使用。参考 6.9 系统环境变量 一节 自动化变量,在不同的规则中自动化变量会被赋予不同的值。它们每一个都 有单一的习惯性用法。参考 10.5.3 自动化变量 一小节 一些变量具有固定的值。参考 10.3 隐含变量 一节
5.
6.
7.override指示符
如果make的命令行参数定义给一变量赋值,则会替换makefile文件中对该变量的赋值(使用 := = define),
如果不希望替换则使用override
override VARIABLE = VALUE 或者: override VARIABLE := VALUE 也可以对变量使用追加方式: override VARIABLE += MORE TEXT 变量在定义时使用了“ override”,则后续对它值进行追 加时,也需要使用带有“ override”指示符的追加方式。否则对此变量值的追加不会生 效。
8.多行定义
使用define实现多行定义
9.系统环境变量
系统环境变量既然是环境变量,自然会传递给子进程make
10.目标指定变量
使用目标指定变量,类似于设置局部变量,该变量的赋值只会用于该目标的规则
设置一个目标指定变量的语法为: TARGET ... : VARIABLE-ASSIGNMENT 或者: TARGET ... : override VARIABLE-ASSIGNMENT
# sample Makefile CUR_DIR = $(shell pwd) INCS := $(CUR_DIR)/include CFLAGS := -Wall –I$(INCS) EXEF := foo bar .PHONY : all clean all : $(EXEF) foo : foo.c foo : CFLAGS+=-O2 bar : bar.c bar : CFLAGS+=-g ……….. ……….. $(EXEF) : debug.h $(CC) $(CFLAGS) $(addsuffix .c,$@) –o $@ clean : $(RM) *.o *.d $(EXES)
11.模式指定变量
就是目标指定变量的合并
如
%.o : CFLAGS += -O