U-Boot源码——config.mk

来源:互联网 发布:sql with树形 编辑:程序博客网 时间:2024/06/08 20:09

    根据参考资料[2][3][4]的提示,*.mk就是用于被Makefile包含的文件(include),用于分担Makefile的任务,因此其编写语法同Makefile。

    顾名思义,config.mk就是用于配置U-Boot的文件,源码中有许多同名config.mk文件,顶级目录有一个,其它分布在平台相关或者开发板相关的目录中。

1 平台/开发板相关config.mk

    在平台/开发板相关的目中的config.mk与特定平台/开发板的配置有关。根据参考资料[1]p257的提示,board/$(BOARDDIR)/config.mk文件指定了代码段起始地址board/samsung/smdk6400/config.mk内容如下:

# On SMDK6400 we use the 64 MB SDRAM bank at## 0x50000000 to 0x58000000## Linux-Kernel is expected to be at 0x50008000, entry 0x50008000## we load ourselves to 0x57e00000 without MMU# with MMU, load address is changed to 0xc7e00000## download area is 0x5000c000sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmpifndef CONFIG_NAND_SPLCONFIG_SYS_TEXT_BASE = $(RAM_TEXT)elseCONFIG_SYS_TEXT_BASE = 0endif

    上述文件注释部分说明了smdk6400开发板的SDRAM地址范围:0x50000000 - 0x58000000。

    board/ti/omap5912osk/config.mk的内容如下:

# TI OSK board with OMAP5912 (ARM925EJS) cpu# see http://www.ti.com/ for more information on Texas Instruments## OSK has 1 bank of 256 MB SDRAM# Physical Address:# 1000'0000 to 2000'0000### Linux-Kernel is expected to be at 1000'8000, entry 1000'8000# (mem base + reserved)## we load ourself to 1108'0000##CONFIG_SYS_TEXT_BASE = 0x11080000

    可见上述config.mk文件内容比较简单,主要是定义了CONFIG_SYS_TEXT_BASE变量的值,此变量将会在lowlevel_init.S中使用,详见《U-Boot源码——lowlevel_init.S》。

2 顶级目录config.mk

    顶级目录的config.mk负责整体配置,内容如下:

#########################################################################ifeq ($(CURDIR),$(SRCTREE))dir :=elsedir := $(subst $(SRCTREE)/,,$(CURDIR))endififneq ($(OBJTREE),$(SRCTREE))# Create object files for SPL in a separate directoryifeq ($(CONFIG_SPL_BUILD),y)obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)elseobj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)endifsrc := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)$(shell mkdir -p $(obj))else# Create object files for SPL in a separate directoryifeq ($(CONFIG_SPL_BUILD),y)obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/)$(shell mkdir -p $(obj))elseobj :=endifsrc :=endif# 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 aboveHOSTCC = $(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")elseHOSTCC= gccendififeq ($(HOSTOS),cygwin)HOSTCFLAGS+= -ansiendif# 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_OPTIONS_CACHE_FILE := $(OBJTREE)/include/generated/cc_options.mk$(if $(wildcard $(CC_OPTIONS_CACHE_FILE)),,\$(shell mkdir -p $(dir $(CC_OPTIONS_CACHE_FILE))))-include $(CC_OPTIONS_CACHE_FILE)cc-option-sys = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \> /dev/null 2>&1; then \echo 'CC_OPTIONS += $(strip $1)' >> $(CC_OPTIONS_CACHE_FILE); \echo "$(1)"; fi)ifeq ($(CONFIG_CC_OPT_CACHE_DISABLE),y)cc-option = $(strip $(if $(call cc-option-sys,$1),$1,$2))elsecc-option = $(strip $(if $(findstring $1,$(CC_OPTIONS)),$1,\$(if $(call cc-option-sys,$1),$1,$2)))endif## Include the make variables (CC, etc...)#AS= $(CROSS_COMPILE)asLD= $(CROSS_COMPILE)ldCC= $(CROSS_COMPILE)gccCPP= $(CC) -EAR= $(CROSS_COMPILE)arNM= $(CROSS_COMPILE)nmLDR= $(CROSS_COMPILE)ldrSTRIP= $(CROSS_COMPILE)stripOBJCOPY = $(CROSS_COMPILE)objcopyOBJDUMP = $(CROSS_COMPILE)objdumpRANLIB= $(CROSS_COMPILE)RANLIBDTC= dtc########################################################################## Load generated board configurationsinclude $(OBJTREE)/include/autoconf.mksinclude $(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.CPUDIR=arch/$(ARCH)/cpu/$(CPU)ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR)))CPUDIR=arch/$(ARCH)/cpuendifsinclude $(TOPDIR)/arch/$(ARCH)/config.mk# include architecture dependend rulessinclude $(TOPDIR)/$(CPUDIR)/config.mk# include  CPUspecific rulesifdefSOCsinclude $(TOPDIR)/$(CPUDIR)/$(SOC)/config.mk# include  SoCspecific rulesendififdefVENDORBOARDDIR = $(VENDOR)/$(BOARD)elseBOARDDIR = $(BOARD)endififdefBOARDsinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk# include board specific rulesendif########################################################################## We don't actually use $(ARFLAGS) anywhere anymore, so catch people# who are porting old code to latest mainline but not updating $(AR).ARFLAGS = $(error update your Makefile to use cmd_link_o_target and not AR)RELFLAGS= $(PLATFORM_RELFLAGS)DBGFLAGS= -g # -DDEBUGOPTFLAGS= -Os #-fomit-frame-pointerOBJCFLAGS += --gap-fill=0xffgccincdir := $(shell $(CC) -print-file-name=include)CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)\-D__KERNEL__# Enable garbage collection of un-used sections for SPLifeq ($(CONFIG_SPL_BUILD),y)CPPFLAGS += -ffunction-sections -fdata-sectionsLDFLAGS_FINAL += --gc-sectionsendififneq ($(CONFIG_SYS_TEXT_BASE),)CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE)endififneq ($(CONFIG_SPL_TEXT_BASE),)CPPFLAGS += -DCONFIG_SPL_TEXT_BASE=$(CONFIG_SPL_TEXT_BASE)endififeq ($(CONFIG_SPL_BUILD),y)CPPFLAGS += -DCONFIG_SPL_BUILDendififneq ($(RESET_VECTOR_ADDRESS),)CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS)endififneq ($(OBJTREE),$(SRCTREE))CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/includeendifCPPFLAGS += -I$(TOPDIR)/includeCPPFLAGS += -fno-builtin -ffreestanding -nostdinc\-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)ifdef BUILD_TAGCFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \-DBUILD_TAG='"$(BUILD_TAG)"'elseCFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypesendifCFLAGS_SSP := $(call cc-option,-fno-stack-protector)CFLAGS += $(CFLAGS_SSP)# 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_WARN := $(call cc-option,-Wno-format-nonliteral) \       $(call cc-option,-Wno-format-security)CFLAGS += $(CFLAGS_WARN)# $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format># option to the assembler.AFLAGS_DEBUG :=# turn jbsr into jsr for m68kifeq ($(ARCH),m68k)ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)AFLAGS_DEBUG := -Wa,-gstabs,-SendifendifAFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)LDFLAGS += $(PLATFORM_LDFLAGS)LDFLAGS_FINAL += -BstaticLDFLAGS_u-boot += -T $(obj)u-boot.lds $(LDFLAGS_FINAL)ifneq ($(CONFIG_SYS_TEXT_BASE),)LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)endifLDFLAGS_u-boot-spl += -T $(obj)u-boot-spl.lds $(LDFLAGS_FINAL)ifneq ($(CONFIG_SPL_TEXT_BASE),)LDFLAGS_u-boot-spl += -Ttext $(CONFIG_SPL_TEXT_BASE)endif# 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/toolselseifeq ($(HOSTARCH),$(ARCH))# nativeBFD_ROOT_DIR =/usrelse#BFD_ROOT_DIR =/LinuxPPC/CDK# Linux/i386#BFD_ROOT_DIR =/usr/pkg/cross# NetBSD/i386BFD_ROOT_DIR =/opt/powerpcendifendif#########################################################################exportHOSTCC HOSTCFLAGS HOSTLDFLAGS PEDCFLAGS HOSTSTRIP CROSS_COMPILE \AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKEexportCONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS########################################################################## Allow boards to use custom optimize flags on a per dir/file basisBCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%))ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR))ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR))EXTRA_CPPFLAGS = $(CPPFLAGS_$(BCURDIR)/$(@F)) $(CPPFLAGS_$(BCURDIR))ALL_CFLAGS += $(EXTRA_CPPFLAGS)# The _DEP version uses the $< file target (for dependency generation)# See rules.mkEXTRA_CPPFLAGS_DEP = $(CPPFLAGS_$(BCURDIR)/$(addsuffix .o,$(basename $<))) \$(CPPFLAGS_$(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.ocmd_link_o_target = $(if $(strip $1),\      $(LD) $(LDFLAGS) -r -o $@ $1,\      rm -f $@; $(AR) rcs $@ )#########################################################################

参考资料

[1]伟东山. 嵌入式Linux应用开发完全手册. 人民邮电出版社,2012

[2]详解安卓系统中的Android.mk文件

[3]mk是什么格式的文件,用什么软件打开

[4]请问FreeBSD中的.mk为后缀的是什么文件?

0 0
原创粉丝点击