1.变量值连接
x := foo
y := $(x) bar
all:
echo $(x)
echo $(y)
foo
foo bar
2.判断是否之前定义变量
FOO ?= bar
如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义
过,那么这条语将什么也不做
3.空格影响
nullstring := #null
space := $(nullstring) #space
dir := /foo/bar #ee
all:
echo $(space)/file
echo $(dir)/file
/file
/foo/bar/file
4.变量值替换
foo := a.o b.o c.o
bar := $(foo:.o=.c)
bar2 := $(foo:%.o=%.c)
all:
echo $(bar);
echo $(bar2);
a.c b.c c.c
a.c b.c c.c
5.把变量的值再变成变量的值
x = y
y = z
a := $($(x))
$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。[注意:
是“x=y”,而不是“x=$(y)”]
更上一层楼:
x = variable1
variable2 := Hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z)))
“$($($(z)))”扩展为“$($(y))”,而其再次被扩展为“$($(subst
1,2,$(x)))”。$(x)的值是“variable1”,subst 函数把“variable1”中的所有“1”字
串替换成“2”字串,于是,“variable1”变成“variable2”,再取其值,所以,最终,
$(a)的值就是$(varia ble2)的值——“Hello”。
[注释:$(sbust val1,val2,$(x)),将变量x的值中字符串“val1”替换成“val2”]
6.结合变量在取值
例1:
first_second = Hello
a = first
b = second
all = $($a_$b)
Hello
例2:
a := 1
a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a)_objects:.o=.c)
7.给变量追加值
objects = main.o foo.o bar.o utils.o
objects += another.o
8.override 外部赋值被忽略
例1:
参数赋值忽略
.PHONY: all
override foo = x
all:
@echo "foo = $(foo)"
#make -f Makefle foo=abc
foo = x
例2:
宏定义忽略
override define foo
bar
endef
9.ifeq - else - endif
例1:
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
例2:
例一:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
例二:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
例一中,“$(frobozz)”值是“yes”,例二则是“no”。
10.
待解决:
1.获取函数
func := subst
bar := a d b g q c
foo := $(subst a,x,$(bar))
all:
echo $(foo)
x d b g q c
func := subst
bar := a d b g q c
foo := $($(func) a,x,$(bar))
all:
echo $(foo)
(无数据)
2.