Lichee(两) 在sun4i_crane该平台下编译

让我们先来回顾一下编译命令

$ cd workdir/lichee

$ ./build.sh -p sun4i_crane -k 3.0

lichee文件夹下的build.sh


#!/bin/bash
set -e
buildroot/scripts/common.sh [email protected]

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师,实现编译打包的自己主动化是一个起码要求,这也能够给我们今后的编译打包设计提供一个參考。

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

时间: 2024-10-11 17:27:33

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

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

1.src/common/public.h uint32_t lpParameter 改为 void* lpParameter; 2.SocksMgr.cpp DWORD WINAPI CSocksMgr::ForwardProc(void* lpParameter) { // int s = int (lpParameter); ... } 编译不过去.因为在 64位平台下,void*向 int转换会丢失精度. DWORD WINAPI CSocksMgr::ForwardProc(void*

Linux下编译Android平台的ffmpeg库

在Linux平台下编译要方便些,我这里使用的环境是openSUSE,用Ubutunu也是一样的. 首先你需要Android-NDK 和ffmpeg源码,不同的版本里的文件结构有所差别,编译环境也有所不同.我这里使用的是以下两个版本: android-ndk-r8-linux-x86.tar.bz2 ffmpeg-0.7.17.tar.gz 1. 解压 android-ndk-r8-linux-x86.tar.bz2 cd ~ tar xvf android-ndk-r8-linux-x86.ta

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

参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Linux重度使用者,受够了MFC之后一直想要找一个框架替换,使用过GTK,wxWidgets,Qt,最后还是Qt用得多一些.我认为程序跨平台应该是一个基本标准,同一份代码不需改动,或者改动极少,放在不同的平台下编译就能使用.不同平台,同样的界面,同样的操作,同样的体验.这里要讲的是我如何在Linux 下开发跨

ubuntu下编译交叉编译工具链

交叉编译工具链在arm开发中出很重要的位置,开发之前肯定要先有编译器 连接器 汇编器等基础的编译工具.arm体系是一个很复杂的体系,里面的指令有数个版本不同的体系level还有很多自己的特点 ,这就要求编译器也要出几个版本的针对不同的应用. 当然网络上存在很多的编译器的资源,但是作为一个嵌入式开发人员还是要会自己构建出来一个工具链的,做到只能说不想做,不能说做不到,不然真的遇到特殊应用的需要无法作出编译器项目就直接挂了. 整个工具链的编译过程如果采用纯手工的step by step  真的需要几

Lichee(二) 在sun4i_crane平台下的编译

让我们先来回顾一下编译命令 $ cd workdir/lichee $ ./build.sh -p sun4i_crane -k 3.0 lichee目录下的build.sh #!/bin/bash set -e buildroot/scripts/common.sh [email protected] build.sh的内容就是这么简单,有效内容就2行,先看第一行 set -e set命令的-e参数,linux自带的说明如下: "Exit immediately if a simple com

将libvex移植到Visual Studio编译平台下的经验总结

1. 两难 将libvex从Linux移植到Windows,移植工作聚集于Cross-Compiler,而不是预料的Cross-Platform. VC++ Compiler到目前为止只支持C89标准,而这个标准规定,变量必须在代码块(即通过大括号包围起来的代码块)的最前面声明,参考 http://stackoverflow.com/questions/13308944/how-to-simulate-c99-in-visual-studio-for-variables-declaration

cmd下编译和运行两个相关类的异常问题

总结网上关于cmd下编译和运行相关的两个类时的异常和错误 // 文件A.java[D:\项目名\com\maple] package com.maple; class A{ public static void main(String[] args){ B b=new B(); } } // 文件B.java[D:\项目名\com\maple] package com.maple; class B{ } 如果cmd下编译这两个文件:(先用cd到当前目录[D:\项目名\com\maple]) >j

OpenCV在Windows平台下的源码编译

OpenCV库官方网站为http://opencv.org/. 在该网站可以下载最新的OpenCV for Windows,例如当前我下载的是opencv-2.4.9.exe ,双击该文件解压到某个目录下,解压后的根目录为opencv,opencv目录下有2个子目录,分别为build和sources,build目录中存放的是已经编译好的库,而sources目录中存放的是源代码.下面我们会在sources目录中编译源代码. 在sources目录中可以看到有个CMakeLists.txt文件,这个文

linux 6下编译安装配置LAMP平台

LAMP(Linux- Apache-MySQL-PHP)网站架构是目前国际流行的Web框架,该框架包括:Linux操作系统,Apache网络服务器,MySQL数据库,Perl.PHP或者Python编程语言,所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和Java/J2EE架构相比,LAMP具有Web资源丰富.轻量.快速开发等特点,微软的.NET架构相比,LAMP具有通用.跨平台.高性能.低价格的优势,因此LAMP无论是性能.质量还是价格都是企业搭建网站