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。如果目标不是函数文件,其值为空
$< 依赖列表中的第一依赖的名字
$? 所有比目标新的依赖的集合, 以空格分隔
$^ 所有依赖的集合,以空格分隔。如果在依赖中有多个重复的,那么这个变量会去除重复的依赖,只保留一份。
$+ 这个变量很像$^,也是所有依赖的集合,只是它不去除重复的依赖
$* 这个变量表示目标模式中 “%”及其之前的部分