学习记录(对应文档的p31-p40)
一、变量的基础
例子:
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
二、变量中的变量
例子:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo)
用变量定义变量 := 例子
x := foo
y := $(x) bar
x := later
其等价于:
y := foo bar
x := later
复杂例子,make的函数、条件表达式、系统变量MAKELEVEL
ifeq (0, ${MAKELEVEL})
cur-dir := $(shell pwd)
whoami := $(shell whoami)
host-type := $(shell arch)
MAKE := ${MAKE} host-type=${host-type} whoami=${whoami}
endif
说明:若make有一个嵌套执行的动作,MAKELEVEL记录当前Makefile的调用层数
操作符?=
FOO ?= bar
如果 FOO 没有被定义过,那么变量 FOO 的值就是“bar”,如果 FOO 先前被定义
过,那么这条语将什么也不做,其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
三、变量高级用法
变量值的替换$(var:a=b)或${var:a=b} 把变量var中所有以a结尾的a,替换成b
把变量的值再当成变量
例子:$(a)的值是“z”
x = y
y = z
a := $($(x))
例子:
a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a1)_objects:.o=.c)
这个例子中,如果$(a1)的值是“a”的话,$(sources)的值就是“a.c b.c c.c”;
如果$(a1)的值是“1”,那么$(sources)的值是“1.c 2.c 3.c”。
四、追加变量值
给变量追加值+=
objects = main.o foo.o bar.o utils.o
objects += another.o
于是,$(objects)值变成:“main.o foo.o bar.o utils.o another.o”
五、override指示符
如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋值会被忽略。
如果你想在Makefile 中设置这类参数的值,那么,你可以使用“override”指示符。
override <variable> = <value>
override <variable> := <value>
可以追加:
override <variable> += <more text>
对于多行的变量定义,我们用define指示符,在define指示符前,也同样可以使用ovveride
override define foo
bar
endef
六、多行变量
设置变量值的方法define
define two-lines
echo foo
echo $(bar)
endef
七、环境变量
make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中
如果 Makefile 中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变
量的值将被覆盖。(如果 make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefile 中
定义的变量)
如果在环境变量中设置了“CFLAGS”环境变量,就可以在所有的Makefile 中使用这个变量。
这对于我们使用统一的编译参数有比较大的好处。
如果Makefile中定义了CFLAGS,那么则会使用 Makefile 中的这个变量,
如果没有定义则使用系统环境变量的值
八、目标变量
为某个目标设置局部变量,这种变量被称为“Target-specific Variable”,可以和“全局变
量”同名,因为它的作用范围只在这条规则以及连带规则中
<target ...> : <variable-assignment>
<target ...> : overide <variable-assignment>
说明:<variable-assignment>可以是前面讲过的各种赋值表达式,如“=”、“:=”、“+=”
是“?=”。
九、模式变量Pattern-specific Variable
make 的“模式”一般是至少含有一个“%”
以如下方式给所有以[.o]结尾的目标定义目标变量:
%.o : CFLAGS = -O
同样,模式变量的语法和“目标变量”一样:
<pattern ...> : <variable-assignment>
<pattern ...> : override <variable-assignment>
override 同样是针对于系统环境传入的变量,或是make命令行指定的变量。
第八部分 使用条件判断
一、示例:判断$(CC)变量是否“gcc”,如果是,则使用 GNU 函数编译目标。