S5PV210之Uboot的配置编译Makfile 与 config.mk 和 mkconfig

配置编译

编译配置主要是配置makefile和mkconfig文件,确定使用的具体是哪一款开发板,主要是针对board目录下的文件。

主Makefile

版本号

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION = 
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) #实际版本号1.3.4
VERSION_FILE = $(obj)include/version_autogenerated.h                 #自动生成的版本号文件

其中 include/version_autogenerated.h 文件内容如下,可以看出完全是由U_BOOT_VERSION 这个变量得出的

#define U_BOOT_VERSION "U-Boot 1.3.4"

CPU架构和OS版本的环境变量

看下面代码

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/ppc64/ppc/ \
        -e s/macppc/ppc/)
#HOSTARCH :=i386
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
        sed -e 's/\(cygwin\).*/cygwin/')
#HOSTOS := linux
export  HOSTARCH HOSTOS                            //导出为环境变量

makefile中可以执行shell命令,但是格式必须是

DIR = ${shell pwd}       #方法一
DIR = `pwd`              #方法二

静默编译

默认编译的时候,会打印出编译命令和一些其他信息,有时候这会很多,需要不显示编译命令或者编译过程中的其他结果的时候就可以使用静默编译。
原理就是编译是加上-s选项之后,-s会作为MAKEFLAGS传入 ,在执行下面命令时, (findstrings, ( f i n d s t r i n g s , (MAKEFLAGS)) == 1,所以ifeq不成立,所以 XECHO = : 自然不会输出打印信息了

ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

其中注意到

include  #在包含文件时如果找不到会报警,在读取整个makefile后如果还是不能找到文件,才会报错
-include #在包含读取文件的时候,如果出错直接忽略
sinclude #同 -include

两种编译管理选项

原地编译
  • 污染了源文件目录
  • 一套源码只能按照一种配置和编译方法处理,无法同时维护两个以上的不同配置工程项目
单独输出到文件夹编译
  • 类似于linux kernel的方法,在编译时指定一个输出目录,所有编译的最终文件和中间文件将存放到那目录下去,源代码没有任何污染
  • 有两种方式指定输出目录
make O=输出目录             #方法一优先级高
export BUILD_DIR=输出目录|make      #方法二
OBJTREE     := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))  #编译后的文件
SRCTREE     := $(CURDIR)                   #源文件
TOPDIR      := $(SRCTREE)
LNDIR       := $(OBJTREE)
export  TOPDIR SRCTREE OBJTREE

MKCONFIG    := $(SRCTREE)/mkconfig             #源码根目录下得的mkconfig
export MKCONFIG

其中在make 过程中指定的 O目录优先级更高

ifdef O
ifeq ("$(origin O)", "command line") #这里origin的意思是看O的定义在哪 
#可能的值有多个 :(1)command line  (2)undefine  (3)environment  (4)file  (5)default
BUILD_DIR := $(O)
endif
endif

make x210_sd_config配置结果

配置后的结果主要在include/config.mk文件中,如

ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110

与这个文件配置相关的是

include $(obj)include/config.mk
export  ARCH CPU BOARD VENDOR SOC

还有

x210_sd_config :    unconfig
    @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
    @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

涉及到比较多的makefile语法表示执行MKCONFIG文件,并且传入之后的几个变量
(@:config=)x210sdconfigconfig ( @ : c o n f i g = ) 表 示 将 x 210 s d c o n f i g 中 c o n f i g 替 换 为 空 所 以 传 入 的 几 个 参 数 是 1 : x210_sd
2:arm 2 : a r m 3 : s5pc11x
4:x210 4 : x 210 5 : samsung
6:s5pc110 6 : s 5 p c 110 # : 6

编译工具链

CROSS_COMPILE为环境变量,不同CPU架构的编译工具链不一样,但是仅仅是前缀不一样,后缀都是一样的。当然也可以在make的时候定义CROSS_COMPILE

ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif

config.mk文件

在主makefile中用下面代码,直接包含了config.mk

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

编译工具链配置

AS  = $(CROSS_COMPILE)as
LD  = $(CROSS_COMPILE)ld
CC  = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR  = $(CROSS_COMPILE)ar
NM  = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP   = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB  = $(CROSS_COMPILE)RANLIB

板子配置选项

最后ARCH CPU SOC VENDOR BOARD的所有相关配置信息都会导入到/include/auoconf.mk文件中去,其余来源于/include/configs/xxx.h
auoconf.mk 里面都是控制整个UBOOT编译过程的宏定义,通过条件编译来控制整个编译过程

# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk

ifdef   ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk  # include architecture dependend rules
endif
ifdef   CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk   # include  CPU  specific rules
endif
ifdef   SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk   # include  SoC  specific rules
endif
ifdef   VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef   BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif

板子链接脚本

ifndef LDSCRIPT
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds     #实际使用
endif

分析得知,本开发板使用的是u-boot.lds

板子配置的TEXT_BASE

TEXT_BASE是整个uboot编译链接时候的链接地址
在配置的时候在/board/samsung/x210目录下生成了一个config.mk文件

x210_sd_config :    unconfig
    @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
    @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk     #生成config.mk

其中内容为

TEXT_BASE = 0xc3e00000

mkconfig文件(2.4uboot配置详解1)

在make x210_sd_config配置板子的时候就是

在/include/ /include/asm/里面一共创建了4个符号链接

看到uboot2.4之后继续

你可能感兴趣的:(uboot和linux,kernel移植)