u-boot-->makefile解析①

下面基于u-boot 1.1.6版本

在u-boot 顶层目录下的Makefile中240行起:

ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND)

all:		$(ALL)

$(obj)u-boot.hex:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@

$(obj)u-boot.srec:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

$(obj)u-boot.bin:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

$(obj)u-boot.img:	$(obj)u-boot.bin
		./tools/mkimage -A $(ARCH) -T firmware -C none \
		-a $(TEXT_BASE) -e 0 \
		-n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \
			sed -e 's/"[	 ]*$$/ for $(BOARD) board"/') \
		-d $< $@

$(obj)u-boot.dis:	$(obj)u-boot
		$(OBJDUMP) -d $< > $@

$(obj)u-boot:		depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
		UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
		cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
			--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
			-Map u-boot.map -o u-boot

上面代码中涉及到许多变量,其中在顶层Makefile中有一部分定义:

__OBJS := $(subst $(obj),,$(OBJS))
    #顶层Makefile定义
        OBJS  = cpu/$(CPU)/start.o
    OBJS := $(addprefix $(obj),$(OBJS)) #增加前缀
    obj :=
    src :=

__LIBS := $(subst $(obj),,$(LIBS))
    LIBS  = lib_generic/libgeneric.a
    LIBS += board/$(BOARDDIR)/lib$(BOARD).a
    LIBS += cpu/$(CPU)/lib$(CPU).a
    ifdef SOC
    LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
    endif
    LIBS += lib_$(ARCH)/lib$(ARCH).a
    LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
        fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
    LIBS += net/libnet.a
    LIBS += disk/libdisk.a
    LIBS += rtc/librtc.a
    LIBS += dtt/libdtt.a
    LIBS += drivers/libdrivers.a
    LIBS += drivers/nand/libnand.a
    LIBS += drivers/nand_legacy/libnand_legacy.a
    LIBS += drivers/usb/libusb.a
    LIBS += drivers/sk98lin/libsk98lin.a
    LIBS += common/libcommon.a
    LIBS += $(BOARDLIBS)
    LIBS := $(addprefix $(obj),$(LIBS))

   下面这些变量在顶层的config.mk中有定义:

OBJCOPY = $(CROSS_COMPILE)objcopy
    #顶层Makefile中定义CROSS_COMPILE
    ifeq ($(ARCH),arm)
    CROSS_COMPILE = arm-linux-
    endif
        #在include/config.mk中定义
        ARCH   = arm
        CPU    = arm920t
        BOARD  = 100ask24x0
        SOC    = s3c24x0
OBJCFLAGS += --gap-fill=0xff
OBJDUMP = $(CROSS_COMPILE)objdump
LD    = $(CROSS_COMPILE)ld
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
    #顶层Makefile中定义
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    #在board/100ask24x0/config.mk中有:
    TEXT_BASE = 0x33F80000
    #顶层Makefile中定义
    PLATFORM_LDFLAGS =

 $(SUBDIRS)

   $(PLATFORM_LIBS) 

 $(VERSION_FILE) 

扫描二维码关注公众号,回复: 3966732 查看本文章

 $(LNDIR) 

说明函数subst的用法,在config.mk中有这么一条语句:

 dir := $(subst $(SRCTREE)/,,$(CURDIR)) 

  变量         函数       参数1    参数2  参数3

意思为把$(CURDIR)字符串中包含的  $(SRCTREE)/  字符串替换为空,后将其值赋给变量dir.

猜你喜欢

转载自www.cnblogs.com/liuxinyong236/p/9920748.html