下面是定义变量的一般方法:
VARNAME=some_text
[...]
把变量用括号起来,并在前面加上"$"符号,就可以引用变量的值:
$(VARNAME)
变量一般都在makefile的头部定义,并且,按照惯例,所有的makefile变量都应该大写.
在makefile中使用变量
OBJS
= howdy.o helper.o
HDRS = helper.h
howdy: $(OBJS) $(HDRS)
gcc $(OBJS) -o howdy
helper.o: helper.c $(HDRS)
gcc -c
helper.c
howdy.o: howdy.c
gcc -c howdy.c
hello: hello.c
gcc
hello.c -o hello
all: howdy hello
clean:
rm howdy hello
*.o
make使用两种变量:递归展开变量和简单展开变量.递归展开变量在引用时逐层展开,即如果在展开式中包含了对其他变量的引用,则这些变量也将被展开,直到没有需要展开的变量为止,这就是所谓的递归展开.
考虑下面的变量定义:
CC
= gcc
CC = $(CC)
-o
CC在被引用时递归展开,从而陷入一个无限循环中:CC将展开为$(CC)的值,从而永远也读不到-o选项.
为了避免这个问题,可以使用简单展开变量.与递归展开变量在引用时展开不同,简单展开变量在定义处展开,并且只展开一次,从而取消了变量的嵌套引用.在定义时,其语法与递归展开变量有细微的不同:
CC
:= gcc -o
CC += -O2
第一个定义使用":="设置CC的值为gcc -o,
第二个定义使用"+="在前面定义的CC后附加了-O2,从而CC最终的值是gcc -o
-O2.
除用户定义变量外,make也允许使用环境变量,自动变量和预定义变量.使用环境变量非常简单.在启动时,make读取已定义的环境变量,并且创建与之同名同值的变量.但是,如果makefile中有同名的变量,则这个变量将取代与之相应的环境变量,所以应当注意这一点.
自动变量
变量
说明
$@
规则的目标所对应的文件名
$<
规则中的第一个相关文件名
$^
规则中所有相关文件的列表,以空格为分界符
$?
规则中日期新于目标的所有相关文件的列表,以空格为分隔符
$(@D)
目标文件的目录部分(如果目标在子目录中)
$(@F)
目标文件的文件名部分(如果目标在子目录中)
用于文件名和标志的预定义变量
变量
说明
AR
归档维护程序,默认值=ar
AS
汇编程序,默认值=as
CC
C编译程序,默认值=cc
CPP
C预处理程序,默认值=
cpp
RM
文件删除程序,默认值="rm -f"
ARFLAGS
传给归档维护程序的标志,默认值=rv
ASFLAGS
传给汇编程序的标志,没有默认值
CFLAGS
传给C编译器的标志,没有默认值
CPPFLAGS
传给C预处理程序的标志,没有默认值
LDFLAGS
传给链接程序(ld)的标志,没有默认值