zoukankan      html  css  js  c++  java
  • 编译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 "
    ERROR: Invalid Platform
    "
        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 "
    ERROR: Invalid Platform
    "
        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,分析完毕。

     
  • 相关阅读:
    任天堂确认账户被黑客入侵:开启双重验证是关键,会更加安全
    受疫情影响!美国大量科技初创企业要挨饿或倒闭
    泰国的IPv6功能已从约2%增至30%,部署率位于全球5名
    vue钩子函数
    vue自定义全局指令directive和局部指令directives
    vue自定义按键修饰符
    字符串padStart、padEnd填充
    vue过滤器
    vue指令v-if和v-show
    vue指令v-for和key属性
  • 原文地址:https://www.cnblogs.com/JonnyLulu/p/3601986.html
Copyright © 2011-2022 走看看