uboot源码——根目录下的config.mk文件分析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

1、设置各种路径

ifneq ($(OBJTREE),$(SRCTREE))
ifeq ($(CURDIR),$(SRCTREE))
dir :=
else
dir := $(subst $(SRCTREE)/,,$(CURDIR))
endifobj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)$(shell mkdir -p $(obj))
else
obj :=
src :=
endif
  • 本段代码还是在进行原地编译和外部输出编译的一些路径设置。
  • 说到底,其实是把主Makefile中和路径有关的变量导入进来。
PLATFORM_RELFLAGS =
PLATFORM_CPPFLAGS =
PLATFORM_LDFLAGS =ifeq ($(ARCH),ppc)
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
endififeq ($(ARCH),arm)
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
endif
  • 本段都是和powerpc有关的交叉编译工具链的设置。


2、设置主机环境的编译选项。(72至85行)

CONFIG_SHELL    := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \else if [ -x /bin/bash ]; then echo /bin/bash; \else echo sh; fi ; fi)ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
HOSTCC      = cc
else
HOSTCC      = gcc
endif
HOSTCFLAGS  = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTSTRIP   = strip
  • shell的一些配置过程,和主机编译器的一些配置。

3. 确定各交叉编译工具。

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 ;)
  • 本段是编译链接的一些过程选项。
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
  • 确定了完整的各交叉编译工具,通过顶层makefile中得到的CROSS_COMPILE变量(即工具链的前缀),由此定义各工具的名称。

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

sinclude $(OBJTREE)/include/autoconf.mkifdef   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
  • 本段最开始包含了一个autoconf.mk文件,此文件也不是源码自带的,其内容全部都是CONFIG_开头的变量,makefile利用这些变量来指导编译过程的走向(.c文件条件编译)。
  • autoconf.mk其实是由顶层Makefile利用根目录下include/configs/x210_sd.h生成的,其内容与x210_sd.h没什么区别,其生成方式在顶层makefile的470多行左右。
  • uboot的可移植性很大程度来源于x210_sd.h文件,它也是移植工作的关键所在。
  • 后面几行分别inlude了和ARCH、CPU、SOC、VENDOR、BOARD相关的子config.mk,也就是包含了各种级别的编译属性选项。

5、指定链接脚本。

ifneq (,$(findstring s,$(MAKEFLAGS)))
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
  • 本段最开始先配置了一些编译选项。
  • 随后检测是否定义过LDSCRIPT这个和链接脚本有关的变量,如果没有定义,则判断CONFIG_NAND_U_BOOT(autoconf.mk中定义)这个值是否为y。
  • 若未使用nandflash,则链接脚本为指定路径下的u-boot.lds。若使用了nandflash,则链接脚本为指定路径下的u-boot-nand.lds。

6、获得起始链接地址。

gccincdir := $(shell $(CC) -print-file-name=include)CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)       \-D__KERNEL__
ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
  • 本段最开始先配置了一些编译选项,随后做了一些和TEXT_BASE相关的工作。
  • 在前面120多行左右include了一个board级别的config.mk文件 ,这个.mk文件源码中不存在,是在顶层makefile中由x210_sd_config创建的,并在ARCH、SOC等变量后面添加TEXT_BASE,展开后就获得了一个TEXT_BASE变量。
  • TEXT_BASE这个变量的含义是uboot将来被链接时的起始地址,是规定好的,但由于uboot使用虚拟地址映射,所以这个地址并不是真正的物理地址。
  • 最后进行判断,如果TEXT_BASE不为空,就将其设置到CPPFLAGS里面去。

7、设置头文件搜寻路径。

ifneq ($(OBJTREE),$(SRCTREE))
CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
endifCPPFLAGS += -I$(TOPDIR)/include
CPPFLAGS += -fno-builtin -ffreestanding -nostdinc   \-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
  • 本段设置了头文件的搜寻路径,添加了顶层目录下的include文件夹作为搜索路径。然后进行了一些其他设置(比如禁止标准的include路径)。
  • 这样,编译器在编译的时候就能正确的读取到include文件夹下的头文件(其实是配置阶段创建的符号链接)了。

8、使用起始链接地址。

LDFLAGS += -Bstatic -T $(LDSCRIPT) $(PLATFORM_LDFLAGS)
ifneq ($(TEXT_BASE),)
LDFLAGS += -Ttext $(TEXT_BASE)
endif
  • 本段是把TEXT_BASE用-Ttext传给了链接脚本,故链接脚本将从TEXT_BASE开始链接。

9、设置自动推导规则。

ifndef REMOTE_BUILD%.s:    %.S$(CPP) $(AFLAGS) -o $@ $<
%.o:    %.S$(CC) $(AFLAGS) -c -o $@ $<
%.o:    %.c$(CC) $(CFLAGS) -c -o $@ $<else$(obj)%.s: %.S$(CPP) $(AFLAGS) -o $@ $<
$(obj)%.o: %.S$(CC) $(AFLAGS) -c -o $@ $<
$(obj)%.o: %.c$(CC) $(CFLAGS) -c -o $@ $<
endif
  • 本段是makefile的自动推导规则,和顶层Makefile内的规则配合使用,实现众多文件的编译。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.Net中using的使用的方法(转)

摘自&#xff1a;http://blog.sina.com.cn/s/blog_6aa9c73801018ggw.html 一、强制资源整理&#xff08;实用性非常强&#xff0c;希望大家多多使用&#xff0c;比try-catch-finaly效率高、好用&#xff09;用途&#xff1a;整理非托管资源&#xff0c;不受GC控制的资源。using…

android系统特效详解和修改方法

安卓系统特效相关文件&#xff1a; 存在于&#xff1a;framework-res.apk 反编译后的\framework-res\res\anim文件夹内&#xff01;anim文件夹下所有的文件都是特效文件原理 反编译framework-res.apk 替换anim文件夹下的文件达到修改特效的目的&#xff01;然后再重建frame…

认识伪类元素:before和:after

起因于不理解下图点的写法&#xff0c;后来发现是个很基础的东西 运用了伪类元素:before&#xff0c;如下 注意&#xff0c;他的css写法也是非常简洁高效的。 查阅了些关于伪类before和after的知识帮助理解&#xff0c;以下摘自&#xff1a;http://www.hulufei.com/post/about-…

uboot源码——内核启动分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、uboot作用简介 uboot的主要作用是用来启动linux内核。 CPU不能直接从块设备中执行代码&#xff0c;因此需要把块设备中的程序复制到内存中&#xff0c;而复制之前还需要进行很多初始化工作&…

票据单号生产软件

有个老师要做excel表格&#xff0c;里面要罗列某票据还是什么单号的编号&#xff0c;格式如上图所示。一开始她说能不能写个excel函数&#xff0c;一拖就搞定~我觉得很难搞出来&#xff0c;就写个软件&#xff0c;生产单号保存在TXT文件&#xff0c;然后让她复制粘贴到excel表就…

uboot源码——C阶段的start_armboot函数

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、start_armboot函数简介 uboot第一阶段&#xff0c;start.S文件中进行一系列的SoC内部硬件的初始化&#xff0c;然后长跳转到start_armboot 函数中。 uboot第二阶段&#xff0c;start_armboot函数…

Hibernate的fetch

hibernate抓取策略fetch具体解释一、hibernate抓取策略&#xff08;单端代理的批量抓取fetchselect(默认&#xff09;/join&#xff09;測试用例&#xff1a;Student student (Student)session.get(Student.class, 1);System.out.println(student.getName());System.out.print…

source insight的使用方法

1、下载与安装 下载与安装方法见链接。 “Insight3.exe”这个是汉化版&#xff0c;直接打开&#xff0c;不需要安装。 “Si35Setup.exe”这个是英文版&#xff0c;安装后需要自己找到应用图标并发送快捷方式到桌面。 2、快速新建工程 &#xff08;1&#xff09;点击 Project —…

TortoiseSVN检出链接(可用于与站点集成)

为什么80%的码农都做不了架构师&#xff1f;>>> TortoiseSVN&#xff08;简称TSVN&#xff09; 是一个 Windows 下的版本控制系统 Apache™ Subversion 的客户端工具。 如果你希望你的 Subversion 版本库对于别人可用&#xff0c;你可以在你的站点包含一个链接。 为…

使用抽象类还是接口(Java)

“要针对接口编程&#xff0c;不要针对实现编程。”那么&#xff0c;在java的世界里&#xff0c;这里的接口指的是什么呢&#xff1f;无非是以下两种实现方式&#xff1a; 方式1&#xff09;抽象类&#xff08;只能有一个超类&#xff09; 方式2&#xff09;接口Interface&…

.word的理解

我们在汇编文件中经常会见到.word指令&#xff0c;如下所示&#xff1a; label:.word express label&#xff0c;是一个标签&#xff0c;它是一个链接地址的别名&#xff0c;相当于一个指针。 express&#xff0c;表示链接地址处的内容&#xff0c;相当于指针所指向的内容。…

foreman架构的引入2-安装前环境准备

零基础学习Puppet自动化配置管理系列文档Foreman官网提供了每个版本非常完善的安装步骤&#xff0c;无论是源码安装还是rpm包安装都变得非常方便。而且Foreman通过puppet模块对安装步骤进行了封装并提供了大量的安装参数可以传输&#xff0c;相当的方便。不过由于其体系过大&am…

软件集成策略故事连载----对项目的不利影响竟然这么大

2&#xff0e;对项目的不利影响竟然这么大 项目经理老刘跟晓川说&#xff0c;等这一轮集成做完&#xff0c;一起聊一聊。晓川听了有点紧张。不过想一想&#xff0c;自己已经很努力了&#xff0c;也没有什么可担心的。其实关键是程序员提交的质量。倒正好可以借这个机会跟领导沟…

uboot源码——汇编阶段的start.S文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、总结 1、关于阶段的定义 第一阶段&#xff0c;即在内部SRAM运行的阶段&#xff0c;简单地理解为汇编阶段。此阶段主要涉及start.S文件&#xff0c;在cpu/s5pc11x/目录下。第一阶段以ldr pc _sta…

TCP三次握手及四次挥手详细图解(转)

1.链接&#xff1a;http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html Andrew Huangbluedrum163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.而且对…

rm命令:linux如何反向删除文件

假如某目录下有多个文件&#xff1a;file1&#xff0c;file2……filen。 保留单个文件file1&#xff0c;其他文件删除的方法&#xff1a; # shopt -s extglob # rm -fr !(file1) 保留多个文件如file1和file2&#xff0c;其他文件删除的方法&#xff1a; # shopt -s extglob…

何以解养老之忧

何以解养老之忧 何以解养老之忧 很久没有写读后感了&#xff0c;记得那还是上高中以前做的事情。今天&#xff0c;2013年9月的某日。我读了一篇社论&#xff0c;题目为《如何让民众信任“以房养老”》的文章。 从文章当中得知&#xff0c;2012年底我国60周岁以上老年人口已达1.…

机器学习算法之旅

在理解了我们需要解决的机器学习问题之后&#xff0c;我们可以思考一下我们需要收集什么数据以及我们可以用什么算法。本文我们会过一遍最流行的机器学习算法&#xff0c;大致了解哪些方法可用&#xff0c;很有帮助。 机器学习领域有很多算法&#xff0c;然后每种算法又有很多延…

Android Handler的使用方法

如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人&#xff0c;在不知道Handler的用法之前是怎么样写的程序,代码如下所示: package com.example.androidhandletest; import java.util.Timer;import java.util.TimerTask; import android.os.Bundle;import andro…

转:[C/C++]2014年7月华为校招机试真题(一)

[C/C]2014年7月华为校招机试真题(一)转载于:https://www.cnblogs.com/kira2will/p/4039521.html