uboot分析之Makefile笔记2

来源:互联网 发布:淘宝的冬天雪地棉 编辑:程序博客网 时间:2024/05/16 04:09

一个项目离不开Makefile的分析,可以对Makefile进行剪裁。可以看出重点在ALL,就是编译的规则,可以make一下看输出找到编译的规则。

要注意的是复制粘贴Makefile时格式会不对,编译规则必需空一个TAB。

为了生成u-boot.bin重点就是这里:$(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

make后是:

UNDEF_SYM=`/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-objdump -x lib_generic/libgeneric.aboard/EmbedSky/libEmbedSky.acpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.alib_arm/libarm.afs/cramfs/libcramfs.a fs/jffs2/libjffs2.a net/libnet.a rtc/librtc.adrivers/libdrivers.adrivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.adrivers/lcd/liblcd.a modules/usb.modulemodules/wince.module common/libcommon.a|sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\

cd /media/sf_UbuntuShare/u-boot-tq2440-1.1.6 && /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-ld -Bstatic -T /media/sf_UbuntuShare/u-boot-tq2440-1.1.6/board/EmbedSky/u-boot.lds  -Ttext 0x33D00000     $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a  board/EmbedSky/libEmbedSky.a  cpu/arm920t/libarm920t.a  cpu/arm920t/s3c24x0/libs3c24x0.a  lib_arm/libarm.a  fs/cramfs/libcramfs.a  fs/jffs2/libjffs2.a net/libnet.a  rtc/librtc.a  drivers/libdrivers.a  drivers/nand/libnand.a  drivers/nand_legacy/libnand_legacy.a   drivers/lcd/liblcd.a modules/usb.module modules/wince.module common/libcommon.a --end-group -L /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot

-Ttext 0x33D00000这里就是代码段的起地址,上面的信息大概的意思就是u-boot依赖了很多静态库,最终输出u-boot用来输出u-booot.bin。


概括起来,工程的编译流程也就是通过执行执行一个make *_config传入ARCH,CPU,BOARD,VENDOR,SOC参数,mkconfig根据参数将include头文件夹相应的头文件夹连接好,生成 config.h。然后执行make分别调用各子目录的makefile 生成所有的obj文件和obj库文件*.a. 最后连接所有目标文件,生成镜像。不同格式的镜像都是调用相应工具由elf镜像直接或者间接生成的。

Makefile:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////






VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 6
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) #1.1.6
VERSION_FILE = $(obj)include/version_autogenerated.h#


HOSTARCH := $(shell uname -m | \
sed -e s/i.86/i386/ \
   -e s/sun4u/sparc64/ \
   -e s/arm.*/arm/ \
   -e s/sa110/arm/ \
   -e s/powerpc/ppc/ \
   -e s/macppc/ppc/)


HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
   sed -e 's/\(cygwin\).*/cygwin/')


export HOSTARCH HOSTOS


# Deal with colliding definitions from tcsh etc.
VENDOR=






ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif


ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)


# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})


# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)


OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE


MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG




# $(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.


obj :=
src :=


export obj src


ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export  ARCH CPU BOARD VENDOR SOC


ifndef CROSS_COMPILE
CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-
endif
endif


export CROSS_COMPILE


# load other configuration
include $(TOPDIR)/config.mk


#########################################################################
# U-Boot objects....order is important (i.e. start must be first)


OBJS  = cpu/$(CPU)/start.o


OBJS := $(addprefix $(obj),$(OBJS))


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/jffs2/libjffs2.a
LIBS += net/libnet.a
LIBS += rtc/librtc.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/lcd/liblcd.a
LIBS += modules/usb.module
LIBS += modules/wince.module
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)


LIBS := $(addprefix $(obj),$(LIBS))
.PHONY : $(LIBS)


# Add GCC lib
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc


# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
 examples \
 post \
 post/cpu
.PHONY : $(SUBDIRS)


#声明SUBDIRS为一个假象目标,
#那么当Makefile中调用到SUBDIRS的时候,
#每次都要更新这个SUBDIRS,也就是每次make都会重新读取这个SUBDIRS。


#nandflash启动分支
ifeq ($(CONFIG_NAND_U_BOOT),y)
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endif


__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS))


#########################################################################
#########################################################################
########输出uboot.srec ,u-boot.bin ,System.map###########################


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


$(OBJS):
echo $(OBJS)
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))


$(LIBS):
$(MAKE) -C $(dir $(subst $(obj),,$@))


lcd:
$(MAKE) -C drivers/lcd


$(SUBDIRS):
$(MAKE) -C $@ all


$(NAND_SPL): version
$(MAKE) -C nand_spl/board/$(BOARDDIR) all


$(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin
cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin


version:
@echo -n "#define U_BOOT_VERSION \"U-Boot " > $(VERSION_FILE); \
echo -n "$(U_BOOT_VERSION)" >> $(VERSION_FILE); \
echo -n $(shell $(CONFIG_SHELL) $(TOPDIR)/tools/setlocalversion \
$(TOPDIR)) >> $(VERSION_FILE); \
echo "\"" >> $(VERSION_FILE)


gdbtools:
$(MAKE) -C tools/gdb all || exit 1


updater:
$(MAKE) -C tools/updater all || exit 1


env:
$(MAKE) -C tools/env all || exit 1


depend dep:
for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir _depend ; done


tags ctags:
ctags -w -o $(OBJTREE)/ctags `find $(SUBDIRS) include \
lib_generic board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) \
fs/cramfs fs/jffs2 \
net rtc drivers wince common \
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`


etags:
etags -a -o $(OBJTREE)/etags `find $(SUBDIRS) include \
lib_generic board/$(BOARDDIR) cpu/$(CPU) lib_$(ARCH) \
fs/cramfs fs/jffs2 \
net rtc drivers wince common \
\( -name CVS -prune \) -o \( -name '*.[ch]' -print \)`


$(obj)System.map: $(obj)u-boot
@$(NM) $< | \
grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
sort > $(obj)System.map


#########################################################################


.PHONY : CHANGELOG
CHANGELOG:
git log --no-merges U-Boot-1_1_5.. | \
unexpand -a | sed -e 's/\s\s*$$//' > $@


#########################################################################


unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp




#========================================================================
# ARM
#========================================================================
#########################################################################
## ARM92xT Systems
#########################################################################


EmbedSky_config :unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t EmbedSky NULL s3c24x0


#########################################################################
#########################################################################
#########################################################################


clean:
find $(OBJTREE) -type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o'  -o -name '*.a'  \) -print \
| xargs rm -f
rm -f $(obj)examples/hello_world $(obj)examples/timer \
     $(obj)examples/eepro100_eeprom $(obj)examples/sched \
     $(obj)examples/mem_to_mem_idma2intr $(obj)examples/82559_eeprom \
     $(obj)examples/smc91111_eeprom $(obj)examples/interrupt \
     $(obj)examples/test_burst
rm -f $(obj)tools/img2srec $(obj)tools/mkimage $(obj)tools/envcrc \
$(obj)tools/gen_eth_addr
rm -f $(obj)tools/mpc86x_clk $(obj)tools/ncb
rm -f $(obj)tools/easylogo/easylogo $(obj)tools/bmp_logo
rm -f $(obj)tools/gdb/astest $(obj)tools/gdb/gdbcont $(obj)tools/gdb/gdbsend
rm -f $(obj)tools/env/fw_printenv $(obj)tools/env/fw_setenv
rm -f $(obj)board/cray/L1/bootscript.c $(obj)board/cray/L1/bootscript.image
rm -f $(obj)board/netstar/eeprom $(obj)board/netstar/crcek $(obj)board/netstar/crcit
rm -f $(obj)board/netstar/*.srec $(obj)board/netstar/*.bin
rm -f $(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom
rm -f $(obj)board/integratorap/u-boot.lds $(obj)board/integratorcp/u-boot.lds
rm -f $(obj)include/bmp_logo.h
rm -f $(obj)nand_spl/u-boot-spl $(obj)nand_spl/u-boot-spl.map


clobber: clean
find $(OBJTREE) -type f \( -name .depend \
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.dis -o -name u-boot.img \) \
-print0 \
| xargs -0 rm -f
rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS $(obj)include/version_autogenerated.h
rm -fr $(obj)*.*~
rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
rm -f $(obj)tools/crc32.c $(obj)tools/environment.c $(obj)tools/env/crc32.c
rm -f $(obj)tools/inca-swap-bytes $(obj)cpu/mpc824x/bedbug_603e.c
rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
[ ! -d $(OBJTREE)/nand_spl ] || find $(obj)nand_spl -lname "*" -print | xargs rm -f


ifeq ($(OBJTREE),$(SRCTREE))
mrproper \
distclean: clobber unconfig
else
mrproper \
distclean: clobber unconfig
rm -rf $(OBJTREE)/*
endif


backup:
F=`basename $(TOPDIR)` ; cd .. ; \
gtar --force-local -zcvf `date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F


#########################################################################

0 0