编译cubieboard android 源码过程详解之(七):lichee build

lichee貌似是aliwinner的一个开发代号,目录下存放这与BSP相关的文件,如boot uboot kernel buildroot tools等。在该目录下执行如下命令可以看到可用的功能:

./build.sh -h



NAME

    build - The top level build script for Lichee Linux BSP



SYNOPSIS

    build [-h] | [-p platform] [-k kern_version] [-m module] | pack



OPTIONS

    -h             Display help message

    -p [platform]  platform, e.g. sun4i, sun4i-lite, sun4i-debug, sun4i_crane

                   sun4i: full linux bsp

                   sun4i-lite: linux bsp with less packages

                   sun4i-debug: linux bsp for debug

                   sun4i_crane: android kernel



    -k [kern_ver]  2.6.36(default), or 3.0                          [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 program



Examples:

    ./build.sh -p sun4i-lite

    ./build.sh -p sun4i_crane

    ./build.sh -p sun4i-lite

    ./build.sh pack

对于编译安卓镜像来说,需要执行:

./build.sh -p sun4i_crane -k 3.0

 

build.sh

1 #!/bin/bash

2 set -e

3 

4 buildroot/scripts/common.sh $@

    buildroot/scripts/common.sh

1 if [ "$1" = "pack" ]; then

2         ${BR_DIR}/scripts/build_pack.sh

3         exit 0

4 fi

判断是否只是打包

 1 while getopts hp:m:k: OPTION

 2 do

 3     case $OPTION in

 4     h) show_help

 5     exit 0

 6     ;;

 7     p) PLATFORM=$OPTARG

 8     ;;

 9     m) MODULE=$OPTARG

10     ;;

11     k) KERN_VER=$OPTARG

12     update_kdir $KERN_VER

13     ;;

14     *) show_help

15     exit 1

16     ;;

17 esac

18 done

之前设置的 “-p sun4i_crane -k 3.0” 在这里起作用了,有一点很重要,没有设置 -m 参数,所以是编译所有,后面会提到。

1 if [ -z "$PLATFORM" ]; then

2     show_help

3     exit 1

4 fi

不允许缺少 -p 参数

 1 if [ "$MODULE" = buildroot ]; then #只编译buildroot

 2     cd ${BR_DIR} && ./build.sh -p ${PLATFORM}

 3 elif [ "$MODULE" = kernel ]; then #只编译kernel

 4     export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH

 5     cd ${KERN_DIR} && ./build.sh -p ${PLATFORM}

 6     regen_rootfs

 7     gen_output_${PLATFORM}

 8 elif [ "$MODULE" = "uboot" ]; then #只编译uboot

 9     case ${PLATFORM} in

10     a12*)

11         echo "build uboot for sun5i_a12"

12         cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12

13         ;;

14     a13*)

15         echo "build uboot for sun5i_a13"

16         cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13

17         ;;

18     *)

19         echo "build uboot for ${PLATFORM}"

20         cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM}

21         ;;

22     esac

23 else #编译所有的

24     cd ${BR_DIR} && ./build.sh -p ${PLATFORM}

25     export PATH=${BR_OUT_DIR}/external-toolchain/bin:$PATH

26     cd ${KERN_DIR} && ./build.sh -p ${PLATFORM}

27 

28     case ${PLATFORM} in

29         a12*)

30                 echo "build uboot for sun5i_a12"

31                 #cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a12

32                 ;;

33         a13*)

34                 echo "build uboot for sun5i_a13"

35                 #cd ${U_BOOT_DIR} && ./build.sh -p sun5i_a13

36                 ;;

37         sun4i-test)

38                echo "build uboot for sun4i test"

39                #cd ${U_BOOT_DIR} && ./build.sh -p sun4i

40                ;;

41         *)

42                 echo "build uboot for ${PLATFORM}"

43                 cd ${U_BOOT_DIR} && ./build.sh -p ${PLATFORM}

44                 ;;

45         esac

46 

47     regen_rootfs

48     gen_output_${PLATFORM}

49     echo "###############################"

50     echo "#         compile success     #"

51     echo "###############################"

52     fi

实际上执行的最后一个 if-else 分支的内容,为了方便阅读,将变量替换为值:

cd buildroot && ./build.sh -p sun4i_crane

cd linux-3.0 && ./build.sh -p sun4i_crane

cd u-boot && ./build.sh -p sun4i_crane

相当于先后编译了 buildroot linux-3.0 u-boot,一个一个看。

        buildroot/build.sh -p sun4i_crane

if [ -x ./scripts/build_${PLATFORM}.sh ]; then

    ./scripts/build_${PLATFORM}.sh $MODULE

else

    printf "\nERROR: Invalid Platform\n"

    show_help

    exit 1

fi

替换变量后,相当于执行了

buildroot/scripts/build_sun4i_crane.sh all

查看脚本内容可知,对于android平台,跳过了buildroot。

        linux-3.0/build.sh -p sun4i_crane

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/scripts/build_sun4i_crane.sh all
            linux-3.0/scripts/build_sun4i_crane.sh all

case "$1" in

kernel)

    build_kernel

    ;;

modules)

    build_modules

    ;;

clean)

    clean_kernel

    clean_modules

    ;;

all)

    build_kernel

    build_modules

    ;;

*)

    show_help

    ;;

esac

具体就是编译了内核和私有模块。内核当然包含kernel和modules,私有模块源码在linux-3.0/modules目录下。

最后将编译出的东西放在了 linux-3.0/output 目录下(已经根据需要就行了精简):

.

├── bImage

├── lib

│   └── modules

│       └── 3.0.8

│           ├── mali.ko

│           ├── Module.symvers

│           └── ump.ko

├── uImage

└── zImage
        u-boot/build.sh -p sun4i_crane

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

正常编译 sun4i 的uboot

 regen_rootfs

gen_output_sun4i_crane()

其实就是将编译出的kernel uboot modules等安装到 out 目录下:

out/

├── android

│   ├── bImage

│   ├── lib

│   │   └── modules

│   │       └── 3.0.8

│   │           ├── mali.ko

│   │           ├── Module.symvers

│   │           └── ump.ko

│   ├── toolchain

│   │   └── arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

│   ├── uImage

│   └── zImage

└── u-boot.bin

OK,分析完毕。

 

 

你可能感兴趣的:(android)