makefile三要素:目标,依赖,命令
GNU make 的主要预定义变量
make -f makefilename 指定makefile文件
1.预定义变量 含义
$* 不包含扩展名的目标文件名称。
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$< 第一个依赖文件的名称。
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
[email protected] 目标的完整名称。
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 [email protected] 为 mytarget.so,而 $% 为 image.o。
AR 归档维护程序的名称,默认值为 ar。
ARFLAGS 归档维护程序的选项。
AS 汇编程序的名称,默认值为 as。
ASFLAGS 汇编程序的选项。
CC C 编译器的名称,默认值为 cc。
CCFLAGS C 编译器的选项。
CPP C 预编译器的名称,默认值为 $(CC) -E。
CPPFLAGS C 预编译的选项。
CXX C++ 编译器的名称,默认值为 g++。
CXXFLAGS C++ 编译器的选项。
FC FORTRAN 编译器的名称,默认值为 f77。
FFLAGS FORTRAN 编译器的选项。
#注释符
@用于命令前,编译时,该命令不回显
[TAB] 命令前必须加[TAB]
2.
在模式规则中,规则的目标和依赖文件名代表了一类文件名。命令是对所有这一类文件重建过程的描述,显然,在命令中不能指定特定的文件名,否则模式规则将没
有了意义。那么在模式规则的命令行中该如何表示文件,将成我们这一小节的讨论重点。make中使用了“自动环变量”来实现这个目的,自动化变量的取值是根据具
体的规则决定的,就是说对不同的规则其所代表的文件名不同
3.变量
$() 和${}是一样的
递归展开赋值 : A=2 B=$(A) A=3 则最终B==3
直接展开赋值: A:=2 B:=$(A) A:=3 则最终B==2
一般情况下,只使用直接展开赋值
变量的替换引用:
//foo := a.o b.o c.o
//bar := $(foo:.o=.c)
//“bar”的值就为“a.c b.c c.c”
变量追加
objects += another.o 将使用空格隔开 相当于objects := $(objects) another.o
4.函数
调用方式: ${funname var1,var2,...}
comma:= ,
empty:=
space:= $(empty) $(empty) #空格的表示方法
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
4.1文本处理函数
$(subst FROM,TO,TEXT) 字符串替换函数 把字串“TEXT”中的“FROM”字符替换为“TO”
$(subst ee,EE,feet on the street)
结果是新的字符串“fEEt on the strEEt”。
$(patsubst PATTERN,REPLACEMENT,TEXT) 模式替换函数(以空格为分隔匹配模式)
$(patsubst %.c,%.o,x.c m.c bar.c)
结果是 x.o m.o bar.o
$(strip STRINT) 去空格函数—strip。
STR = a b c
LOSTR = $(strip $(STR))
结果是“a b c”。
$(findstring FIND,IN) 查找字符串函数
$(findstring a,a b c)
$(findstring a,b c)
第一个函数结果是字“a”;第二个值为空字符。
$(filter PATTERN…,TEXT) 过滤函数
sources := foo.c bar.c baz.s ugh.h
$(filter %.c %.s,$(sources))
函数返回值为“foo.c bar.c baz.s”。
$(filter-out PATTERN...,TEXT) 反过滤函数
$(sort LIST) 排序函数
$(sort foo bar lose foo)
返回值为:“bar foo lose”。
$(word N,TEXT) 取单词函数
$(word 2, foo bar baz)
返回值为“bar”。
$(wordlist S,E,TEXT) 取单词函数
$(wordlist 2, 3, foo bar baz)
返回值为:“bar baz”。
$(words TEXT) 统计单词数目函数
$(words, foo bar)
返回值是“2”。
$(firstword NAMES…) 取首单词函数
$(firstword foo bar)
返回值为“foo”。
4.2 文件名处理函数
$(dir NAMES…) 取目录函数
$(dir src/foo.c hacks)
返回值为“src/ ./”。
$(notdir NAMES…) 取文件名函数
$(notdir src/foo.c hacks)
返回值为:“foo.c hacks”。
$(suffix NAMES…) 取后缀函数
$(suffix src/foo.c src-1.0/bar.c hacks)
返回值为“.c .c”。
$(basename NAMES…) 取前缀函数
$(basename src/foo.c src-1.0/bar.c /home/jack/.font.cache-1 hacks)
返回值为:“src/foo src-1.0/bar /home/jack/.font hacks”。
$(addsuffix SUFFIX,NAMES…) 加后缀函数
$(addsuffix .c,foo bar)
返回值为“foo.c bar.c”。
$(addprefix PREFIX,NAMES…) 加前缀函数
$(addprefix src/,foo bar)
返回值为“src/foo src/bar”。
$(join LIST1,LIST2) 单词连接函数
$(join a b c , .c .o)
返回值为:“a.c b.o c”。
$(wildcard PATTERN) 获取匹配模式文件名函数
$(wildcard *.c)
返回值为当前目录下所有.c 源文件列表。
$(foreach VAR,LIST,TEXT) 循环函数 执行时把“LIST”中使用空格分割的单词依次取出赋值给变量“VAR” ,然后执行“TEXT”表达式。
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
if 函数
$(call VARIABLE,PARAM,PARAM,...) call函数 将它的参数“PARAM”依次赋值给临时变量“$(1)”、“$(2)”
$(value VARIABLE) value函数
eval函数
$(origin VARIABLE) origin函数
shell函数 contents := $(shell cat foo)