1. 程式人生 > >分析u-boot的Makefile

分析u-boot的Makefile

選項 lin 編譯平臺 create cpp port n) ati inux

  這裏分析三星s5pv210芯片官方u-boot

先看u-boot 版本號

VERSION = 1    #主版本號
PATCHLEVEL = 3   #次版本號
SUBLEVEL = 4    # 修改正版本號
EXTRAVERSION =  # 拓展版本號 
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

1 HOSTARCH := $(shell uname -m | \   # 將uname -m 結果通過管道傳輸到 sed 如果傳輸過來的是i686的話
2 sed -e s/i.86/i386/ \ # sed -e s/i.86/i386/ 意思是用 sed 將i.86這些內容替換成i386
                  . 的意思是匹配任意字符 i.86就是說匹配i為前綴 86為後綴中間任意字符    
3 -e s/sun4u/sparc64/ 4 -e s/arm.*/arm/ 5 -e s/sa110/arm/ 6 -e s/powerpc/ppc/ 7 -e s/ppc64/ppc/ 8 -e s/macppc/ppc/)

i686 是Ubantu 的CPU架構

  然後講下針對特定平臺設置。

smdkv210single_config : unconfig

        $1(將_config字符去掉) $2 $3 $4 $5 $6
@$(MKCONFIG) $(@:_config=)     arm s5pc11x smdkc110 samsung s5pc110

        #將參數n $0 smdk210single ($2:arm) $3 s5pc11x $4 smdkc110 $5 samsung $6 s5pc110 傳入至頂層目錄下的mkconfig.mk文件
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk

  判斷該目錄下有無config.mk文件,有就包含改頭文件,並輸出 config.mk下的  ARCH(編譯平臺)  CPU   BOARD  VENDOR    SOC這些變量信息
1
feq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) wildcard函數是將展開所有符合起指定參數的文件名(指定參數為include/config.mk) 2 3 # load ARCH, BOARD, and CPU configuration 4 include $(obj)include/config.mk 5 export ARCH CPU BOARD VENDOR SOC // arm s5pc11x smdkc110 samsung s5pc110 由.mk配置文件可知

所要查找的config.mk 文件如下所示:(目錄為:頂層目錄下include/config.mk)

技術分享

    下面開始分析ARCH CPU BOARD 這些變量,對接下來編譯的作用。

ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm) 判斷ARCH 和arm 是否一樣,有上面可知,在配置上面的步驟後是一樣的。

#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /home/gec/arm-2009q3/bin/arm-none-linux-gnueabi-   #指定編譯工具路徑
endif

# load other configuration
include $(TOPDIR)/config.mk #包含頂層config.mk文件,這個文件定義了交叉編譯器即選項和編譯規則

 

 #告訴了我們的Makefile OBJS依賴的目標文件是頂層目錄下的cpu/s5pc11x/start.0

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

 #如果存在 board/samsung/common/Makefile 這個文件 就輸出當前所依賴庫文件的名字

LIBS = lib_generic/libgeneric.a #指定相應庫文件
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \
"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a #指定相應庫文件

 1 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
 2 ifeq ($(ARCH),blackfin)
 3 ALL += $(obj)u-boot.ldr
 4 endif
 5 
 6 all:    $(ALL)                  # all 依賴於$(ALL)
 7 
 8 $(obj)u-boot.hex:    $(obj)u-boot
 9 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
10 
11 $(obj)u-boot.srec:    $(obj)u-boot
12 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
13 
14 $(obj)u-boot.bin:    $(obj)u-boot               #轉換成.bin格式
15 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
16 
17 $(obj)u-boot.ldr:    $(obj)u-boot
18 $(LDR) -T $(CONFIG_BFIN_CPU) -f -c $@ $< $(LDR_FLAGS)
19 
20 $(obj)u-boot.ldr.hex:    $(obj)u-boot.ldr
21 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
22 
23 $(obj)u-boot.ldr.srec:    $(obj)u-boot.ldr
24 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
25 
26 $(obj)u-boot.img:    $(obj)u-boot.bin                   #生成u-boot.img
27 ./tools/mkimage -A $(ARCH) -T firmware -C none 28 -a $(TEXT_BASE) -e 0 29 -n $(shell sed -n -e s/.*U_BOOT_VERSION//p $(VERSION_FILE) | 30 sed -e s/"[    ]*$$/ for $(BOARD) board"/) 31 -d $< $@
32 
33 $(obj)u-boot.sha1:    $(obj)u-boot.bin
34 $(obj)tools/ubsha1 $(obj)u-boot.bin
35 
36 $(obj)u-boot.dis:    $(obj)u-boot            #生成反匯編代碼 .dis 文件
37 $(OBJDUMP) -d $< > $@
38 
39 $(obj)u-boot:    depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
40 UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | 41 sed -n -e s/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p|sort|uniq`;42 cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) 43 --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) 44 -Map u-boot.map -o u-boot

    這裏說一下頂層目錄下mkconfig.mk文件的作用:

1. 創建include/config.mk文件

  #
  # Create include file for Make
  #
  echo "ARCH = $2" > config.mk
  echo "CPU = $3" >> config.mk
  echo "BOARD = $4" >> config.mk

並將相關信息輸出到config.mk文件

2. 創建開發板相關頭文件

echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

分析u-boot的Makefile