1、makefile 变量的命令可以包含字符、数字、下划线(可以是数字开头),并且大小写敏感
2、makefile 变量在声明的是需要对其进行赋值,而在使用该变量时需要在变量名前加上$符合 例如$(VARNAME),如果用户需要在makefile文件中使用真实的$字符,则使用$$表示。
objects = main.o kdb.o
edit : $(objects)
gcc -o edit $(objects)
用户将编译器及编译选项定义为变量,这样做增强了makefile文件的灵活性。
例:
CC = gcc
FLAGS = -c
objects = main.o kdb.o \
insert.o
edit :$(objects)
$(CC) -o edit $(objects)
main.o : main.c defs.h
$(CC) $(FLAGS) main.c
3、变量中的变量
a、使用“=”操作符
例:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo) #输出变量foo
执行makefile
结果:
$make -s all
Hus?
b、使用“:=”
使用“:=”操作符定义变量的值可以避免前述递归的危险。使用其定义变量时,前面的变量不能使用后面的变量,只能使用前面已定义好的变量。如果使用前面未定义的变量,则变量的值为空。
例:
y := $(x) bar
x := foo
all:
echo $(y) #输出变量y
.PHONY:all
执行$make -s all
bar
输出的值是变量y的值,由于在定义y值的时候x变量尚未定义,所以其值为空。
c、使用“?=”操作符
该操作符的含义是没如果变量之前没有被定义过,那么变量的值就被定义。如果变量的值之前已经被定义过了,这赋值语句什么也不做。
例:
a := hello
b ?= world
a ?= HELLO
all:
echo $(a)
echo $(b)
.PHPONY:all
执行
$make -s all
hello
world
由于a变量在“a?=HELLO”之前已经被定义,所以a变量的值没有被改变。b变量在“b?=world”之前没有定义,所以变量b值被定义为world。
4、追加变量的值
makefile 文件允许给一个变量追加一个值,其操作为“+=”
例1:
objects = main.o foo.o bar.o
objects += another.o
上述代码等价以下形式
objects = main.o foo.o bar.o
objects = $(objects) another.o
例2:
objects := main.o foo.o bar.o
objects += another.o
上述代码等价以下形式
objects := main.o foo.o bar.o
objects := $(objects) another.o
5、自动化变量
$@ 表示规则中的目标文件集
$% 仅当目标是函数库文件时表示规则中的目标成员。例如,如果一个目标是foo.a(bar.o)那么,$%就是bar.o, $@就是foo.a。如果目标不是函数文件,其值为空
$< 依赖列表中的第一依赖的名字
$? 所有比目标新的依赖的集合, 以空格分隔
$^ 所有依赖的集合,以空格分隔。如果在依赖中有多个重复的,那么这个变量会去除重复的依赖,只保留一份。
$+ 这个变量很像$^,也是所有依赖的集合,只是它不去除重复的依赖
$* 这个变量表示目标模式中 “%”及其之前的部分