01.今天刚刚拿到A31的源代码,拿到手之后首先研究下怎么编译,之前么有接触过全志的芯片, 02.所以要先看看这个编译系统,都是出自android源代码的编译系统,这个编译过程都是差不多的,但是每个厂商都有所改动。 03.首先看看这个全志源代码的目录 04.有两个文件一个是android的压缩文件,另一个是lichee压缩文件(从目录文件可以看出android应该是文件系统的东西,lichee应该是uboot和kernel) 05.先解压lichee文件tar -xvf lichee.tar.gz 06.解压出来之后出现一个文件夹进去 07.cd lichee 08.文件结构 09. 10. 11.先不关心这些里面的文件到底都有些什么,现在只要关心是怎么编译这些文件的 12.按照官方给出的文档里面有关于编译lichee的,就是执行这个build.sh脚本文件 13.来看看这个build.sh有些什么内容 14.#!/bin/bash 15.set -e 16.buildroot/scripts/common.sh $@ 17.这个脚本很简单只有两句话,一个是set -e(就是说在这个set -e后面的所有代码,只要出现了返回值非零,整个脚本就会立即退出) 18.

后面一句就是包含另一个文件夹的脚本common.sh,$@后面再说,再跑到common.sh里面

19.

今天刚刚拿到A31的源代码,拿到手之后首先研究下怎么编译,之前么有接触过全志的芯片,所以要先看看这个编译系统,都是出自android源代码的编译系统,这个编译过程都是差不多的,但是每个厂商都有所改动。首先看看这个全志源代码的目录有两个文件一个是android的压缩文件,另一个是lichee压缩文件(从目录文件可以看出android应该是文件系统的东西,lichee应该是uboot和kernel)先解压lichee文件tar -xvf lichee.tar.gz解压出来之后出现一个文件夹进去cd lichee文件结构先不关心这些里面的文件到底都有些什么,现在只要关心是怎么编译这些文件的按照官方给出的文档里面有关于编译lichee的,就是执行这个build.sh脚本文件来看看这个build.sh有些什么内容#!/bin/bashset -ebuildroot/scripts/common.sh $@这个脚本很简单只有两句话,一个是set -e(就是说在这个set -e后面的所有代码,只要出现了返回值非零,整个脚本就会立即退出)后面一句就是包含另一个文件夹的脚本common.sh,$@后面再说,再跑到common.sh里面[plain] view plaincopyprint?01. [plain] view plaincopyprint?01.#!/bin/bash 02.set -e 03. 04.PLATFORM="" 05.MODULE="" 06.CUR_DIR=$PWD 07.OUT_DIR=$CUR_DIR/out 08.KERN_VER=3.3 09.KERN_DIR=$CUR_DIR/linux-${KERN_VER} 10.KERN_OUT_DIR=$KERN_DIR/output 11.BR_DIR=$CUR_DIR/buildroot 12.BR_OUT_DIR=$BR_DIR/output 13.U_BOOT_DIR=$CUR_DIR/u-boot 14.KERN_VER_RELEASE=3.3.0 15.//这里定义了些变量 16. 17. 18.//帮助文件,就是在lichee文件下面执行./build.sh -h的时候会出现的提示内容 19.-h显示帮助信息 20.-p选择你所需要开发的平台 21.-k内核 22.-m所在的模块(比如kernel,uboot之类的)后面的脚本内容会用到这个参数 23.再下面就是几个例子 24.show_help() 25.{ 26.printf " 27.NAME 28. build - The top level build script for Lichee Linux BSP 29. 30.SYNOPSIS 31. build [-h] | [-p platform] [-k kern_version] [-m module] | pack 32. 33.OPTIONS 34. -h Display help message 35. -p [platform] platform, e.g. sun6i, sun6i_dragonboard, sun6i_fiber sun6i_fiber_a31s 36. sun6i: full linux bsp 37. sun6i_dragonboard: board test packages 38. sun6i_fiber: android kernel 39. sun6i_fiber_a31s: android kernel for a31s platform 40. sun6i_fiber_a31s512m: android kernel for a31s platform(512M DDR) 41. 42. -k [kern_ver] 3.3(default) [OPTIONAL] 43. 44. -m [module] Use this option when you dont want to build all. [OPTIONAL] 45. e.g. kernel, buildroot, uboot, all(default)... 46. pack To start pack program 47. 48.Examples: 49. ./build.sh -p sun6i 50. ./build.sh -p sun6i_dragonboard 51. ./build.sh -p sun6i_fiber 52. ./build.sh -p sun6i_fiber_a31s 53. ./build.sh -p sun6i_fiber_a31s512m 54. ./build.sh pack 55. 56." 57. 58.} 59. 60.下面的脚本内容都是些函数(这里就不说了,等用到的时候自己去看看) 61.现在来看看最后的部分 62. 63.//这个$1就是执行./build.sh 后面所带的参数,比如在lichee下面有一个READEME文件 64.Examples: 65.1.Build linux-3.3 image for EVB 66. $cd lichee 67. $./build.sh -p sun6i 68. $./build.sh pack 69. 70.2.Build linux kernel android 71. $./build.sh -p sun6i_fiber 72. 73.3.Build linux test package 74. $./build.sh -p sun6i_dragonboard 75. 76. 77.//这里的$1就是上面实例中./build.sh 所带的参数 78.//如果$1 == pack 79.if [ "$1" = "pack" ]; then 80. echo "generate rootfs now, it will takes several minutes and log in out/" 81. if [ ! -d "${OUT_DIR}" ]; then 82. mkdir -pv ${OUT_DIR} 83. fi 84. regen_rootfs > out/gen_rootfs_log.txt 2>&1 85. gen_output_sun6i >> out/gen_rootfs_log.txt 2>&1 86. echo "generate rootfs has finished!" 87. ${BR_DIR}/scripts/build_pack.sh 88. exit 0 89.//如果$1 == pack_dragonboard 90.elif [ "$1" = "pack_dragonboard" ]; then 91. regen_dragonboard_rootfs 92. gen_output_sun6i_dragonboard 93. ${BR_DIR}/scripts/build_pack.sh 94. exit 0 95.//如果$1 == pack_prvt 96.elif [ "$1" = "pack_prvt" ]; then 97. ${BR_DIR}/scripts/build_prvt.sh 98. exit 0 99.fi 100. 101.//怎么知道这个OPTION是什么意思呢,你可以在lichee下面执行./build.sh -h可以看到一个OPTION的参数 102.//也可以找到common.sh里面有一个show_help()的方法 103.//以./build.sh -p sun6i_fiber这个为例子 104.//所以可以知道 PLATFORM == sun6i_fiber 105. 106.while getopts hp:m:k: OPTION 107.do 108. case $OPTION in 109. h) show_help 110. exit 0 111. ;; 112. p) PLATFORM=$OPTARG 113. ;; 114. m) MODULE=$OPTARG 115. ;; 116. k) KERN_VER=$OPTARG 117. update_kdir $KERN_VER 118. ;; 119. *) show_help 120. exit 1 121. ;; 122.esac 123.done 124. 125.// 执行上面之后这个PLATFORM就不为空了 126.//在这里也说下这个shell的判断语言的参数是什么意思 127. 128.-e filename 如果 filename存在,则为真 129.-d filename 如果 filename为目录,则为真 130.-f filename 如果 filename为常规文件,则为真 131.-L filename 如果 filename为符号链接,则为真 132.-r filename 如果 filename可读,则为真 133.-w filename 如果 filename可写,则为真 134.-x filename 如果 filename可执行,则为真 135.-s filename 如果文件长度不为0,则为真 136.-h filename 如果文件是软链接,则为真 137.filename1 -nt filename2 如果 filename1比 filename2新,则为真。 138.filename1 -ot filename2 如果 filename1比 filename2旧,则为真。 139.-eq 等于 140.-ne 不等于 141.-gt 大于 142.-ge 大于等于 143.-lt 小于 144.-le 小于等于 145.至于!号那就是取非 146. 147.if [ -z "$PLATFORM" ]; then 148. show_help 149. exit 1 150.fi 151. 152. 153.if [ -z "$PLATFORM" ]; then 154. show_help 155. exit 1 156.fi 157. 158. 159.//如果MODULE等于buildroot,就是跑到相关目录执行脚本,后面的都是差不多的 160.if [ "$MODULE" = buildroot ]; then 161. cd ${BR_DIR} && ./build.sh -p ${PLATFORM} 162.elif [ "$MODULE" = kernel ]; then 163. export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH 164. cd ${KERN_DIR} && ./build.sh -p ${PLATFORM} 165.elif [ "$MODULE" = "uboot" ]; then 166. case ${PLATFORM} in 167. a12_nuclear*) 168. echo "build uboot for sun5i_a12" 169. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12 170. ;; 171. a12*) 172. echo "build uboot for sun5i_a12" 173. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12 174. ;; 175. a13_nuclear*) 176. echo "build uboot for sun5i_a12" 177. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13 178. ;; 179. a13*) 180. echo "build uboot for sun5i_a13" 181. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13 182. ;; 183. *) 184. echo "build uboot for ${PLATFORM}" 185. cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM} 186. ;; 187. esac 188.else 189.//如果MODULE不等于以上的就执行这里 190. //进入buildroot目录,这个BR_DIR在common.sh最开始的地方有定义,执行脚本. 191. cd ${BR_DIR} && ./build.sh -p ${PLATFORM} 192. 193. 194.//来看看这个buildroot目录下面的脚本build.sh 195.#!/bin/bash 196.set -e 197. 198.PLATFORM="" 199.MODULE="" 200.//显示帮助 201.show_help() 202.{ 203. printf "\nbuild.sh - Top level build scritps\n" 204. echo "Valid Options:" 205. echo " -h Show help message" 206. echo " -p platform:sun6i sun6i_fiber sun6i_fiber_a31s sun6i_fiber_a31s512m or sun6i_dragonboard" 207. printf " -m module\n\n" 208.} 209. 210. 211.//获得到platform,module的值 212.while getopts hp:m: OPTION 213.do 214. case $OPTION in 215. h) show_help 216. ;; 217. p) PLATFORM=$OPTARG 218. ;; 219. m) MODULE=$OPTARG 220. ;; 221. *) show_help 222. ;; 223.esac 224.done 225. 226.//如果platform等于空,则显示帮助并退出 227.if [ -z "$PLATFORM" ]; then 228. show_help 229. exit 1 230.fi 231. 232.//如果module等于空,则MODULE==all 233.if [ -z "$MODULE" ]; then 234. MODULE="all" 235.fi 236. 237.//判断目录下面的文件是否为可执行文件 238.if [ -x ./scripts/build_${PLATFORM}.sh ]; then 239. 执行相关脚本(这个脚本的功能就是解压工具链以及设置环境变量) 240. ./scripts/build_${PLATFORM}.sh $MODULE 241. 242.//如果没有可执行文件就显示错误信息,并显示帮助退出 243.else 244. printf "\nERROR: Invalid Platform\nonly sun6i sun6i_fiber sun6i_fiber_a31s sun6i_fiber_a31s512m or sun6i_dragonboard support\n" 245. show_help 246. exit 1 247.fi 248. 249. 250.再回到common.sh这个脚本继续往下看 251. //设置环境变量 252. export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH 253. //执行该脚本编译内核(根据你选择相关平台来执行相关脚本如果build_sun6i_fiber.sh ) 254. cd ${KERN_DIR} && ./build.sh -p ${PLATFORM} 255. 256.进入lichee/linux-3.3/scripts/build_sun6i_fiber.sh 257.1。设置编译工具链环境变量 258.2. 259. LICHEE_ROOT=`(cd ${LICHEE_KDIR}/..; pwd)` 260. export PATH=${LICHEE_ROOT}/buildroot/output/external-toolchain/bin:${LICHEE_ROOT}/tools/pack/pctools/linux/android:$PATH 261. 262. //这个$1就是lichee/linux-3.3/build.sh所执行的./scripts/build_${PLATFORM}.sh $MODULE 263. //MODULE值== all,所以执行all分支下面的函数build_kernel,build_modules,build_ramfs 264. case "$1" in 265. kernel) 266. build_kernel 267. ;; 268. modules) 269. build_modules 270. ;; 271. clean) 272. clean_kernel 273. clean_modules 274. ;; 275. all) 276. build_kernel 277. build_modules 278. build_ramfs 279. ;; 280. *) 281. show_help 282. ;; 283. esac 284. 285.kernel编译完成之后就是编译uboot了 286. //编译uboot 287. case ${PLATFORM} in 288. a12_nuclear*) 289. echo "build uboot for sun5i_a12" 290. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12 291. ;; 292. a12*) 293. echo "build uboot for sun5i_a12" 294. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12 295. ;; 296. a13_nuclear*) 297. echo "build uboot for sun5i_a12" 298. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13 299. ;; 300. a13*) 301. echo "build uboot for sun5i_a13" 302. cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13 303. ;; 304. sun6i) 305. echo "build uboot for sun6i" 306. cd ${U_BOOT_DIR} && ./build.sh -p sun6i 307. ;; 308. sun6i_fiber) 309. echo "build uboot for sun6i_fiber" 310. cd ${U_BOOT_DIR} && ./build.sh -p sun6i 311. gen_output_${PLATFORM} 312. ;; 313. sun6i_fiber_a31s) 314. echo "build uboot for sun6i_fiber_a31s" 315. cd ${U_BOOT_DIR} && ./build.sh -p sun6i 316. gen_output_${PLATFORM} 317. ;; 318. sun6i_fiber_a31s512m) 319. echo "build uboot for sun6i_fiber_a31s" 320. cd ${U_BOOT_DIR} && ./build.sh -p sun6i 321. gen_output_${PLATFORM} 322. ;; 323. sun6i_dragonboard) 324. echo "build uboot for sun6i_dragonboard" 325. cd ${U_BOOT_DIR} && ./build.sh -p sun6i 326. 327. ;; 328. *) 329. echo "build uboot for ${PLATFORM}" 330. cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM} 331. ;; 332. esac 333. 334. #regen_rootfs 335. 336. #gen_output_${PLATFORM} 337. //最后编译完成会显示如下信息 338. echo -e "\033[0;31;1m###############################\033[0m" 339. echo -e "\033[0;31;1m# compile success #\033[0m" 340. echo -e "\033[0;31;1m###############################\033[0m" 341. fi

全志A31编译脚本 .相关推荐

  1. 全志A31编译环境搭建

    平台:全志A31 内核版本:linux-3.3 gcc版本:arm-linux-gnueabi-gcc 4.6.1 操作系统:Ubantu 2.6.32-38-generic 项目中需要编译A31平台 ...

  2. 全志A33Linux连接脚本,全志A33编译脚本分析

    0x00 环境说明: 分析所使用的SDK为锐尔威视的开发板的资料中的Linux-SDK 0x01 脚本分析: 顶层目录下的build.sh: buildroot/scripts/mkcommon.sh ...

  3. 全志a64linux内核编译,全志A64 lichee编译脚本build.sh分析

    全志A64 lichee编译脚本build.sh分析 发布时间:2018-08-22 15:58, 浏览次数:269 , 标签: lichee build sh lichee目录下的./build.s ...

  4. 全志A64 lichee编译脚本build.sh分析

    lichee目录下的./build.sh脚本: set -e #用于指此脚本里执行的命令返回值非0时,终止当前脚本的执行.buildroot/scripts/mkcommon.sh $@ #接着执行m ...

  5. 全志H3编译Linux-4.14 BSP

    学习笔记-全志H3编译Linux-4.14 BSP 1 安装交叉编译器 访问此处下载地址的toolchain目录,下载交叉编译器arm-cortexa9-linux-gnueabihf-4.9.3.t ...

  6. linux 脚本自动编制工具,全自动工具链编译脚本

    GCC 工具链自动编译脚本 本工具用于自动编译指定的工具链,可以同时生成运行于本机系统 (Build system) 和 Windows 系统(可以修改)的两套工具链 具体编译规则指定于 .confi ...

  7. mk_trustonic.mk编译脚本

    Q1.如何编译64位TA? 编译之前设置以下环境变量 export TARGET_ARCH=arm64 export PLATFORM=ARM_V8A_AARCH64 Q2.如何编译Debug版本TA ...

  8. android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一

    版权信息:本文为本人原创,欢迎转载,但请著明出处,并保留本版权信息. Android NDK编译脚本编写起来还是是比较简单条理的,然而它的语法和传统的linux GNU Make编译脚本的编写似乎有很 ...

  9. 以太坊智能合约 编译脚本

    前提准备工作 创建新的项目文件夹 mkdir contract_workflow mkdir contracts   创建合约文件夹 mkdir scripts       创建脚本文件夹 mkdir ...

  10. FFmpeg示例程序合集-批量编译脚本

    此前做了一系列有关FFmpeg的示例程序,组成了< 最简单的FFmpeg示例程序合集>,其中包含了如下项目: simplest ffmpeg player:                 ...

最新文章

  1. Nature-2012-拟南芥根系微生物组的结构
  2. Google发布新API,支持训练更小、更快的AI模型
  3. javascript:void到底是个什么?
  4. supervisor 守护多个进程_supervisor管理守护进程
  5. catboost进行分类并开启GPU模式
  6. WPF自定义控件 —— 装饰器
  7. android布局属性详解(转)
  8. 主题:Hibernate/Spring/Struts架构使用OpenSessionInView的问题
  9. 面向对象2(待补充)
  10. 世界时区缩写及代表的地区
  11. 什么是消息队列及消息队列原理和应用场景详解
  12. GitHub创建token
  13. ERP Qt实现之路 前言
  14. Apache Doris ODBC mysql外表注意事项
  15. 从零开始学习C语言开发视频教程在线完整版
  16. 卷积神经网络的训练过程
  17. MuMu模拟器连接AndroidStudio脚本
  18. 人活着的三种境界[转帖]
  19. 在线教育平台建立付费会员体系
  20. bzoj3811 玛里苟斯

热门文章

  1. mac桌面与屏膜保护程序卡死完美解决方法
  2. 基于StockRanker的AI量化选股策略
  3. 2006年~2011年记事简要
  4. 当我在荒废时间的时候会有多少人在拼命
  5. C语言结构体的字节对齐原则
  6. PSpice应用B-4
  7. 计算机械效率的简便公式,机械效率公式
  8. matlab shift 详解,MeanShift算法详解以及matlab源码
  9. 2019年1月《语音信号处理》期末考试
  10. 支持断电保护的FAT文件系统