让我们先来回顾一下编译命令
$ 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. display:table 水平居中

    <div style="width:auto; margin:auto;display:table"> <div style="width: 100px ...

  2. Skype无法显示登录界面

    Skype升级之后突然抽风,双击运行程序之后,输入用户名和密码的窗口都没了,截图如下(本机为Windows 7 32bit版本): 卸载重新安装,也无济于事.删除注册表中的Skype的相关信息后问题依 ...

  3. Ruby on Rails 實戰聖經阅读(二)

    1.操作系统 centos5.4 2.安装ruby yum install ruby 会安装得到 1.8.5 如果你公司用的是1.8.X就无所谓了, 拿这个学习就行了 如果你们公司用的是1.9.X,那 ...

  4. poj1189 简单dp

    http://poj.org/problem?id=1189 Description 有一个三角形木板,竖直立放.上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1).每颗钉子和周 ...

  5. jbpm部署流程定义到MySql报乱码解决方案

    问题起因: 我在使用ant将流程定义和流程相关资源部署到JBPM数据库中的时候,报了下面一个错误. 错误提示,大概是: 11:33:40,781 ERROR JDBCExceptionReporter ...

  6. 介绍SAP预留函数创建搜索帮助

    紧接上一节介绍的SAP预定义的出口函数F4IF_SHLP_EXIT_EXAMPLE创建搜索帮助, 该函数主要有两个部分: Changing接口的参数属性如下: SHLP:搜索帮助的基础描述,包括搜索帮 ...

  7. VC 获取指定文件夹路径的方法小结

    VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...

  8. xcode6 cocos2dx开玩笑git和github学习记录

    1. git Xcode4开始,它一直Git作为一个内置的源代码控制(Source Control)工具,所以对于新项目的用途git要管理非常方便.在新建项目向导.可以直接选择Git作为源控制工具.项 ...

  9. EditTex属性

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tool ...

  10. 单例模式(Singleton)Holder

    public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...