uboot之Makefile淺析

拿到新的 uboot後(uboot1.1.6),最開始進行 make xxx_config。然後再進行make。這裏面進行了什麼操作呢?

以三星的 s3c2410爲例。首先打開Makefile

發現其中:


$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})  //-d是判斷BUILD_DIR是否存在。倘若不存在就創建。mkdir的-p參數代表若路徑中的BUILD_DIR不存在就創建
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)     //嘗試進入BUILD_DIR 文件夾,如果能正常進入則將文件路勁賦值給BUILD_DIR 。
OBJTREE		:= $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) //如果BUILD_DIR不爲空,OBJTREE := $(BUILD_DIR)否則就是當前目錄$(CURDIR)
SRCTREE		:= $(CURDIR)
TOPDIR		:= $(SRCTREE)
LNDIR		:= $(OBJTREE)
export	TOPDIR SRCTREE OBJTREE
MKCONFIG	:= $(SRCTREE)/mkconfig

export MKCONFIG
smdk2410_config	:	unconfig
	@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0  //$(@:_config=) 去掉 _config

//此句話翻譯過來就是執行腳本
//mkconfig smdk2410  arm arm920t smdk2410 NULL s3c24x0

看下 mkconfig   smdk2410 arm arm920t smdk2410 NULL s3c24x0 做了什麼?

ln -s ${LNPREFIX}arch-$3 asm-$2/arch //建立軟連接
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk
//頭文件包含輸入到config.h
echo "#include <configs/$1.h>" >>config.h

打開include目錄下的config.mk

ARCH   = arm
CPU    = arm920t
BOARD  = s3c2410
SOC    = s3c24x0

打開include目錄下的 config.h

/* Automatically generated - do not edit */
#include <configs/smdk2410.h>

smdk2410.h類似於kernel的make menuconfig,只不過沒有圖形界面。打開smdk2410大概內容如下:

包含一些 sp,中斷棧,sdram大小,sdram基地址等等所有信息。

 * Stack sizes
 *
 * The stack sizes are set up in start.S using the settings below
 */
#define CONFIG_STACKSIZE        (128*1024)      /* regular stack */
#ifdef CONFIG_USE_IRQ
#define CONFIG_STACKSIZE_IRQ    (4*1024)        /* IRQ stack */
#define CONFIG_STACKSIZE_FIQ    (4*1024)        /* FIQ stack */
#endif

/*-----------------------------------------------------------------------
 * Physical Memory Map
 */
#define CONFIG_NR_DRAM_BANKS    1          /* we have 1 bank of DRAM */
#define PHYS_SDRAM_1            0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE       0x04000000 /* 64 MB */

#define PHYS_FLASH_1            0x00000000 /* Flash Bank #1 */

#define CFG_FLASH_BASE          PHYS_FLASH_1
#define CFG_MONITOR_BASE        PHYS_FLASH_1

2.確定交叉工具鏈

include $(OBJTREE)/include/config.mk
export	ARCH CPU BOARD VENDOR SOC   //應用上述生成的inluude目錄下config.mk.輸出環境變量 

CROSS_COMPILE = arm-linux- //編譯選項
export	CROSS_COMPILE     //導出編譯選項

3.添加objs和lib庫

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

#lib 庫
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)

4.查看依賴關係,編譯uboot.bin

all:        $(ALL)  //這個僞目標all是所有目標的目標,其功能一般是編譯所有的目標。

//這條編譯命令實現了ELF格式的U-Boot文件到BIN格式的轉換。
$(obj)u-boot.bin:    $(obj)u-boot            
        $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

//展開arm-linux-objdump -d uboot > uboot.dis 反彙編
$(obj)u-boot.dis:    $(obj)u-boot
        $(OBJDUMP) -d $< > $@

//u-boot.bin依賴於$(obj)u-boot ,$(obj)u-boot 又依賴於depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章