makefile的一些注解
1、wildcard : 扩展通配符
SRC = $(wildcard *.c)
等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
也可以指定汇编源程序:
ASRC = $(wildcard *.S)
等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
也可以指定汇编源程序:
ASRC = $(wildcard *.S)
2、notdir : 去除路径
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
如果第一行输出:
a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
那么第二行输出:
a.c b.c sa.c sb.c
3、patsubst :替换通配符
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的单词替换成[%.o],返回结果是“x.c.o bar.o” SRCS = $(wildcard $(PKG)/inc/*.c) $(wildcard $(PKG)/*.c) BOJS = $(patsubst %.c,%.o,$(SRCS)) foo := a.o b.o c.o bar := $(foo:.o=.c) 在这个定义中,变量“bar”的值就为“a.c b.c c.c”。
$(patsubst %/, %/built-in.o, $(libs-y))
每个目录下生成一个built-in.o
在uboot的编译过程中,每个built-in.o都对应着一个:.built-in.o.cmd
cmd_fs/built-in.o := arm-linux-ld -r -o fs/built-in.o fs/fs.o fs/ext4/built-in.o fs/fat/built-in.o fs/ubifs/buil t-in.o fs/yaffs2/built-in.o
.cmd文件是由名为make-cmd的子命令生成的,它定义在scripts/Kbuild.include:
make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))
escsq子命令定义如下:
squote := ' # Escape single quote for use in echo statements escsq = $(subst $(squote),'\$(squote)',$1)
那这个.cmd文件究竟是在哪里生成的呢:(scripts/Kbuild.include)
238 if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
239 @set -e; \
240 $(echo-cmd) $(cmd_$(1)); \
241 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
相信这个if_changed 应该不会陌生,在顶层目录Makefile里面就有。
4、call:替换通配符
$(call <expression>,<parm1>,<parm2>,<parm3>...)
reverse=$(2) $(1) foo=$(call reverse, a, b) all: @echo $(foo)
5、foreach:替换通配符
$(foreach <var>,<list>,<text>)
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”。 注意,foreach中的<var>;参数是一个临时的局部变量,foreach函数执行完后,参数<var>;的变量将不在作用,其作用域只在foreach函数当中。
6、sort:替换通配符
foo := $(sort a d b g q c),于是$(foo)的值就是“a b c d g q”

浙公网安备 33010602011771号