uboot linux配置文件,Linux学习日志(14)- uboot根目录下的config.mk文件学习

本篇要学习的config.mk文件,位于uboot源码的根目录下, 其包含了子目录下许多同名的config.mk。所以千万注意这些同名文件的主次区别

该文件内容主要结构为:

1.设置各种路径

2.设置主机环境的编译选项

3.确定各交叉编译工具

4.确定各种级别的编译选项

5.指定链接脚本

6.获得起始链接地址

7.设置头文件搜寻路径

8.使用起始链接地址

9.设置自动推导规则

设置各种路径

#设置各种路径

ifeq ($(CURDIR),$(SRCTREE))

#判断当前目录是否是顶层目录,如果是,设置dir为空

dir :=

else

#如果不是,那么dir路径为 (CURDIR)去掉(SRCTREE)的部分

dir :=

$(subst $(SRCTREE)/,,$(CURDIR))

endif

#如果源码目录与输出目录不是同一目录

ifneq ($(OBJTREE),$(SRCTREE))

#

Create object files for SPL in a separate directory

#且SPL是放在独立的目录下

ifeq

($(CONFIG_SPL_BUILD),y)

#如果dir不为空,则obj路径在(SPLTREE)/dir/目录下

#否则obj路径在(SPLTREE)目录下

obj := $(if

$(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)

else

#如果SPL不是放在独立目录下

#如果dir不为空,就放在(OBJTREE)/dir目录下

#否则obj路径为(OBJTREE)目录下

obj

:= $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)

endif

#设置src路径

#如果dir目录不为空,则src路径指向dir

#否则指向(SRCTREE)

#建立obj文件夹???

src :=

$(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)

$(shell mkdir -p $(obj))

else

# Create object files for SPL in a separate

directory

ifeq ($(CONFIG_SPL_BUILD),y)

obj := $(if

$(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)

$(shell

mkdir -p $(obj))

else

obj

:=

endif

src :=

endif

本段代码还是在进行原地编译和外部输出编译的一些路径设置

说到底,其实是把主Makefile中和路径有关的变量导入进来

下面几个FLAG清除,作用…??

# clean the slate

...

PLATFORM_RELFLAGS

=

PLATFORM_CPPFLAGS

=

PLATFORM_LDFLAGS

=

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

#下面这两句不知道是什么意思,度娘也没有查出来...

HOSTCFLAGS      = -Wall -Wstrict-prototypes -O2

-fomit-frame-pointer \

$(HOSTCPPFLAGS)

HOSTSTRIP       = strip

#

# Mac OS X /

Darwin's C preprocessor is Apple specific.

It

# generates numerous

errors and warnings.  We want to bypass

it

# and use GNU C's

cpp.  To do this we pass the

-traditional-cpp

# option to the

compiler.  Note that the -traditional-cpp

flag

# DOES NOT have the

same semantics as GNU C's flag, all it does

# is invoke the GNU

preprocessor in stock ANSI/ISO C fashion.

#

# Apple's linker is

similar, thanks to the new 2 stage linking

# multiple symbol

definitions are treated as errors, hence the

# -multiply_defined

suppress option to turn off this error.

#

#根据上面的英文解释,可能是为了兼容苹果系统的编译器,避免警告错误

ifeq

($(HOSTOS),darwin)

# get major and minor product version (e.g.

'10' and '6' for Snow Leopard)

#获取系统版本

DARWIN_MAJOR_VERSION    = $(shell sw_vers -productVersion | cut -f

1 -d '.')

DARWIN_MINOR_VERSION    = $(shell sw_vers -productVersion | cut -f

2 -d '.')

os_x_before     = $(shell if [ $(DARWIN_MAJOR_VERSION) -le

$(1) -a \

$(DARWIN_MINOR_VERSION) -le

$(2) ] ; then echo "$(3)"; else echo "$(4)"; fi ;)

# Snow Leopards build environment has no

longer restrictions as described above

#在雪豹系统上建议环境变量,我用的uboot是2011.09版本,所以当时苹果电脑还是用的雪豹版本

HOSTCC           = $(call os_x_before, 10, 5,

"cc", "gcc")

HOSTCFLAGS      += $(call os_x_before, 10, 4,

"-traditional-cpp")

HOSTLDFLAGS     += $(call os_x_before, 10, 5,

"-multiply_defined suppress")

else

#其它情况就是gcc编译器

HOSTCC          = gcc

endif

ifeq

($(HOSTOS),cygwin)

#设置标志位

HOSTCFLAGS      += -ansi

endif

# We build some

files with extra pedantic flags to try to minimize things

# that won't build

on some weird host compiler -- though there are lots of

# exceptions for

files that aren't complaint.

#同样是设置一些标志

HOSTCFLAGS_NOPED =

$(filter-out -pedantic,$(HOSTCFLAGS))

HOSTCFLAGS      += -pedantic

关于编译器的一些设置

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

#

# Option checker

(courtesy linux kernel) to ensure

# only supported

compiler options are used

#下面这句话的意思是,测试cc是否支持第一个参数,然后根据返回结果选用不同的参数

cc-option = $(shell

if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \

> /dev/null 2>&1;

then echo "$(1)"; else echo "$(2)"; fi ;)

#

# Include the make

variables (CC, etc...)

#定义交叉编译链工具

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

设置CPU相关路径,配置文件等

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

# Load generated

board configuration

#加载配置文件

sinclude

$(OBJTREE)/include/autoconf.mk

sinclude

$(OBJTREE)/include/config.mk

# Some architecture

config.mk files need to know what CPUDIR is set to,

# so calculate

CPUDIR before including ARCH/SOC/CPU config.mk files.

# Check if

arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains

# CPU-specific code.

#设置CPU的目录

CPUDIR=arch/$(ARCH)/cpu/$(CPU)

#检查CUP目录

ifneq

($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))

CPUDIR=arch/$(ARCH)/cpu

endif

#包含配置文件

sinclude

$(TOPDIR)/arch/$(ARCH)/config.mk       #

include architecture dependend rules

sinclude

$(TOPDIR)/$(CPUDIR)/config.mk          #

include  CPU  specific rules

#包含上CPU的特殊配置

ifdef   SOC

sinclude

$(TOPDIR)/$(CPUDIR)/$(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

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

关于编译器的一些设置

ifneq (,$(findstring

s,$(MAKEFLAGS)))

ARFLAGS = cr

else

ARFLAGS = crv

endif

RELFLAGS=

$(PLATFORM_RELFLAGS)

DBGFLAGS= -g #

-DDEBUG

OPTFLAGS= -Os

#-fomit-frame-pointer

OBJCFLAGS +=

--gap-fill=0xff

gccincdir := $(shell

$(CC) -print-file-name=include)

CPPFLAGS :=

$(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)

\

-D__KERNEL__

# Enable garbage

collection of un-used sections for SPL

ifeq

($(CONFIG_SPL_BUILD),y)

CPPFLAGS += -ffunction-sections

-fdata-sections

LDFLAGS_FINAL += --gc-sections

endif

ifneq

($(CONFIG_SYS_TEXT_BASE),)

CPPFLAGS +=

-DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)

endif

ifneq

($(CONFIG_SPL_TEXT_BASE),)

CPPFLAGS +=

-DCONFIG_SPL_TEXT_BASE=$(CONFIG_SPL_TEXT_BASE)

endif

ifeq

($(CONFIG_SPL_BUILD),y)

CPPFLAGS += -DCONFIG_SPL_BUILD

endif

ifneq ($(RESET_VECTOR_ADDRESS),)

CPPFLAGS +=

-DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS)

endif

ifneq

($(OBJTREE),$(SRCTREE))

CPPFLAGS += -I$(OBJTREE)/include2

-I$(OBJTREE)/include

endif

CPPFLAGS +=

-I$(TOPDIR)/include

CPPFLAGS +=

-fno-builtin -ffreestanding -nostdinc

\

-isystem $(gccincdir) -pipe

$(PLATFORM_CPPFLAGS)

ifdef BUILD_TAG

CFLAGS := $(CPPFLAGS) -Wall

-Wstrict-prototypes \

-DBUILD_TAG='"$(BUILD_TAG)"'

else

CFLAGS := $(CPPFLAGS) -Wall

-Wstrict-prototypes

endif

CFLAGS += $(call

cc-option,-fno-stack-protector)

# Some toolchains

enable security related warning flags by default,

# but they don't

make much sense in the u-boot world, so disable them.

CFLAGS += $(call

cc-option,-Wno-format-nonliteral)

CFLAGS += $(call

cc-option,-Wno-format-security)

# $(CPPFLAGS) sets

-g, which causes gcc to pass a suitable -g

# option to the

assembler.

AFLAGS_DEBUG :=

# turn jbsr into jsr

for m68k

ifeq ($(ARCH),m68k)

ifeq ($(findstring 3.4,$(shell $(CC)

--version)),3.4)

AFLAGS_DEBUG := -Wa,-gstabs,-S

endif

endif

AFLAGS :=

$(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)

LDFLAGS +=

$(PLATFORM_LDFLAGS)

LDFLAGS_FINAL +=

-Bstatic

LDFLAGS_u-boot += -T

$(obj)u-boot.lds $(LDFLAGS_FINAL)

ifneq

($(CONFIG_SYS_TEXT_BASE),)

LDFLAGS_u-boot += -Ttext

$(CONFIG_SYS_TEXT_BASE)

endif

LDFLAGS_u-boot-spl

+= -T $(obj)u-boot-spl.lds $(LDFLAGS_FINAL)

ifneq

($(CONFIG_SPL_TEXT_BASE),)

#指定起始地址TEXT_BASE

LDFLAGS_u-boot-spl += -Ttext

$(CONFIG_SPL_TEXT_BASE)

Endif

TEXT_BASE和_start的区别:

_start是可以动态变化,而TEXT_BASE是链接时就确定的地址。

_start是实际运行的地址,而TEXT_BASE是要copy到sdram中运行的地址,当然也是最终u-boot实际运行的地址。

u-boot的start.S中在启动第一阶段会比较这两个值是否相等,不相等则会将自身copy到sdram中。

假设_start出是第一条执行的指令,并且TEXT_BASE=0x27800000,那么分两种情况说明:

F当u-boot被download到nor

flash或被copy到内部sram时,假设被copy到的地址是0x907000,那么此时_start的地址是0x907000,此时就需要将自身copy到TEXT_BASE地方。

F当u-boot本身就被download sdram的TEXT_BASE定义的地址出,那么此时_start本身的地址就是0x27800000了,所以和TEXT_BASE比较的结果相等而不用作自身代码搬移的工作了。

# Location of a

usable BFD library, where we define "usable" as

# "built for

${HOST}, supports ${TARGET}".

Sensible values are

# - When

cross-compiling: the root of the cross-environment

# - Linux/ppc

(native): /usr

# - NetBSD/ppc

(native): you lose ... (must extract these from the

#   binutils build directory, plus the native

and U-Boot include

#   files don't like each other)

#

# So far, this is

used only by tools/gdb/Makefile.

#不同的系统设置不同的路径

ifeq

($(HOSTOS),darwin)

BFD_ROOT_DIR =          /usr/local/tools

else

ifeq ($(HOSTARCH),$(ARCH))

#

native

BFD_ROOT_DIR =          /usr

else

#BFD_ROOT_DIR =         /LinuxPPC/CDK           # Linux/i386

#BFD_ROOT_DIR =         /usr/pkg/cross          # NetBSD/i386

BFD_ROOT_DIR =          /opt/powerpc

endif

endif

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

#设置环境变量???

export  HOSTCC HOSTCFLAGS HOSTLDFLAGS PEDCFLAGS

HOSTSTRIP CROSS_COMPILE \

AS LD CC CPP AR NM STRIP OBJCOPY

OBJDUMP MAKE

export  CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS

PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS

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

指定编译规则

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

# Allow boards to

use custom optimize flags on a per dir/file basis

#

BCURDIR = $(subst

$(SRCTREE)/,,$(CURDIR:$(obj)%=%))

ALL_AFLAGS =

$(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR))

ALL_CFLAGS =

$(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR))

$(obj)%.s:      %.S

$(CPP) $(ALL_AFLAGS) -o $@ $<

$(obj)%.o:      %.S

$(CC)

$(ALL_AFLAGS) -o $@ $< -c

$(obj)%.o:      %.c

$(CC)

$(ALL_CFLAGS) -o $@ $< -c

$(obj)%.i:      %.c

$(CPP) $(ALL_CFLAGS) -o $@ $< -c

$(obj)%.s:      %.c

$(CC)

$(ALL_CFLAGS) -o $@ $< -c -S

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

# If the list of

objects to link is empty, just create an empty built-in.o

cmd_link_o_target =

$(if $(strip $1),\

$(LD) $(LDFLAGS) -r -o

$@ $1,\

rm -f $@; $(AR) rcs $@ )

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

最后,再吼一下俺的口号:

每天进步一点点,开心多一点^_^

--2017年3月21日 17:36:24

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值