u-boot 之配置分析 (2)

makefile简要分析
所有这些目录的编译连接都是由顶层目录的makefile来确定的。

1.在makefile中有:


unconfig:
 @rm -f $(obj)include/config.h $(obj)include/config.mk \
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

%是个通配符,make xxx_config都是这个目标.目标的依赖是unconfig,

unconfig的命令是删除一些文件,而这些文正是从make xxx_config过程中产生的.unconfig就是清理配置的.

MKCONFIG := $(SRCTREE)/mkconfig

100ask24x0_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0         

等同为   ./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

[email protected]就是指目标

$(@:_config=)是变量的替换引用

格式为“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。

2.下面就是执行mkconfig脚本了

mkconfig文件:

./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

        $1    $2   $3   $4    $5  $6

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE  := $(CURDIR)            
CURDIR是Makefile中的一个特殊参数,表示当前目录。所以,此句含义是决定使用BUILD_DIR还是CURDIR.

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"        #BOARD_NAME=100ask24x0    
$n 在linux脚本下为传入的参数第n个

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1                    #目标参数小于4大于6退出

$# 参数的个数         -lt 小于  -gt 大于

echo "Configuring for ${BOARD_NAME} board..."
echo 打印

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
如果定义 BUILD_DIR 等于 BUILD_DIR 否者为CURDIR

cd ./include
 rm -f asm
 ln -s asm-$2 asm                      #ln -s asm-arm asm

删除原有asm建立一个链接文件 asm指向 asm-arm

rm -f asm-$2/arch                       # rm -f asm-arm/arch
 
 if [ -z "$6" -o "$6" = "NULL" ] ;

如果$6为空或者等于null 
 ln -s ${LNPREFIX}arch-$6 asm-$2/arch           # ln -s arch-s3c24x0  asm-100ask24x0/arch

删除原有arch建立一个链接文件 arch指向 arch-s3c24x0

rm -f asm-$2/proc                     # rm -f asm-arm/proc
 ln -s ${LNPREFIX}proc-armv asm-$2/proc           # ln -s proc-armv asm-arm/proc

删除原有proc建立一个链接文件 proc指向 proc-armv

#

# Create include file for Make

#

echo "ARCH   = $2" >  config.mk

echo "CPU    = $3" >> config.mk

echo "BOARD  = $4" >> config.mk      

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

创建顶层Makefile包含的文件include/ config.mk

#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
 echo >> config.h
else
 > config.h        # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

创建开发板有关的头文件include/config.h    

内容为/* Automatically generated - do not edit */

#include <configs/100ask24x0.h>

现在总结回顾一下,配置命令 make smdk2410_config;实际执行 “./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0”命令

假设执行“./mkconfig $1    $2   $3   $4    $5  $6 ”命令。则产生如下结果。

(1) 开发板名称BOARD_NAME等于$1.

(2)创建到平台、开发板相关文件的链接,如如下所示;

    ln -s asm-$2 asm

    ln -s ${LNPREFIX}arch-$6 asm-$2/arch

    ln -s ${LNPREFIX}proc-armv asm-$2/proc

(3)创建顶层Makefile包含的文件include/config.mk,如下所示:

    ARCH   = arm

    CPU    =arm920t

    BOARD  = 100ask24x0

    SOC    = s3c24x0

(4)创建开发板相关头文件include /config.h,如下所示:

    /* Automatically generated - do not edit */

    #include <configs/100ask24x0.h>

顶层makefile先调用各子目录的makefile,生成目标文件或者目标文件库。
然后再连接所有目标文件(库)生成最终的u-boot.bin。
连接的主要目标(库)如下:
OBJS  = cpu/$(CPU)/start.o 
LIBS  = lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a /
 fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
显然跟平台相关的主要是:
cpu/$(CPU)/start.o 
board/$(BOARDDIR)/lib$(BOARD).a 
cpu/$(CPU)/lib$(CPU).a
cpu/$(CPU)/$(SOC)/lib$(SOC).a 
lib_$(ARCH)/lib$(ARCH).a
这里面的四个变量定义在include/config.mk(见上述)。
其余的均与平台无关。
所以考虑移植的时候也主要考虑这几个目标文件(库)对应的目录。

时间: 2024-11-05 18:58:34

u-boot 之配置分析 (2)的相关文章

nova boot代码流程分析(五):VM启动从neutron-dhcp-agent获取IP与MAC

1.   network和subnet创建代码流程 [[email protected] ~(keystone_user1)]# neutron net-create demo-net [[email protected] ~(keystone_user1)]# neutron subnet-create  demo-net 1.1.1.0/24 --name demo-subnet --gateway 1.1.1.1 --enable_dhcp true 这里,我们主要分析上面两个命令的代码流

Spring Boot自动配置原理(转)

第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot-autoconfigure工程根目录下.执行 $ tree | grep -c .java$ 模块 java文件数 spring-boot 551 spring-boot-actuator 423 spring-boot-autoconfigure 783 spring-boot-devtools

4、Spring Boot 自动配置原理

1.4 Spring Boot 自动配置原理 简介 spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器.视图解析器.模板引擎 那个这个是怎么实现的呢?原因就在于它利用了Spring的

Springboot 系列(三)Spring Boot 自动配置

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring Boot 官方网站已经提供了完整了配置示例和解释. 可以这么说,Spring Boot 的一大精髓就是自动配置,为开发省去了大量的配置时间,可以更快的融入业务逻辑的开发,那么自动配置是怎么实现的呢? 1. @SpringBootApplication 跟着 Spring Boot 的启动类的注解

Spring Boot 自动配置之@Conditional的使用

Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_boot_auto_configure/ Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准化的应用.Spring Boot的特点可以概述为如下几点: 内置了嵌入式的Tomcat.Jett

【Spring Boot源码分析】@EnableAutoConfiguration注解(一)@AutoConfigurationImportSelector注解的处理

Java及Spring Boot新手,首次尝试源码分析,欢迎指正! 一.概述 @EnableAutoConfiguration注解是Spring Boot中配置自动装载的总开关.本文将从@EnableAutoConfiguration入手,尝试通过源码分析增强对Spring Boot的理解. 所用版本:Spring Boot 2.2.0.M5 + Spring Framework 5.2.0.RC1 1. 功能的实现:(Spring Boot部分) boot.autoconfigure.Enab

玩转spring boot——properties配置

前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连接,若有一处配错或遗漏,就会带来不可挽回的损失.正因为这样,spring boot给出了非常理想的解决方案——application.properties.见application-properties的官方文档:http://docs.spring.io/spring-boot/docs/curr

Spring Boot 属性配置和使用

spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring Boot 静态资源处理 Spring Boot - 配置排序依赖技巧 Spring Boot - DevTools 介绍 Spring Boot 支持多种外部配置方式 这些方式优先级如下: 命令行参数 来

Spring Boot 属性配置和使用(转)

Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot 入门 请看:http://blog.csdn.net/isea533/article/details/50278205 Spring Boot 支持多种外部配置方式 这些方式优先级如下: 命令行参数 来自java:comp/env的JNDI属性 Java系统属性(System.getPropert

Spring Boot 揭秘与实战 附录 - Spring Boot 公共配置

Spring Boot 公共配置,配置 application.properties/application.yml 文件中. 摘自:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html # =================================================================== # COMMON SPRING