u-boot的源代码包含了对几十种处理器、数百种开发板的支持,可是对于特定的开发板,配置编译过程只需要其中部分程序。这里就需要用到Makefile了。
编译
以mpc8313erdb板为例,编译的过程分两部:
# make mpc8313erdb_config
# make
顶层Makefile分析
要了解一个LINUX工程的结构必须看懂Makefile,尤其是顶层的,没办法,UNIX世界就是这么无奈,什么东西都用文档去管理、配置。还是以mpc8313为例,顺序分析Makefile大致的流程及结构如下:
1) Makefile中定义了源码及生成的目标文件存放的目录,目标文件存放目录BUILD_DIR可以通过make O=dir或者export BUILD_DIR=dir两种方式指定。如果没有指定,则设定为源码的根目录,一般编译的时候都建议指定输出目录,这样可以不影响其他的源码结构,便于管理,至于它的控制流程,每一步指令都有详细注释,感兴趣的可以看一下,再看下其它目录变量的定义:
OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
2)定义变量MKCONFIG:这个变量指向一个脚本,即顶层目录的mkconfig。
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
在编译U-BOOT之前,先要执行
#make mpc8313erdb_33_config(u-boot中有两种主频的8313处理器,所以也要添加配置)
mpc8313erdb_33_config是Makefile的一个目标,定义如下:
mpc8313erdb_33_config : unconfig
@$(MKCONFIG) -a MPC8313ERDB ppc mpc8313 mpc8313erdb freescale
unconfig::
@mkdir -p $(obj)include
@if [ "$(findstring _33_,$@)" ] ; then \
$(XECHO) -n "...33M ..." ; \
echo "#define CFG_33MHZ" >>$(obj)include/config.h ; \
fi ; \
if [ "$(findstring _66_,$@)" ] ; then \