在上一节的分析当中,我们知道是通过对话框来选择到底编译的是哪块板子,基于什么样的配置。

接下来我们来拿一个实例来分析一下具体的案例,我们会选中如下所示的版本

iotx-3                 AM335X 1Gb SoC eMMC
相当于BOARD=iotx-3 BOARD_TYPE=conf
接下来还是回到lib/main.sh当中
 source $SRC/config/boards/${BOARD}.${BOARD_TYPE}
LINUXFAMILY="${BOARDFAMILY}"

169行 相当于获取$SRC/config/boards/iotx-3.conf 当中设置的变量

170行 相当于设置LINUXFAMILY=cloudwsn,这个和iotx-3.conf内部的配置有关

来看一下iotx-3.conf的内容:

# AM335X 1Gb SoC eMMC
BOARD_NAME="IOTX-3"
BOARDFAMILY="cloudwsn"
BOOTCONFIG="am335x_iotx3_config"
MODULES="hci_uart gpio_sunxi rfcomm hidp bonding spi_sun7i"
MODULES_NEXT="bonding"
#
KERNEL_TARGET="default,dev"
CLI_TARGET="stretch,xenial:next"
DESKTOP_TARGET="xenial:default,next"
#
CLI_BETA_TARGET="" uboot_custom_postprocess() {
local tftpdir="/tftpboot" if [ -f MLO -a -e ${tftpdir} ];then
cp MLO ${tftpdir}/cloudwsn-IOTX3-runtime-uboot.MLO
fi if [ -f u-boot.img -a -e ${tftpdir} ];then
cp u-boot.img ${tftpdir}/cloudwsn-IOTX3-runtime-uboot.img
fi
} BOOTENV_FILE="cloudwsn-default.txt"

第一行板子的具体描述,接下来设置了相关的变量,后续我们会看到这些变量使用的地放。

继续回到lib/main.sh当中

 [[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config"

172行 说明KERNEL_TARGET 变量是必须存在于iotx-3.conf 文件当中的,如果新增一块板子该变量是必须存在的,否则会报错。

继续阅读lib/main.sh脚本:

 if [[ -z $BRANCH ]]; then
options=()
[[ $KERNEL_TARGET == *default* ]] && options+=("default" "Vendor provided / legacy (3.4.x - 4.4.x)")
[[ $KERNEL_TARGET == *next* ]] && options+=("next" "Mainline (@kernel.org) (4.x)")
[[ $KERNEL_TARGET == *dev* && $EXPERT = yes ]] && options+=("dev" "\Z1Development version (4.x)\Zn")
# do not display selection dialog if only one kernel branch is available
if [[ "${#options[@]}" == ]]; then
BRANCH="${options[0]}"
else
BRANCH=$(dialog --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \
--menu "Select the target kernel branch\nExact kernel versions depend on selected board" \
$TTY_Y $TTY_X $(($TTY_Y - )) "${options[@]}")
fi
unset options
[[ -z $BRANCH ]] && exit_with_error "No kernel branch selected"
[[ $BRANCH == dev && $SHOW_WARNING == yes ]] && show_developer_warning
else
[[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH"
fi

174-192行, 执行的结果就是设置 BRANCH=default

继续阅读lib/main.sh

194 if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then
195 options=()
196 options+=("jessie" "Debian 8 Jessie")
197 options+=("stretch" "Debian 9 Stretch")
198 options+=("xenial" "Ubuntu Xenial 16.04 LTS")
199 [[ $EXPERT = yes ]] && options+=("bionic" "Ubuntu Bionic 18.04 LTS")
200 RELEASE=$(dialog --stdout --title "Choose a release" --backtitle "$backtitle" --menu "Select the target OS release" \
201 $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}")
202 unset options
203 [[ -z $RELEASE ]] && exit_with_error "No release selected"
204 fi
205
206 if [[ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP ]]; then
207 options=()
208 options+=("no" "Image with console interface (server)")
209 options+=("yes" "Image with desktop environment")
210 BUILD_DESKTOP=$(dialog --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags --menu "Select the target image type" \
211 $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}")
212 unset options
213 [[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected"
214 fi
215

194-204行会弹出如下内容,在这里选择rootfs发行版本,在这里假设我们选择xenial , 即设置RELEASE=xenial,该变量会在后续被使用

 jessie   Debian  Jessie

 stretch  Debian  Stretch

 xenial   Ubuntu Xenial 16.04 LTS 

206-215行 会弹出选择的发行版本,是否带桌面功能的版本,在这里我们选择Image with console interface, 即设置BUILD_DESKTOP=no,该变量会在后续被使用。

Image with console interface (server) 

Image with desktop environment

继续回到/ib/mian.sh当中

 source $SRC/lib/configuration.sh

这里面的内容很多,我们来具体分析一下该脚本到底做了什么事情,对于新增一块板子也是有帮助的。

我们先跳到$SRC/lib/configuration.sh,,分析完了之后,再回到lib/main.sh

整个的configuration.sh,最终的目地就是获取uboot/kernel 的 git repository和branch 及对应的配置以便于后续的编译。

主功的功能有:

设置主机名

HOST=iotx

设置其初始密码

BOOTPWD=1234

设置其文件系统格式

ROOTFS_TYPE=ext4

设置其时区

TZDATA=Asia/Shanghan

设置其版本REVISION

REVISION=5.59

设置如下相关的变量

UBOOT_USE_GCC=> 5.0
KERNEL_USE_GCC=> 5.0
ARCH=armhf

QEMU_BINARY=qemu-arm-static    // 该变量会用于本地挂载arm rootfs当中
ARCHITECTURE=arm
KERNEL_COMPILER=arm-linux-gnueabihf-
UBOOT_COMPILER=arm-linux-gnueabihf-
INITRD_ARCH=arm
BOOTCONFIG_VAR_NAME=BOOTCONFIG_DEFAULT
BOOTCONFIG=am335x_iotx3_config    // uboot configure
LINUXCONFIG=linux-cloudwsn-default  //  kernel configure
BOOTPATCHDIR=u-boot-cloudwsn
KERNELPATCHDIR=cloudwsn-default
DISTRUBUTION=Ubuntu

在其output/debug/output.log  可以找到如下信息

## BUILD CONFIGURATION

Build target:
Board: iotx-
Branch: default
Desktop: Kernel configuration:
Repository: git://git.ti.com/processor-sdk/processor-sdk-linux.git
Branch: branch:processor-sdk-linux-04.03.
Config file: linux-cloudwsn-default U-boot configuration:
Repository: git://git.ti.com/ti-u-boot/ti-u-boot.git
Branch: branch:ti-u-boot-2017.01
Config file: am335x_iotx3_config Partitioning configuration:
Root partition type: ext4
Boot partition type: (none)
User provided boot partition size:
Offset: CPU configuration:
- with interactive
Displaying message: Downloading sources info
Displaying message: Checking git sources u-boot-am335x ti-u-boot-2017.01 info

我们再次总结一下当前变量的值:

BOARD=iotx-3

BRANCH=default

BUILD_DESKTOP=no

KERNELSOURCE=git://git.ti.com/processor-sdk/processor-sdk-linux.git

KERNELBRANCH=branch:processor-sdk-linux-04.03.00

LINUXCONFIG=linux-cloudwsn-default

有了如上变量就可以用来编译kernel,加上KERNEL_COMPILER KERNEL_USE_GCC

如下是uboot相关的变量

BOOTSOURCE=git://git.ti.com/ti-u-boot/ti-u-boot.git
BOOTBRANCH=branch:ti-u-boot-2017.01
BOOTCONFIG=am335x_iotx3_config

ROOTFS_TYPE=ext4
BOOTSIZE=0
OFFSET=4

经过上面的初始化之后,接下来就是要开始编译uboot kernel,及构建rootfs.打包镜像。

我们回到 lib/main.sh  216行,在后续我们继续分析编译脚本。

learning armbian steps(9) ----- armbian 源码分析(四)的更多相关文章

  1. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  2. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

  3. ABP源码分析四十:ZERO的Application和Tenant

    ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...

  4. ABP源码分析四十一:ZERO的Audit,Setting,Background Job

    AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...

  5. ABP源码分析四十二:ZERO的身份认证

    ABP Zero模块通过自定义实现Asp.Net Identity完成身份认证功能, 对Asp.Net Identity做了较大幅度的扩展.同时重写了ABP核心模块中的permission功能,以实现 ...

  6. ABP源码分析四十三:ZERO的本地化

    ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种语言 ...

  7. ABP源码分析四十四:ZERO的配置

    ABP Zero模块中需要配置的地方主要集中在三块:配置静态的role,配置外部认证源,以及配置本地化语言和资源. UserManagementConfig/IUserManagementConfig ...

  8. ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  9. ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  10. ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

随机推荐

  1. Ural 1238 Folding 题解

    目录 Ural 1238 Folding 题解 题意 题解 程序 Ural 1238 Folding 题解 题意 定义折叠.展开为: 单个大写英文字母是一个折叠的串,把它展开后是它本身. 如果\(S\ ...

  2. 剑指offer38:输入一棵二叉树,求该树的深度

    1 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2 思路和方法 深度优先搜索,每次得到左右子树当前最大路径,选择 ...

  3. axios拦截器的介绍

    interceptors 拦截器 拦截器一般做什么? 1. 修改请求头的一些配置项 2. 给请求的过程添加一些请求的图标 3. 给请求添加参数 拦截器的基本语法: 拦截器分为全局拦截器和局部拦截器 全 ...

  4. outlook邮箱备份

  5. Python Socket套接字编程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  6. vue中$router 与 $route区别

    vue-router中经常会操作的两个对象\(route和\)router两个. 1.$route对象 $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息.包含当前的路径,参数,q ...

  7. Win10怎么添加开机启动项?Win10添加开机自动运行软件三种方法

    Win10管理开机启动项的方法相信大家已经非常熟悉,msconfig命令各系统都通用,那么很多用户发觉Win10和Win7 XP等系统不同,没有启动文件夹,那么我们怎么添加开机启动项呢?如晨软件或程序 ...

  8. 关于SpringMVC的几件小事

    一.SpringMVC表单标签He处理静态资源 1.Spring的表单标签 通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. ...

  9. ESP8266 UDP通信

    #include "driver/uart.h" #include "espconn.h" void ICACHE_FLASH_ATTR user_rf_pre ...

  10. 第一章、Django概述

    目录 第一章.Django概述 一.了解软件开发架构 二.HTTP协议 三.响应状态码 四.请求方式 五.基于wsgiref模块 六..动静态网页 七.python三大主流web框架 八.安装Djan ...