2.8 编译选项
重新回到 主 makefile 中执行
2.8.1 u-boot 的编译顺序
代码166 到 189 行,这些是 u-boot 文件编译的顺序,由代码可以看到,首先是从cpu/$(CPU)/start.S,开始启动。
然后执行 addprefix 函数,将obj(编译存储目录)变量当作 OBJS 的前缀,之后加入各种 .a 的库,最后将 LIBS 定义为一个伪目标
- 伪目标:
- 所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪目标成为标签。
- 一般情况下,一个伪目标不作为另一个目标的依赖。当一个伪目标没有作为任何目标的依赖时,我们只能通过make命令来明确指定它为make的终极目标,来执行它所在规则所定义的命令。
1 ######################################################################### 2 # U-Boot objects....order is important (i.e. start must be first) 3 4 OBJS = cpu/$(CPU)/start.o 5 ifeq ($(CPU),i386) 6 OBJS += cpu/$(CPU)/start16.o 7 OBJS += cpu/$(CPU)/reset.o 8 endif 9 ifeq ($(CPU),ppc4xx) 10 OBJS += cpu/$(CPU)/resetvec.o 11 endif 12 ifeq ($(CPU),mpc83xx) 13 OBJS += cpu/$(CPU)/resetvec.o 14 endif 15 ifeq ($(CPU),mpc85xx) 16 OBJS += cpu/$(CPU)/resetvec.o 17 endif 18 ifeq ($(CPU),mpc86xx) 19 OBJS += cpu/$(CPU)/resetvec.o 20 endif 21 ifeq ($(CPU),bf533) 22 OBJS += cpu/$(CPU)/start1.o cpu/$(CPU)/interrupt.o cpu/$(CPU)/cache.o 23 OBJS += cpu/$(CPU)/cplbhdlr.o cpu/$(CPU)/cplbmgr.o cpu/$(CPU)/flush.o 24 endif 25 26 OBJS := $(addprefix $(obj),$(OBJS)) 27 28 LIBS = lib_generic/libgeneric.a 29 LIBS += board/$(BOARDDIR)/lib$(BOARD).a 30 LIBS += cpu/$(CPU)/lib$(CPU).a 31 ifdef SOC 32 LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a 33 endif 34 LIBS += lib_$(ARCH)/lib$(ARCH).a 35 LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a 36 fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a 37 LIBS += net/libnet.a 38 LIBS += disk/libdisk.a 39 LIBS += rtc/librtc.a 40 LIBS += dtt/libdtt.a 41 LIBS += drivers/libdrivers.a 42 LIBS += drivers/nand/libnand.a 43 LIBS += drivers/nand_legacy/libnand_legacy.a 44 LIBS += drivers/usb/libusb.a 45 LIBS += drivers/sk98lin/libsk98lin.a 46 LIBS += common/libcommon.a 47 LIBS += $(BOARDLIBS) 48 49 LIBS := $(addprefix $(obj),$(LIBS)) 50 .PHONY : $(LIBS)
2.9 all 目标
(1)241行出现了整个主Makefile中第一个目标all(也就是默认目标,我们直接在uboot根目录下make其实就等于make all,就等于make这个目标)
(2)目标中有一些比较重要的。譬如:u-boot是最终编译链接生成的elf格式的可执行文件
(3)unconfig字面意思来理解就是未配置。这个符号用来做为我们各个开发板配置目标的依赖。目标是当我们已经配置过一个开发板后再次去配置时还可以配置。
(4)我们配置开发板时使用:make xxx_defconfig,因此分析xxx_defconfig肯定是主Makefile中的一个目标。
ALL 目标之后,都是配置编译过程,就不详细叙述了
之后再 1886 1887 行,我们配置了我们的目标板
1 100ask24x0_config : unconfig 2 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG = 源码目录下的 mkconfig 脚本文件
我们在 执行 make 100ask24x0_config 的时候,实际上是执行的下面的命令,此命令就是传入了 mkconfig 脚本
100ask24x0_config 里的_config部分用空替换,得到:x210_sd,这就是第一个参数,所以:
$1: 100ask24x0
$2: arm
$3: arm920t
$4: 100ask24x0
$5: NULL
$6: s3c24x0
所以,$# = 6
下节继续分析