/**

******************************************************************************
* @author    Maoxiao Hu
* @version   V1.0.0
* @date       Dec-2014
******************************************************************************
* < COPYRIGHT 2014 ISE of SHANDONG UNIVERSITY >
*******************************************************************************
**/
 
Based on u-boot-2014-10.
顶层config.mk的内容并不长,这里全部贴出来吧。
这里以已经执行完make trats_defconfig(这个流程可以参看:《2014-10 u-boot make xxx_defconfig 过程分析》),在顶层目录已经生成了.config文件为例,说明config.mk中各变量的取值。
 

 15 PLATFORM_RELFLAGS :=

 16 PLATFORM_CPPFLAGS :=

 17 PLATFORM_LDFLAGS :=

 18 LDFLAGS :=

 19 LDFLAGS_FINAL :=

 20 OBJCOPYFLAGS :=

 21 #########################################################################

 22 

 23 ARCH := $(CONFIG_SYS_ARCH:"%"=%)

 24 CPU := $(CONFIG_SYS_CPU:"%"=%)

 25 BOARD := $(CONFIG_SYS_BOARD:"%"=%)

 26 ifneq ($(CONFIG_SYS_VENDOR),)

 27 VENDOR := $(CONFIG_SYS_VENDOR:"%"=%)

 28 endif

 29 ifneq ($(CONFIG_SYS_SOC),)

 30 SOC := $(CONFIG_SYS_SOC:"%"=%)

 31 endif

 32 

 33 # Some architecture config.mk files need to know what CPUDIR is set to,

 34 # so calculate CPUDIR before including ARCH/SOC/CPU config.mk files.

 35 # Check if arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains

 36 # CPU-specific code.

 37 CPUDIR=arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)

 38 

 39 sinclude$(srctree)/arch/$(ARCH)/config.mk  # include architecture dependend rules

 40 sinclude$(srctree)/$(CPUDIR)/config.mk     # include  CPU  specific rules

 41 

 42 ifdef   SOC

 43 sinclude$(srctree)/$(CPUDIR)/$(SOC)/config.mk  # include  SoC  specific rules

 44 endif

 45 ifneq ($(BOARD),)

 46 ifdef   VENDOR

 47 BOARDDIR = $(VENDOR)/$(BOARD)

 48 else

 49 BOARDDIR = $(BOARD)

 50 endif

 51 endif

 52 ifdef   BOARD

 53 sinclude$(srctree)/board/$(BOARDDIR)/config.mk # include board specific rules

 54 endif

 55 

 56 ifdef FTRACE

 57 PLATFORM_CPPFLAGS += -finstrument-functions -DFTRACE

 58 endif

 59 

 60 #########################################################################

 61 

 62 RELFLAGS := $(PLATFORM_RELFLAGS)

 63 

 64 OBJCOPYFLAGS += --gap-fill=0xff

 65 

 66 PLATFORM_CPPFLAGS += $(RELFLAGS)

 67 PLATFORM_CPPFLAGS += -pipe

 68 

 69 LDFLAGS += $(PLATFORM_LDFLAGS)

 70 LDFLAGS_FINAL += -Bstatic

 71 

 72 export PLATFORM_CPPFLAGS

 73 export RELFLAGS

 74 export LDFLAGS_FINAL

 75 export CONFIG_STANDALONE_LOAD_ADDR

 
 
config.mk被顶层Makefile包含,通过:

include$(srctree)/config.mk

这句话。
 
ARCH := $(CONFIG_SYS_ARCH:"%"=%)
ARCH = “arm”
CPU := $(CONFIG_SYS_CPU:"%"=%)
CPU = “armv7”
BOARD := $(CONFIG_SYS_BOARD:"%"=%)
BOARD = “trats”
 

ifneq ($(CONFIG_SYS_VENDOR),)

 VENDOR := $(CONFIG_SYS_VENDOR:"%"=%)

endif

在这里CONFIG_SYS_VENDOR = “samsung” 所以 VENDOR = “samsung”
 

ifneq ($(CONFIG_SYS_SOC),)

SOC := $(CONFIG_SYS_SOC:"%"=%)

endif

在这里CONFIG_SYS_SOC = “exynos” 所以 SOC = “exynos”
 
CPUDIR=arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)
替换已知变量:
CPUDIR=arch/arm/cpu/armv7
 

sinclude$(srctree)/arch/$(ARCH)/config.mk  # include architecture dependend rules

sinclude$(srctree)/$(CPUDIR)/config.mk     # include  CPU  specific rules

替换已知变量:

sinclude$(srctree)/arch/arm/config.mk  # include architecture dependend rules

sinclude$(srctree)/arch/arm/cpu/armv7/config.mk     # include  CPU  specific rules

 
 

 42 ifdef   SOC

 43 sinclude$(srctree)/$(CPUDIR)/$(SOC)/config.mk  # include  SoC  specific rules

 44 endif

已定义SOC,替换已知变量:

 43 sinclude$(srctree)/arch/arm/cpu/armv7/exynos/config.mk  # include  SoC  specific rules

 

 45 ifneq ($(BOARD),)

 46 ifdef   VENDOR

 47 BOARDDIR = $(VENDOR)/$(BOARD)

 48 else

 49 BOARDDIR = $(BOARD)

 50 endif

 51 endif

BOARD变量不为空,且已定义VENDOR,替换已知变量:

 47 BOARDDIR = samsung/trats

 

 52 ifdef   BOARD

 53 sinclude$(srctree)/board/$(BOARDDIR)/config.mk # include board specific rules

 54 endif

已定义BOARD,替换已知变量:

 53 sinclude$(srctree)/board/samsung/trats/config.mk # include board specific rules

 
总结,源文件经过替换后,变成下面代码:
ARCH = “arm”
CPU = “armv7”
BOARD = “trats”
VENDOR = “samsung”
SOC = “exynos”
CPUDIR=arch/arm/cpu/armv7

sinclude$(srctree)/arch/arm/config.mk  # include architecture dependend rules

sinclude$(srctree)/arch/arm/cpu/armv7/config.mk     # include  CPU  specific rules

sinclude$(srctree)/arch/arm/cpu/armv7/exynos/config.mk  # include  SoC  specific rules

BOARDDIR = samsung/trats

sinclude$(srctree)/board/samsung/trats/config.mk # include board specific rules

其它编译选项就不做解释了。

2014-10 u-boot 顶层config.mk分析的更多相关文章

  1. uboot顶层config.mk分析

    uboot顶层目录中的config.mk定义了确定了当前执行makefile所对应的源文件目录.目标文件目录,编译的程序编译.连接的选项,以及目标文件生成的规则等等.它被包含在顶层的makefile以 ...

  2. u-boot顶层目录config.mk分析

    1. 设置obj与src ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir := else dir := $(subst $( ...

  3. uboot总结:uboot配置和启动过程3(config.mk分析)

    说明:文件位置:在uboot的目录下,文件名为:config.mk.是一个makefile文件,以后会被主Makefile调用. 它的主要作用的是: (1)具体的设置交叉编译工具链接(主Makefil ...

  4. U-Boot Makefile分析(2) config.mk分析

    浏览一下U-Boot各个子目录下的Makefile可以看到,几乎他们都会包含$(TOPDIR)/config.mk,那么这个文件进行了什么操作呢?简单概括:读入include/config.mk.in ...

  5. U-Boot Makefile分析(3) rules.mk分析

    浏览各个子Makefile可以发现,他们都会在文件的后面包含rules.mk,这个文件的作用就是更新源文件的依赖,并生成各种.depend文件. _depend: $(obj).depend # Sp ...

  6. uboot 顶层makefile细节分析

    uboot的源文件众多,学习庞然大物首先找到脊椎--顶层的makfile,逐一破解.但是,uboot的makefile同样是一个庞然大物,所以也要找到它的主线.倘若过分专注部分细节,很难做到把握全局, ...

  7. Linux - Eclipse CDT + GCC 安装(2014.10.2)

    Eclipse CDT + GCC 安装 (2014.10.2) 本文地址:http://blog.csdn.net/caroline_wendy 1. 安装Eclipse,在官方站点下载Eclips ...

  8. Spring Boot 实战与原理分析视频课程

    Spring Boot 实战与原理分析视频课程 链接:https://pan.baidu.com/share/init?surl=PeykcoeqZtd1d9lN9V_F-A 提取码: 关注公众号[G ...

  9. spring boot启动原理步骤分析

    spring boot最重要的三个文件:1.启动类 2.pom.xml 3.application.yml配置文件 一.启动类->main方法 spring boot启动原理步骤分析 1.spr ...

随机推荐

  1. iOS开发——实用篇&KVO与KVC详解

    KVO与KVC详解 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC ...

  2. 15分钟学会git基本的操作命令

    http://hao.jobbole.com/try-git/ 假如你现在新创建了一个项目,想把它提交到github上面? 假设你创建好了一个项目,并切换到项目的根目录下面: $ git status ...

  3. Dijkstra最短路径算法[贪心]

    Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是 ...

  4. day02 Java基础

    1.Java中的关键字都是小写的. 2.Java中的关键字 3.Java中的注释分为:单行注释.多行注释.文档注释 文档注释将被javadoc工具解析生成一个说明书. 4.Java中的常量分为字面值常 ...

  5. Android基本控件之RadioGroup

    我们在手机上经常看到一堆选项,但是我们只能选择一个,那么在Android中,这个控件就叫做RadioButton,也就是单选按钮的意思,他们之所以能够达到只能选择一个的效果,是因为有一个RadioGr ...

  6. 从 Auto Layout 的布局算法谈性能

    这是使用 ASDK 性能调优系列的第二篇文章,前一篇文章中讲到了如何提升 iOS 应用的渲染性能,你可以点击 这里 了解这部分的内容. http://t.cn/Rc4KbUC 在上一篇文章中,我们提到 ...

  7. C#打开指定目录,并将焦点放在指定文件上。相对路径(程序起动的目录)

    string basepath = AppDomain.CurrentDomain.BaseDirectory; string filepath = "logs\\Log.log" ...

  8. 有关java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0

    时常会遇到java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0这样的异常,现在都知道是jdk版本的问 ...

  9. LeetCode 122

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  10. SQLite的查询

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...