二、主目录 Makefile 分析(3)

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

  下节继续分析

posted @ 2018-04-21 21:10  游戏进行中  阅读(349)  评论(0编辑  收藏  举报