让我们先来回顾一下编译命令
$ cd workdir/lichee
$ ./build.sh -p sun4i_crane -k 3.0 

lichee文件夹下的build.sh

#!/bin/bash
set -e
buildroot/scripts/common.sh $@


build.sh的内容就是这么简单。有效内容就2行。先看第一行 set -e
set命令的-e參数。linux自带的说明例如以下:
"Exit immediately if a simple command exits with a non-zero status."

也就是说。在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会马上退出。

1.  运行buildroot文件夹下的build.sh
在buildroot/scripts/common.sh中,因为我们没有带MODULE參数,就表示并非仅仅编译单个模块。而是buildroot linux3.0 u-boot这3个会被一次性都编译

buildroot/scripts/common.sh中的编译buildroot的关键内容例如以下:

BR_DIR = buildroot
PLATFORM = sun4i_crane
cd ${BR_DIR} && ./build.sh -p ${PLATFORM}

buildroot/build.sh的核心内容是

if [ -x ./scripts/build_${PLATFORM}.sh ]; then
./scripts/build_${PLATFORM}.sh $MODULE
else
……
fi
实际上就是运行
./buildroot/scripts/build_sun4i_crane.sh
有效代码例如以下

export PATH=${CUR_DIR}/output/external-toolchain/bin:$PATH

if [ ! -e output/external-toolchain ];then
cd output
tar -jxf ../dl/arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
mv arm-2010.09 external-toolchain
fi

到这里就非常明显了,buildroot的前期工作就是依据 ${PLATFORM}的值来使用交叉编译工具链 而arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 就是Android的交叉编译工具链
至此在SUN4I平台下的Android版本号的builtroot的工作就完毕了

2. 编译内核
buildroot/scripts/common.sh中的编译linux-3.0的关键内容例如以下:


export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH
cd ${KERN_DIR} && ./build.sh -p ${PLATFORM} -v ${VENDOR}
接下来就是将buildroot解压好的Android toolchain设置到PATH中。紧接着就是运行linux3.0中的build.sh脚本了

./.linux-3.0/build.sh

.........

if [ -x ./scripts/build_${PLATFORM}.sh ]; then
./scripts/build_${PLATFORM}.sh $MODULE
else
printf "\nERROR: Invalid Platform\n"
show_help
exit 1
fi .........

相同地,linux-3.0/build.sh的重点也是运行linux/script/build_sun4i_crane.sh,我们找到了这个脚本文件

./linux/script/build_sun4i_crane.sh

经过简单分析,我们发现,编译内核最重要的2个shell函数就是build_kernel() build_modules(),通过我们对《Lichee(一)­­—— lichee文件夹结构介绍和编译命令》一文的分析,内核编译主要是对标准内核 已经 提供给制造商的module模块来一直编译

小贴士:
    这里来谈谈modules模块的意义。把SUN4I平台很常见的驱动或者自己比較独特的驱动列入单独的modules以下来。能够大大减少耦合性。甚至不用改动原有内核的配置或代码,就能够完毕一款新产品的移植


因为比較关键,接下来通篇分析build_kernel()这个函数
build_kernel()
{
#假设没有配置过kernel 就运行cp arch/arm/configs/sun4i_crane_defconfig .config,就使用预设的配置
if [ ! -e .config ]; then
echo -e "\n\t\tUsing default config... ...!\n"
cp arch/arm/configs/sun4i_crane_defconfig .config
fi #编译standby模块
build_standby
#指定buildroot的工具链来make uImage
make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -j8 uImage modules update_kern_ver if [ -d output ]; then
rm -rf output
fi
mkdir -p $LICHEE_MOD_DIR #通过 buildroot/output/external-toolchain/bin/arm-none-linux-gnueabi-objcopy 命令生成 bImage文件
${OBJCOPY} -R .note.gnu.build-id -S -O binary vmlinux output/bImage
cp -vf arch/arm/boot/[zu]Image output/
cp .config output/ #拷贝重要文件夹下的模块文件*.ko 到 ${LICHEE_MOD_DIR} lichee/modules文件夹
for file in $(find drivers sound crypto block fs security net -name "*.ko"); do
cp $file ${LICHEE_MOD_DIR}
done
cp -f Module.symvers ${LICHEE_MOD_DIR}
#cp -f modules.* ${LICHEE_MOD_DIR} #copy bcm4330 firmware and nvram.txt
cp drivers/net/wireless/bcm4330/firmware/bcm4330.bin ${LICHEE_MOD_DIR}
cp drivers/net/wireless/bcm4330/firmware/bcm4330.hcd ${LICHEE_MOD_DIR}
cp drivers/net/wireless/bcm4330/firmware/nvram.txt ${LICHEE_MOD_DIR}/bcm4330_nvram.txt
cp drivers/net/wireless/bcm4330/firmware/mw269v3_fw.bin ${LICHEE_MOD_DIR}
cp drivers/net/wireless/bcm4330/firmware/mw269v3_nvram.txt ${LICHEE_MOD_DIR}
cp drivers/net/wireless/rtxx7x/RT2870STA.dat ${LICHEE_MOD_DIR}
cp drivers/net/wireless/rtxx7x/RT2870STACard.dat ${LICHEE_MOD_DIR}
}


而build_modules()函数就是将modules文件夹下的各个模块,假设是源代码就通过make -C的方式编译并拷贝。假设是.ko文件就直接拷贝

3. 编译uboot
buildroot/scripts/common.sh中的编译u-boot的关键内容例如以下:


echo "build uboot for ${PLATFORM}"
cd ${U_BOOT_DIR} && ./build.sh -p sun4i -v ${VENDOR}

相对于kernel而言。uboot文件夹下的build.sh就简单多了

if [ "$PLATFORM" = "sun4i_crane" ]; then
 make distclean && make -j4 sun4i CROSS_COMPILE=arm-none-linux-gnueabi-
else
make distclean && make -j4 $PLATFORM CROSS_COMPILE=arm-none-linux-gnueabi-
fi

不过简单的clean后,再又一次编译罢了

至此看起来复杂的lichee,通过一条主脉络走下来。我们就很清晰了,我们也大致了解了lichee这个项目的主要构成,作为一个合格的BSPproject师,实现编译打包的自己主动化是一个起码要求,这也能够给我们今后的编译打包设计提供一个參考。






版权声明:本文博客原创文章,博客,未经同意,不得转载。

Lichee(两) 在sun4i_crane该平台下编译的更多相关文章

  1. WebKit 在 Windows 平台下编译小结

    虽然WebKit 已经越来越多的被广大程序员接受,但其编译过程却非常之痛苦.下面将我编译WebKit 代码的经验与大家分享. 1) 获取WebKit 源代码 WebKit 源代码是使用Subversi ...

  2. xsocks 64位平台下编译问题小记

    1.src/common/public.h uint32_t lpParameter 改为 void* lpParameter; 2.SocksMgr.cpp DWORD WINAPI CSocksM ...

  3. 实用图像处理入门 - 2 - Windows平台下编译openCV

    标签中的部分 font-family: 华文细黑; font-size: 26px; font-weight: bold; color: #611427; margin-top:40px; } h2 ...

  4. 在MAC平台下编译Ngnix ,由于MD5算法不能编译通过 解决办法

    近期想学习Ngnix 代码,前些日子,对”自己下手狠一次“, 买了MAC 本. 所以想在Mac 上编译,是必须的,不然对不起自己的内心. 不巧遇到了MD5算法编译的问题 src/core/ngx_cr ...

  5. Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)

    参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Lin ...

  6. Windows下编译objective-C

    Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode   目录 ...

  7. DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验

    DevEco Device Tool迎来了2.1 Beta1,其中的亮点之一是:支持Hi3861开发板的源码在Windows平台编译.带着浓厚的兴趣,第一时间做了一次体验. 首先在官网下载" ...

  8. 009全志R16平台tinav3.0下编译不过的问题

    009全志R16平台tinav3.0下编译不过的问题 2018/11/13 11:39 版本:V1.0 开发板:SC3817R SDK:tina v3.0 1.01原始编译全志r16平台tinav3. ...

  9. windows平台下安装、编译、使用mongodb C++ driver

    本博客将记录在Win8.1 ,VS2013环境下编译.配置mongodb C++ driver的流程. 1.下载预备 下载Boost:http://sourceforge.net/projects/b ...

随机推荐

  1. Windows 8 动手实验系列教程 实验5:进程生命周期管理

    动手实验 实验5:进程生命周期管理 2012年9月 简介 进程生命周期管理对构建Windows应用商店应用的开发者来说是需要理解的最重要的概念之一.不同于传统的Windows应用(它们即使在后台仍然继 ...

  2. 【android】下载文件至本应用程序的file文件夹或者sdcard

     一.推断是否有sdcard卡 //推断是否有SD卡 //ture:有SD卡 //false:没有SD卡 public boolean avaiableMedia(){ String status ...

  3. 微信公众平台应用开发框架sophia设计不足(1)

    设计一个小框架考虑的东西真不少,每一样都不easy: 1.既要解决当前技术的不足: 2.又要方便他人使用(基本的目的). 3.同一时候又要设计得优雅.easy扩展. sophia一開始设计用来支持智能 ...

  4. 在toolbar里动态创建多个button(ext.net)

    private void setOneMenu() { string sql = "select id,name,gids from Config where name<>'高级 ...

  5. 状态压缩动态规划 -- 棋盘问题 POJ 1321

    一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...

  6. SystemParametersInfo API学习(128个中文参数解释,215个实际值)

    uiAction:该参数指定要查询或设置的系统级参数.其取值如下:SPI_GETACCESSTIMEOUT:检索与可访问特性相关联的超时段的信息,PvParam参数必须指向某个ACCESSTIMEOU ...

  7. 如何获取ul 中li选中的值点击button按钮跳转链接

    <ul id="parent"> <li></li> <li></li> <li></li> & ...

  8. AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图

    原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...

  9. 24位和8位BMP图片保存纯C代码

    BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片.非常方便使用. 具体BMP结构可以参考:wingdi.h头文件.今天主要在进行删减代码,需要把多余的代码删除, ...

  10. 图像编程学习笔记2——bmp位图平移

    以下文字内容copy于<<数字图像处理编程入门>>,code为自己实现,是win32控制台程序. 2.1 平移 平移(translation)变换大概是几何变换中最简单的一种了 ...