分析u-boot的Makefile

  这里分析三星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 $< [email protected]
10
11 $(obj)u-boot.srec:    $(obj)u-boot
12 $(OBJCOPY) ${OBJCFLAGS} -O srec $< [email protected]
13
14 $(obj)u-boot.bin:    $(obj)u-boot               #转换成.bin格式
15 $(OBJCOPY) ${OBJCFLAGS} -O binary $< [email protected]
16
17 $(obj)u-boot.ldr:    $(obj)u-boot
18 $(LDR) -T $(CONFIG_BFIN_CPU) -f -c [email protected] $< $(LDR_FLAGS)
19
20 $(obj)u-boot.ldr.hex:    $(obj)u-boot.ldr
21 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< [email protected] -I binary
22
23 $(obj)u-boot.ldr.srec:    $(obj)u-boot.ldr
24 $(OBJCOPY) ${OBJCFLAGS} -O srec $< [email protected] -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 $< [email protected]
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 $< > [email protected]
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

时间: 2024-10-09 09:18:02

分析u-boot的Makefile的相关文章

redis源码分析(1)--makefile和目录结构分析

一.redis源码编译 redis可以直接在官网下载(本文使用版本 3.0.7):https://redis.io/download 安装: $ tar xzf redis-3.0.7.tar.gz $ cd redis-3.0.7 $ make make执行以后主要编译产物在src/redis-server src/redis-cli 如果想把redis-server直接install到可执行目录/usr/local/bin,还需要执行: $ make install Run Redis wi

spring boot应用启动原理分析

spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目: git clone [email protected]:hengyunabc/spring-boot-demo.git mvn spring-b

内核移植(四)——Makefile和链接脚本分析

1:Makefile分析 (1) kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的. (2) kernel的Makefile比uboot的Makefile要复杂,这里我们并不会一行一行的详细分析. (3) Makefile中只有一些值得关注的我会强调一下,其他不强调的地方暂时可以不管. (4) Makefile中刚开始定义了kernel的内核版本号.这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改. (

linux 内核移植(四)——Makefile和链接脚本分析

1:Makefile分析 (1) kernel的Makefile写法和规则等和uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的. (2) kernel的Makefile比uboot的Makefile要复杂,这里我们并不会一行一行的详细分析. (3) Makefile中只有一些值得关注的我会强调一下,其他不强调的地方暂时可以不管. (4) Makefile中刚开始定义了kernel的内核版本号.这个版本号挺重要(在模块化驱动安装时会需要用到),要注意会查,会改. (

uboot总结:uboot配置和启动过程1(主Makefile分析)

说明:文件位置:在uboot的目录下,文件名为:Makefile 从文件的头部开始分析 1.24-29行,配置uboot的版本信息. VERSION = 1 PATCHLEVEL = 3 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) VERSION_FILE = $(obj)include/version_autogenerated.h 2.主机的环

Linux 内核 Makefile 体系简单分析 (转)

转载自mz_linux的ChinaUnix博客 :http://blog.chinaunix.net/uid-26806098-id-3141136.html 众所周知,Linux内核是使用make命令来配置并编译的,那必然少不了Makefile.在内核目录树中我们可以看到内核编译系统的顶层Makefile文件.但是如此复杂.庞大的内核源码绝不可能使用一个或几个Makefile文件来完成配置编译,而是需要一套同样复杂.庞大,且为Linux内核定制的Makefile系统.她可以说是内核的一个子系统

配置Linux Kernel时make menuconfig执行流程分析

   在编译内核前,一般是根据已有的配置文件(一般在内核根目录下的arch/arm/configs/文件夹下,把该目录下的xxx_defconfig文件拷贝到内核根目录下,并重命名为.config)来进行编译; 或者需要先配置裁剪内核. 假设我们要基于一块ARM芯片的开发板配置裁剪内核时,在内核的根目录下运行:make ARCH=arm menuconfig命令后,会弹出如下配置界面: 当我们在内核的根目录下运行make ARM=arm menuconfig这条命令时,内核根目录下的Makefi

(十)makefile

一.Makefile的作用和意义(1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程.(2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理.所以要分析uboot必须对Makefile有所了解. 2.目标.依赖.命令(1)目标就是我们要去make xxx的那个xxx,就是我们最终要生成的东西.(2)依赖是用来生成目录的原材料(3)命令就是加工方法,所以make xxx的过程其实就是使用命令将

补基础之shell 和makefile

2.2.1.shell介绍 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说他是人机交互的一种方式 (2)我们可以使用shell和操作系统.uboot等软件系统进行交互.具体来说就是我们通过shell给软件系统输入命令,然后回车执行,执行完后会回到shell命令行再次输入命令执行 (3)我们上述的操作方式一般情况下工作很好,但是有一个缺陷.譬如我们要在linux 下创建一个文件a.c,可以touch a.c,但是如果我现在要在linux下创建100个文件,分别是a1.c  a

Linux内核Makefile文件(翻译自内核手册)

转载自:http://www.cnblogs.com/jason-lu/p/3728198.html --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 This document describes the Linux kernel Makefiles 本文当介绍了Linux内核的Makefile === Table of Contents=== 目录