所谓静默编译就是在编译的时候不打印任何信息(错误和警告信息除外)。# Allow for silent buildsifeq (,$(findstring s,$(MAKEFLAGS)))XECHO = echoelseXECHO = :endif这段代码的意思是,在执行make时输入的参数中搜索’s’,如果有的话就给XECHO赋值为echo,否则就赋值为空,然后在其他地方用XECHO来打印信息,就实现了是否启用静默编译。 make -s就启用了静默编译。
指定目录编译
u-boot除了支持静默编译外还支持在不同目录进行编译,即将配置过程生成的文件以及编译产生的中间文件全都输出到一个指定的目录,从而避免污染源码目录。 从56-76的注释中可以看出有两种方式指定 1、在命令行通过make O=/tmp/build 指定输出目录为/tmp/build 2、指定BUILD_DIR=/tmp/build环境变量 注意:通过阅读根目录下的README文件,如果要在其他目录进行编译,在配置阶段和编译阶段都要指定输出的目录位置,如下:1. Add O= to the make command line invocations:make O=/tmp/build distcleanmake O=/tmp/build NAME_configmake O=/tmp/build all2. Set environment variable BUILD_DIR to point to the desired location:export BUILD_DIR=/tmp/buildmake distcleanmake NAME_configmake allMakefile中的78-93行完成工作就是,如果指定了O参数,就判断O后边指定的目录存在不存在,如果不存在就创建,并把指定的路径赋值给BUILD_DIR变量 —— 然后就是给几个下边变量赋值OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))//输出目录SRCTREE := $(CURDIR)//源码目录TOPDIR:= $(SRCTREE)//顶层目录(源码根目录)LNDIR := $(OBJTREE)//链接目录exportTOPDIR SRCTREE OBJTREE //导出为环境变量MKCONFIG:= $(SRCTREE)/mkconfig //mkconfig配置脚本的路径export MKCONFIG //导出为环境变量然后是编译要用的$(obj) 和$(src)# $(obj) and (src) are defined in config.mk but here in main Makefile# we also need them before config.mk is included which is the case for# some targets like unconfig, clean, clobber, distclean, etc.ifneq ($(OBJTREE),$(SRCTREE))obj := $(OBJTREE)/src := $(SRCTREE)/elseobj :=src :=endifexport obj src如果编译输出目录和源码目录不是通一个目录,就将源码目录的路径赋值给$(src),将输出的路径赋值给$(obj)。 否则就置空。
确定目标架构和交叉编译工具
从124行开始一直到182行都是在确定要使用的交叉编译工具。 其中在133行的时候导入了一个配置文件# load ARCH, BOARD, and CPU configurationinclude $(obj)include/config.mkexportARCH CPU BOARD VENDOR SOC$(obj)include/config.mk此文件在执行mkconfig脚本的时候生成,里边保存着开发板以及CPU的型号和架构信息ARCH = armCPU= s5pc11xBOARD= smdkc110VENDOR = samsungSOC= s5pc110然后再将这些信息导出为环境变量。ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-endifexportCROSS_COMPILE再然后就是指定交叉编译工具,并将CROSS_COMPILE导出为环境变量了。此外 在185行导入了U-boot根目录下的config.mk文件# load other configurationinclude $(TOPDIR)/config.mk此文件主要完成以下工作 1、定义交叉编译工具,例如 CC=arm-linux-gcc, LD=arm-linux-ld等等。 2、导入配置文件 $(OBJTREE)/include/autoconf.mk $(TOPDIR)/$(ARCH)_config.mk $(TOPDIR)/cpu/$(CPU)/config.mk $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk$(VENDOR)/$(BOARD) $(TOPDIR)/board/$(BOARDDIR)/config.mk 3、编译选项相关的一大坨,一般不用管 4、make的自动推导规则