uboot Makefile 分析

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,u-boot)