##uboot Makefile 分析
###makefile基础
简单示例:
#sample
main.o:main.c defs.h
cc -c main.c
clean:
rm *.*
####包含其他makefile
include FILENAMES
include指示符用于make暂停读取当前Makefile,转而去读取inlcude制定的文件,完成后再继续当前的makefile读取
[Tab]字符开始make程序将此行作为一个命令行来处理
变量 MAKEFILES
变量 MAKEFILE_LIST
makefile普通规则
makefile模式规则
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
此规则描述了一个.o文件如何由对应的.c文件创建。规则的命令行中使用了自动化变量
“ $<”和“ $@”,其中自动化变量“ $<”代表规则的依赖,“ $@”代表规则的目标。
此规则在执行时,命令行中的自动化变量将根据实际的目标和依赖文件取对应值。
依赖类型:常规依赖与order-only依赖
LIBS = libtest.a
foo : foo.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)
规则中依赖文件$(LIBS)只有在目标文件不存在的情况下,才会参与规则的执行。当目
标文件存在时此依赖不会参与规则的执行过程
变量
变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变
量的值)
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
变量的替换引用,格式为“ $(VAR:A=B)”(或者“ ${VAR:A=B}”),
foo := a.o b.o c.o
bar := $(foo:.o=.c)
变量“ bar”的值就为“ a.c b.c c.c”。
: 以冒号开头表示注释
@ 以@开头表示命令执行的时候不显示命令本身
自动化变量
$@ 表示规则的目标文件名
$< 规则的第一个依赖文件名
$^ 规则的所有依赖文件列表
$? 所有比目标文件更新的依赖文件列表,空格分割
$% 当规则的目标文件是一个静态库文件时,代表静态库的一个成员名
$(@D) 表示目标文件的目录部分(不包括斜杠)
$(@F) 目标文件的完整文件名中除目录以外的部分(实际文件名)
$(*D) $(*F) 分别代表目标“茎”中的目录部分和文件名部分
$(<D) $(<F) 分别表示规则中第一个依赖文件的目录部分和文件名部分
$(^D) $(^F) 分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)
$(+D) $(+F) 分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。
$(?D) $(?F) 分别表示被更新的依赖文件的目录部分和文件名部分
Makefile 中:= ?= += =的区别
新建一个Makefile,内容为:
ifdef DEFINE_VRE
VRE = “Hello World!”
else
endif
ifeq ($(OPT),define)
VRE ?= “Hello World! First!”
endif
ifeq ($(OPT),add)
VRE += “Kelly!”
endif
ifeq ($(OPT),recover)
VRE := “Hello World! Again!”
endif
all:
@echo $(VRE)
敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover 输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!
从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
###增加TQ2440板子到uboot