zoukankan      html  css  js  c++  java
  • uboot顶层config.mk分析

    #
    # (C) Copyright 2000-2006
    # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
    #
    # See file CREDITS for list of people who contributed to this
    # project.
    #
    # This program is free software; you can redistribute it and/or
    # modify it under the terms of the GNU General Public License as
    # published by the Free Software Foundation; either version 2 of
    # the License, or (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software
    # Foundation, Inc., 59 Temple Place, Suite 330, Boston,
    # MA 02111-1307 USA
    #

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

    ifneq ($(OBJTREE),$(SRCTREE))
    ifeq ($(CURDIR),$(SRCTREE))
    dir :=
    else
    dir := $(subst $(SRCTREE)/,,$(CURDIR))
    endif

    obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
    src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)

    $(shell mkdir -p $(obj))
    else
    obj :=
    src :=
    endif

    # clean the slate ...
    PLATFORM_RELFLAGS =
    PLATFORM_CPPFLAGS =
    PLATFORM_LDFLAGS =

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

    ifeq ($(HOSTOS),darwin)
    HOSTCC = cc
    else
    HOSTCC = gcc
    endif
    HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    HOSTSTRIP = strip

    #########################################################################
    #
    # Option checker (courtesy linux kernel) to ensure
    # only supported compiler options are used
    #
    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

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

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

    ifdef ARCH
    sinclude $(TOPDIR)/lib_$(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

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

    ifneq (,$(findstring s,$(MAKEFLAGS)))//在$(MAKEFLAGS)查找是否有s字符
    ARFLAGS = cr //不太理解这两项的意思
    else
    ARFLAGS = crv
    endif
    RELFLAGS= $(PLATFORM_RELFLAGS)
    DBGFLAGS= -g # -DDEBUG 调试选项
    OPTFLAGS= -Os #-fomit-frame-pointer 优化选项
    ifndef LDSCRIPT
    #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
    ifeq ($(CONFIG_NAND_U_BOOT),y)
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
    else
    LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    endif
    endif
    OBJCFLAGS += --gap-fill=0xff

    gccincdir := $(shell $(CC) -print-file-name=include)

    CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)
    -D__KERNEL__

    ifneq ($(BOOT_MEDIA),)
    BOOT_MEDIA_MACRO = BOOT_MEDIA_$(shell echo $(BOOT_MEDIA) | tr '[a-z]' '[A-Z]')
    CPPFLAGS += -D$(BOOT_MEDIA_MACRO)
    endif

    ifneq ($(TEXT_BASE),)
    CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
    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)

    # avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9)
    # this option have to be placed behind -Wall -- that's why it is here
    ifeq ($(ARCH),nios)
    ifeq ($(findstring 2.9,$(shell $(CC) --version)),2.9)
    CFLAGS := $(CPPFLAGS) -Wall -Wno-trigraphs
    endif
    endif

    # $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
    # 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 += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS)
    ifneq ($(TEXT_BASE),)
    LDFLAGS += -Ttext $(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/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 CROSS_COMPILE
    AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKE
    export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS

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

    # Allow boards to use custom optimize flags on a per dir/file basis
    BCURDIR := $(notdir $(CURDIR))
    $(obj)%.s: %.S
    $(CPP) $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $<
    $(obj)%.o: %.S
    $(CC) $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $< -c
    $(obj)%.o: %.c
    $(CC) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
    $(obj)%.i: %.c
    $(CPP) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
    $(obj)%.s: %.c
    $(CC) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c -S

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

    以下内容摘抄与此处:http://blog.chinaunix.net/uid-11319766-id-3065823.html

    uboot的编译选项差不多都写在顶层的config.mk中。下面分析此文件中和编译选项有关的部分。
    定义本地编译环境变量:
    1. ifeq ($(HOSTOS),darwin) #如果主机系统为darwin则主机编译器为cc否则为gcc
    2. HOSTCC = cc
    3. else
    4. HOSTCC = gcc
    5. endif
    6. HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    7. HOSTSTRIP = strip
    HOSTCFLAGS变量保存选项:
    -Wall : 显示编译中的警告信息
    -Wstrict-prototypes : 如果函数的声明或定义没有指出参数类型,编译器就发出警告.
    -O2 : 使用O2级别的优化
    -fomit-frame-pointer : 对于不需要帧指针的函数,不要在寄存器中保存帧指针
     
    下面有一个cc-option变量,此变量保存了一个测试编译选项的命令。其他地方会经常用call函数来调用它,测试编译选项。
    1. cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null
    2. > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
    这条语句写整齐了如下:
    1. if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1;then
    2. echo "$(1)";
    3. else
    4. echo "$(2)";
    5. fi;
    可以看出这是一条编译命令,变量CC是编译器,变量CFLAGS是编译选项,其中选项
    -S:编译后立即结束,不进行汇编等操作。
    -o /dev/null : 生成文件到/dev/null,即不生成任何编译结果,要编译的文件也为空。
    -xc: 指定按c语言编译
    调用此语句如:call cc-option,-a,-b 则如果支持-a选项则返回-a否则返回-b
     
    下面变量是定义各个编译用到的工具,CROSS_COMPILE在顶层Makefile中定义
    1. AS = $(CROSS_COMPILE)as #汇编器
    2. LD = $(CROSS_COMPILE)ld #连接器
    3. CC = $(CROSS_COMPILE)gcc #编译器
    4. CPP = $(CC) -E #预处理
    5. AR = $(CROSS_COMPILE)ar #归档文件
    6. NM = $(CROSS_COMPILE)nm #列出object文件中的符号
    7. LDR = $(CROSS_COMPILE)ldr #默认连接脚本
    8. STRIP = $(CROSS_COMPILE)strip #丢弃目标文件中的符号
    9. OBJCOPY = $(CROSS_COMPILE)objcopy #转换目标文件格式
    10. OBJDUMP = $(CROSS_COMPILE)objdump #反汇编
    11. RANLIB = $(CROSS_COMPILE)RANLIB #产生归档文件索引
     
    接下来和编译选项有关的是
     
    1. ifdef ARCH
    2. sinclude $(TOPDIR)/lib_$(ARCH)/config.mk # include architecture dependend rules
    3. endif
    4. ifdef CPU
    5. sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
    6. endif
    7. ifdef SOC
    8. sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
    9. endif
    10. ifdef VENDOR
    11. BOARDDIR = $(VENDOR)/$(BOARD)
    12. else
    13. BOARDDIR = $(BOARD)
    14. endif
    15. ifdef BOARD
    16. sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
    17. endif
    这几行包含了和ARCH,CPU,SOC,BOARD等相关的编译选项的config.mk文件,以lib_arm/config.mk文件为例,此文件中包含这么一句:
    1. PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
    -D选项是定义的意思,此句即为定义CONFIG_ARM __ARM__这两个值,如果编译C文件则相当于#define CONFIG_ARM这样的语句
    还有如下语句:
    1. PLATFORM_CPPFLAGS += $(call cc-option,-marm,)
    根据前面提到的cc-option的分析,可以看出,此句测试-marm选项如果被支持的添加进PLATFORM_CPPFLAGS变量,否则则添加空值。后面call函数调用的都是测试一些选择是否能被支持如果支持就添加。此文件中都是尝试添加一切arm体系相关的选项。
    此文件最后指定了lds连接文件
    1. LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds
    其他config.mk文件类似。
    BOARD相关目录中的config.mk,本例mini2440目录中config.mk则只定义了TEXT_BASE = 0x33F80000,这个变量保存了uboot在内存中运行地址。
     
    顶层config.mk中接下来是整合这些编译选项,整理下大致如下,
     
    1. RELFLAGS= $(PLATFORM_RELFLAGS)
    2. DBGFLAGS= -g # -DDEBUG #-g 添加调试信息
    3. OPTFLAGS= -Os #-fomit-frame-pointer
    4. OBJCFLAGS += --gap-fill=0xff #段之间的空隙用0xff填充
    5. gccincdir := $(shell $(CC) -print-file-name=include) #编译器的include路径
    6. CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) -D__KERNEL__
    7. #此变量综合了DBGFLAGS,OPTFLAGS,RELFLAGS编译选项,并定义了__KERBEL__
    8. ifneq ($(TEXT_BASE),)
    9. CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) #定义了TEXT_BASE变量
    10. endif
    11. CPPFLAGS += -I$(TOPDIR)/include #添加include搜索路径
    12. CPPFLAGS += -fno-builtin -ffreestanding -nostdinc
    13. -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
    14. #-fno-builtin 不接受不是两个下划线的内建函数
    15. #-ffreestanding 安独立环境编译
    16. #-nostdinc 不要在标准系统目录中寻找头文件 只在-I指定的目录中搜索
    17. #-isystem 指定系统目录
    18. #-pipe 在编译的不同阶段使用管道通讯
    19. #$(PLATFORM_CPPFLAGS) 添加
    20. CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
    21. #-Wstrict-prototypes如果函数的声明或定义没有给出参数类型则警告
    22. CFLAGS += $(call cc-option,-fno-stack-protector)
    23. #尝试添加-fno-stack-protector选项
    24. AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
    25. LDFLAGS += -Bstatic -T $(obj)u-boot.lds $(PLATFORM_LDFLAGS)
    26. #-Bstatic静态编译 使用u-boot.lds连接描述文件,此文件是LDSCRIPT变量保存的路径复制过来的
    27. ifneq ($(TEXT_BASE),)
    28. LDFLAGS += -Ttext $(TEXT_BASE) #连接运行时的内存地址
    29. endif
     
    下面几行规定了各种文件的编译时用到的编译选项:
    1. BCURDIR := $(notdir $(CURDIR))
    2. $(obj)%.s: %.S
    3. $(CPP) $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $< //其中$(@F)代表不包含文件路径的目标文件名
    4. $(obj)%.o: %.S
    5. $(CC) $(AFLAGS) $(AFLAGS_$(@F)) $(AFLAGS_$(BCURDIR)) -o $@ $< -c
    6. $(obj)%.o: %.c
    7. $(CC) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
    8. $(obj)%.i: %.c
    9. $(CPP) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c
    10. $(obj)%.s: %.c
    11. $(CC) $(CFLAGS) $(CFLAGS_$(@F)) $(CFLAGS_$(BCURDIR)) -o $@ $< -c -S
  • 相关阅读:
    自定义sql server 聚合涵数
    EF CodeFirst学习笔记004--足够聪明
    EF CodeFirst学习笔记003--如何创建表
    EF CodeFirst学习笔记002--更新数据库表
    EF CodeFirst学习笔记001--主键约定
    SQL Server 2008中SQL增强之一:Values新用途 001
    SQLServer 学习笔记 序
    设计模式之单例模式
    如何控制数据库表中的某个字段的权限
    利用ResultFilter实现asp.net mvc3 页面静态化
  • 原文地址:https://www.cnblogs.com/haoxing990/p/4630533.html
Copyright © 2011-2022 走看看