下面基于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.