全志A31编译脚本

来源:互联网 发布:加里纳利数据 编辑:程序博客网 时间:2024/06/11 22:50
今天刚刚拿到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里面

#!/bin/bashset -ePLATFORM=""MODULE=""CUR_DIR=$PWDOUT_DIR=$CUR_DIR/outKERN_VER=3.3KERN_DIR=$CUR_DIR/linux-${KERN_VER}KERN_OUT_DIR=$KERN_DIR/outputBR_DIR=$CUR_DIR/buildrootBR_OUT_DIR=$BR_DIR/outputU_BOOT_DIR=$CUR_DIR/u-bootKERN_VER_RELEASE=3.3.0//这里定义了些变量//帮助文件,就是在lichee文件下面执行./build.sh -h的时候会出现的提示内容-h显示帮助信息-p选择你所需要开发的平台-k内核-m所在的模块(比如kernel,uboot之类的)后面的脚本内容会用到这个参数再下面就是几个例子show_help(){printf "NAMEbuild - The top level build script for Lichee Linux BSPSYNOPSISbuild [-h] | [-p platform] [-k kern_version] [-m module] | packOPTIONS-h             Display help message-p [platform]  platform, e.g. sun6i, sun6i_dragonboard, sun6i_fiber sun6i_fiber_a31s                   sun6i: full linux bsp                   sun6i_dragonboard: board test packages                   sun6i_fiber: android kernel   sun6i_fiber_a31s: android kernel for a31s platform   sun6i_fiber_a31s512m: android kernel for a31s platform(512M DDR)-k [kern_ver]  3.3(default)                          [OPTIONAL]-m [module]    Use this option when you dont want to build all. [OPTIONAL]                   e.g. kernel, buildroot, uboot, all(default)...pack           To start pack programExamples:./build.sh -p sun6i./build.sh -p sun6i_dragonboard./build.sh -p sun6i_fiber./build.sh -p sun6i_fiber_a31s./build.sh -p sun6i_fiber_a31s512m./build.sh pack"}下面的脚本内容都是些函数(这里就不说了,等用到的时候自己去看看)现在来看看最后的部分//这个$1就是执行./build.sh 后面所带的参数,比如在lichee下面有一个READEME文件Examples:1.Build linux-3.3 image for EVB$cd lichee$./build.sh -p sun6i$./build.sh pack2.Build linux kernel android  $./build.sh -p sun6i_fiber 3.Build linux test package  $./build.sh -p sun6i_dragonboard  //这里的$1就是上面实例中./build.sh 所带的参数//如果$1 == packif [ "$1" = "pack" ]; then   echo "generate rootfs now, it will takes several minutes and log in out/"if [ ! -d "${OUT_DIR}" ]; thenmkdir -pv ${OUT_DIR}firegen_rootfs > out/gen_rootfs_log.txt 2>&1gen_output_sun6i >> out/gen_rootfs_log.txt 2>&1echo "generate rootfs has finished!"    ${BR_DIR}/scripts/build_pack.shexit 0//如果$1 == pack_dragonboardelif [ "$1" = "pack_dragonboard" ]; then        regen_dragonboard_rootfs        gen_output_sun6i_dragonboard        ${BR_DIR}/scripts/build_pack.sh    exit 0//如果$1 == pack_prvtelif [ "$1" = "pack_prvt" ]; then        ${BR_DIR}/scripts/build_prvt.sh    exit 0fi//怎么知道这个OPTION是什么意思呢,你可以在lichee下面执行./build.sh -h可以看到一个OPTION的参数//也可以找到common.sh里面有一个show_help()的方法//以./build.sh -p sun6i_fiber这个为例子//所以可以知道 PLATFORM == sun6i_fiberwhile getopts hp:m:k: OPTIONdocase $OPTION inh) show_helpexit 0;;p) PLATFORM=$OPTARG;;m) MODULE=$OPTARG;;k) KERN_VER=$OPTARGupdate_kdir $KERN_VER;;*) show_helpexit 1;;esacdone// 执行上面之后这个PLATFORM就不为空了//在这里也说下这个shell的判断语言的参数是什么意思-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真 -w filename 如果 filename可写,则为真 -x filename 如果 filename可执行,则为真-s filename 如果文件长度不为0,则为真-h filename 如果文件是软链接,则为真filename1 -nt filename2 如果 filename1比 filename2新,则为真。filename1 -ot filename2 如果 filename1比 filename2旧,则为真。-eq 等于-ne 不等于-gt 大于-ge 大于等于-lt 小于-le 小于等于至于!号那就是取非if [ -z "$PLATFORM" ]; thenshow_helpexit 1fiif [ -z "$PLATFORM" ]; thenshow_helpexit 1fi//如果MODULE等于buildroot,就是跑到相关目录执行脚本,后面的都是差不多的if [ "$MODULE" = buildroot ]; thencd ${BR_DIR} && ./build.sh -p ${PLATFORM}elif [ "$MODULE" = kernel ]; thenexport PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATHcd ${KERN_DIR} && ./build.sh -p ${PLATFORM}elif [ "$MODULE" = "uboot" ]; thencase ${PLATFORM} ina12_nuclear*)echo "build uboot for sun5i_a12"cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12;;a12*)echo "build uboot for sun5i_a12"cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12;;a13_nuclear*)echo "build uboot for sun5i_a12"cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13;;a13*)echo "build uboot for sun5i_a13"cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13;;*)echo "build uboot for ${PLATFORM}"cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM};;esacelse//如果MODULE不等于以上的就执行这里//进入buildroot目录,这个BR_DIR在common.sh最开始的地方有定义,执行脚本.cd ${BR_DIR} && ./build.sh -p ${PLATFORM}//来看看这个buildroot目录下面的脚本build.sh#!/bin/bashset -ePLATFORM=""MODULE=""//显示帮助show_help(){printf "\nbuild.sh - Top level build scritps\n"echo "Valid Options:"echo "  -h  Show help message"echo "  -p <platform> platform:sun6i sun6i_fiber sun6i_fiber_a31s sun6i_fiber_a31s512m or sun6i_dragonboard"printf "  -m <module> module\n\n"}//获得到platform,module的值while getopts hp:m: OPTIONdocase $OPTION inh) show_help;;p) PLATFORM=$OPTARG;;m) MODULE=$OPTARG;;*) show_help;;esacdone//如果platform等于空,则显示帮助并退出if [ -z "$PLATFORM" ]; thenshow_helpexit 1fi//如果module等于空,则MODULE==allif [ -z "$MODULE" ]; thenMODULE="all"fi//判断目录下面的文件是否为可执行文件if [ -x ./scripts/build_${PLATFORM}.sh ]; then执行相关脚本(这个脚本的功能就是解压工具链以及设置环境变量)./scripts/build_${PLATFORM}.sh $MODULE//如果没有可执行文件就显示错误信息,并显示帮助退出elseprintf "\nERROR: Invalid Platform\nonly sun6i sun6i_fiber sun6i_fiber_a31s sun6i_fiber_a31s512m or sun6i_dragonboard support\n"show_helpexit 1fi再回到common.sh这个脚本继续往下看//设置环境变量export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH//执行该脚本编译内核(根据你选择相关平台来执行相关脚本如果build_sun6i_fiber.sh )cd ${KERN_DIR} && ./build.sh -p ${PLATFORM}进入lichee/linux-3.3/scripts/build_sun6i_fiber.sh1。设置编译工具链环境变量2.LICHEE_ROOT=`(cd ${LICHEE_KDIR}/..; pwd)`export PATH=${LICHEE_ROOT}/buildroot/output/external-toolchain/bin:${LICHEE_ROOT}/tools/pack/pctools/linux/android:$PATH//这个$1就是lichee/linux-3.3/build.sh所执行的./scripts/build_${PLATFORM}.sh $MODULE//MODULE值== all,所以执行all分支下面的函数build_kernel,build_modules,build_ramfscase "$1" inkernel)build_kernel;;modules) build_modules ;;clean)clean_kernel clean_modules ;;all) build_kernel build_modules build_ramfs ;;*) show_help;;esackernel编译完成之后就是编译uboot了//编译ubootcase ${PLATFORM} ina12_nuclear*)echo "build uboot for sun5i_a12"                cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12;;        a12*)                echo "build uboot for sun5i_a12"                cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12                ;;        a13_nuclear*)        echo "build uboot for sun5i_a12"                cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13;;a13*)                echo "build uboot for sun5i_a13"                cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13                ;;sun6i)echo "build uboot for sun6i"cd ${U_BOOT_DIR} && ./build.sh -p sun6i;;sun6i_fiber)echo "build uboot for sun6i_fiber"cd ${U_BOOT_DIR} && ./build.sh -p sun6igen_output_${PLATFORM};;sun6i_fiber_a31s)echo "build uboot for sun6i_fiber_a31s"cd ${U_BOOT_DIR} && ./build.sh -p sun6igen_output_${PLATFORM};;sun6i_fiber_a31s512m)echo "build uboot for sun6i_fiber_a31s"cd ${U_BOOT_DIR} && ./build.sh -p sun6igen_output_${PLATFORM};;        sun6i_dragonboard)                echo "build uboot for sun6i_dragonboard"cd ${U_BOOT_DIR} && ./build.sh -p sun6i         ;;*)                echo "build uboot for ${PLATFORM}"                cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM}                ;;        esac#regen_rootfs#gen_output_${PLATFORM}//最后编译完成会显示如下信息echo -e "\033[0;31;1m###############################\033[0m"echo -e "\033[0;31;1m#         compile success     #\033[0m"echo -e "\033[0;31;1m###############################\033[0m"fi


0 0
原创粉丝点击