从compile.sh开始入手:

 SRC="$(dirname "$(realpath "${BASH_SOURCE}")")"
# fallback for Trusty
[[ -z "${SRC}" ]] && SRC="$(pwd)" # check for whitespace in $SRC and exit for safety reasons
grep -q "[[:space:]]" <<<"${SRC}" && { echo "\"${SRC}\" contains whitespace. Not supported. Aborting." >& ; exit ; } cd $SRC

如上主要是获取源代码的路径,并判断路径是否存在空格合法

在compile.sh

 if [[ -f $SRC/lib/general.sh && -L $SRC/main.sh ]]; then
source $SRC/lib/general.sh
else
echo "Error: missing build directory structure"
echo "Please clone the full repository https://github.com/armbian/build/"
exit -
fi

很明显在这一步里,我们可以进入general.sh看一下实际做了什么?

在lib/general.sh

定义了很多的shell 函数

Cleaning()

根据不同的参数做清除工作

Exit_with_error()

出错时用于显示错误调节的功能,文件,行号,是否高亮,及相关的出错描述

Get_package_list_hash()

打印新构建的文件系统安装包列表,以及文件系统的版本

Create_source_list()

更新apt source.list到新构建的文件系统当中

fetch_from_repo()

用于拉取git 仓库的代码

# fetch_from_repo <url> <directory> <ref> <ref_subdir>

# <url>: remote repository URL

# <directory>: local directory; subdir for branch/tag will be created

# <ref>:

#       branch:name

#       tag:name

#       head(*)

#       commit:hash@depth(**)

#

# *: Implies ref_subdir=no

# **: Not implemented yet

# <ref_subdir>: "yes" to create subdirectory for tag or branch name

#

display_alert()

根据不同的级别显示

fingerprint_image()

将编译信息生成至etc/armbian.txt,其中包含

Title:                  Armbian $REVISION ${BOARD^} $DISTRIBUTION $RELEASE $BRANCH

Kernel:                 Linux $VER

Build date:             $(date +'%d.%m.%Y')

Authors:                https://www.armbian.com/authors

Sources:                https://github.com/armbian/

Support:                https://forum.armbian.com/

Changelog:              https://www.armbian.com/logbook/

Documantation:          https://docs.armbian.com/

addtorepo()

用于创建本地的apt仓库,下载交叉编译工具链,下载etcher_cli工具。可定制自已的镜像打包脚本。

[[ ! -f $SRC/userpatches/customize-image.sh ]] && cp $SRC/config/templates/customize-image.sh.template $SRC/userpatches/customize-image.sh

download_toolchain()

用于下载工具链。

download_etcher_cli()

用于下载etcher_cli,该命令工具的功能相当于dd命令与校验功能的合体。

接来再次回到compile.sh脚本当中

 # copy default config from the template
[[ ! -f $SRC/config-default.conf ]] && cp $SRC/config/templates/config-example.conf $SRC/config-default.conf # source build configuration file
if [[ -n $ && -f $SRC/config-$.conf ]]; then
display_alert "Using config file" "config-$1.conf" "info"
source $SRC/config-$.conf
else
display_alert "Using config file" "config-default.conf" "info"
source $SRC/config-default.conf
fi

在默认的config-default.conf内容如下所示:

KERNEL_ONLY=""                          # leave empty to select each time, set to "yes" or "no" to skip dialog prompt
KERNEL_CONFIGURE="" # leave empty to select each time, set to "yes" or "no" to skip dialog prompt
CLEAN_LEVEL="make,debs,oldcache" # comma-separated list of clean targets: "make" = make clean for selected kernel and u-boot,
# "debs" = delete packages in "./output/debs" for current branch and family,
# "alldebs" = delete all packages in "./output/debs", "images" = delete "./output/images",
# "cache" = delete "./output/cache", "sources" = delete "./sources"
# "oldcache" = remove old cached rootfs except for the newest files DEST_LANG="en_US.UTF-8" # sl_SI.UTF-, en_US.UTF- # advanced
KERNEL_KEEP_CONFIG="no" # do not overwrite kernel config before compilation
EXTERNAL="yes" # build and install extra applications and drivers
EXTERNAL_NEW="prebuilt" # compile and install or install prebuilt additional packages
CREATE_PATCHES="no" # wait that you make changes to uboot and kernel source and creates patches
BUILD_ALL="no" # cycle through available boards and make images or kernel/u-boot packages.
# set KERNEL_ONLY to "yes" or "no" to build all packages/all images BSPFREEZE="" # freeze armbian packages (u-boot, kernel, dtb)
INSTALL_HEADERS="" # install kernel headers package
LIB_TAG="master" # change to "branchname" to use any branch currently available.
CARD_DEVICE="" # device name /dev/sdx of your SD card to burn directly to the card when done PROGRESS_LOG_TO_FILE="yes"
BUILD_KSRC="no"

在compile.sh当中允许传递 key=value, 比如./compile.sh  test_cmd=test_value

 # Script parameters handling
for i in "$@"; do
if [[ $i == *=* ]]; then
parameter=${i%%=*}
value=${i##*=}
display_alert "Command line: setting $parameter to" "${value:-(empty)}" "info"
eval $parameter=$value
fi
done

接下来我们继续看compile.sh

 if [[ $BUILD_ALL == yes || $BUILD_ALL == demo ]]; then
source $SRC/lib/build-all.sh
else
source $SRC/lib/main.sh
fi

由于默认的BUILD_ALL = “no” , 所以接下来会去执行$SRC/lib/main.sh.脚本。

总结一下compile.sh的功能:

1)    获取shell脚本相关的钩子函数,在lib/generate.sh当中

2)    获取并解析默认的参数。

3)    最后的主要功能还是在/lib/main.sh脚本当中,接下来我们会来解析main.sh脚本的功能。

 

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

  1. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  2. 框架-springmvc源码分析(二)

    框架-springmvc源码分析(二) 参考: http://www.cnblogs.com/leftthen/p/5207787.html http://www.cnblogs.com/leftth ...

  3. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  4. 十、Spring之BeanFactory源码分析(二)

    Spring之BeanFactory源码分析(二) 前言 在前面我们简单的分析了BeanFactory的结构,ListableBeanFactory,HierarchicalBeanFactory,A ...

  5. Vue源码分析(二) : Vue实例挂载

    Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...

  6. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  7. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  8. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  9. ABP源码分析二十一:Feature

    Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样. ABP中Feature具有以下属性: 其中最重要的属性是name, ...

  10. ABP源码分析二十二:Navigation

    MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...

随机推荐

  1. ubuntu18上传代码到github

    其实在github上建仓库时候就提示你步骤了: 1.注册个github账号并登录 创建一个仓库 https://github.com/ 2.创建SSH Key ssh-keygen -t rsa -C ...

  2. 高深的dp POJ 2229Sumsets

    对于这个问题, 我们显然可以看出来, 当他是奇数的时候, 直接等于他的前一个偶数 dp [ i ] = dp [ i - 1] ; 那么问题, 当它是偶数的时候, 我们应该怎么进行 dp 记忆化搜索并 ...

  3. Closest Common Ancestors (Lca,tarjan)

    午时刷题,难甚,遂小憩于桌上,惊醒,于梦中有所得,虽大声曰:吾已得tarjan之奥秘! 关于tarjan算法,其实就是一个递归加并查集的应用. 大致代码: #include<bits/stdc+ ...

  4. vue的基本语法

    在学习vue之前,我们应了解一下什么是vue.js? 什么是Vue.js? Vue.js是目前最后一个前端框架,React是最流行的一个前端框架(react除了开发网站,还可以开发手机App,Vue语 ...

  5. 适合新手的160个creakme(三)

    先跑一下,这个程序应该是有定时器,多久之后自动开启,测试一下输入,序列号以字母方式输入会出现类型不匹配,之后程序自动退出 但是如果以数字方式输入序列号,则会出现,Try Again,所以这里序列号应该 ...

  6. zookeeper集群搭建与升级

    zookeeper 1.zookeeper功能 1-1.配置管理 集中管理配置文件实现服务治理 1-2.命名服务 如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个 ...

  7. 将数组转化为List集合

    字符串转换为数组.将数组转换为List集合 public void testStringToList(){ String s="123-abc-456"; System.out.p ...

  8. hdu 2609 字符串最小表示法 虽然不是很懂 还是先贴上来吧。/,。/

    还需要再消化一下这个算法.. 今天没有时间了,, 六级过了 就有大把时间 快活啊!#include<iostream> #include<cstdio> #include< ...

  9. Winform界面GridView中XCDataGridViewCheckBoxAllColumn改变触发事件

    1.首先利用CurrentCellDirtyStateChanged事件 监测状态改变后判断是否有未提交的更改,若有则提交 private void CurrentCellDirtyStateChan ...

  10. JDK + Tomcat 安装 + 制作自定义镜像【第 3 篇 系统镜像】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...