-
打印信息:
[1.1] 不需要tab直接打印的:
$(info this is info)
$(warning this is warning)
$(error this is error)[1.2]需要tab放在命令位置的:
@echo $(var) -
自动化变量
ojects = main.o a.o b.o c.o d.o e.o f.o
mylabel:$(ojects )
@echo $@
@echo $%
@echo $<
@echo $?
@echo $^
@echo $+
@echo $*
$@: 表示目标文件,这里是mylabel
$%:仅表示目标文件为函数库时的目标成员,这里为空
$<:依赖目标的第一个目标名字,这里是main.o
$?:所有比目标新的依赖目标的集合,这里是main.o a.o b.o c.o d.o e.o f.o
$^:所有的依赖目标的集合,去除重复的,这里是main.o a.o b.o c.o d.o e.o f.o
$+:所有的依赖目标的集合,不去除重复的,这里是main.o a.o b.o c.o d.o e.o f.o
$*: 表示目标模式中"%"及其之前的部分,这里为空 -
函数用法
格式: $(function p1,p2,p3)
[1]. 字符串替换函数:subst
$(subst is,IS,This is my first makefile)
This is my first makefile ---->ThIS IS my first makefile
[2]. 模式字符串替换函数: patsubst
$(patsubst %.c,%.o,main.c file1.c file2.c file3.c)
main.c file1.c file2.c file3.c—>main.o file1.o file2.o file3.o
[3].获取参数指定目录下的所有.c文件
$(wildcard .c ./sub/.c)
[4]. 获取目录函数
$(dir tmp/project/main.c aa.c bb.c)返回值是: “tmp/project/ ./”
[5]. 获取文件函数
$(notdir tmp/project/main.c aa.c bb.c)返回值是: “main.c aa.c bb.c”
[6]取后缀函数
$(suffix src/main.c barfiles/bar.c object)返回值是“.c .c”
[7]取前缀函数
$(basename src/main.c barfiles/bar.c object)返回值是
“src/main barfiles/bar object”
[8] 加后缀函数
$(addsuffix .c,foo bar)返回值是“foo.c bar.c”
[9]加前缀函数
$(addprefix src/,foo bar)返回值是“src/foo src/bar”。
[10]连接函数
$(join aaa bbb , 111 222 333)返回值是“aaa111 bbb222 333”
[11]过滤函数sources := foo.c bar.c baz.s ugh.h foo: $(sources) cc $(filter %.c %.s,$(sources)) -o foo $(filter %.c %.s,$(sources))返回的值是---> "foo.c bar.c baz.s"
[12]反过滤函数
objects=main1.o foo.o main2.o bar.o mains=main1.o main2.o $(filter-out $(mains),$(objects)) 返回值是---->“foo.o bar.o”
[13]foreach函数
$(foreach ,,)
这个函数的意思是,把参数中的单词逐一取出放到参数 所指定的变量中,然后再执行所包含的表达式
每一次会返回一个字符串,循环过程中, 的所返回的每个字符串会以空格分隔,最后当整个循环结束时,
所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值,如下例子: names := a b c d files := $(foreach n,$(names),$(n).o) 上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中, “$(n).o”每次根据“$(n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以, $(files)的值是“a.o b.o c.o d.o”
-
变量高级用法
aa:= main.o aa.o bb.o cc.o
obj := $(aa:%.o=%.c)
将变量aa中所有以.o结尾的字符改成.c结尾,所以变量obj它的值是main.c aa.c bb.c cc.c
5.条件表达式,不要有TAB键:
判断关键词有: ifeq,ifneq,ifdef,ifndef
如:
ifeq(0,$(MAKELEVEL))
示例一:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
示例二:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
6.静态模式
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。
规则:
<targets...>: <target-pattern>: <prereq-patterns ...>
<commands>
...
例如:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
规则展开等价于如下:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
7.变量赋值
= 延时变量,只有被使用时才展开定义 ,使用时!!
:= 立即变量,定义时的赋值立即有效 ,立刻!!
?= 条件变量,当变量为空时才赋值
+= 追加赋值