在lib/main.sh当中
13 if [[ $(basename $0) == main.sh ]]; then 14 echo "Please use compile.sh to start the build process" 15 exit -1 16 fi 17 18 # default umask for root is 022 so parent directories won't be group writeable without this 19 # this is used instead of making the chmod in prepare_host() recursive 20 umask 002 21 22 # destination 23 DEST=$SRC/output 24 25 TTY_X=$(($(stty size | awk '{print $2}')-6)) # determine terminal width 26 TTY_Y=$(($(stty size | awk '{print $1}')-6)) # determine terminal height 27
13-16行,由于 main.sh脚本的执行需要在compile.sh内 被调用,不可以直接通过lib/main.sh,在上一节当中我们总结了compile.sh的功能。
23行,设置最终镜像默认的输出目录
25-25行,主要是后面会使用dialog命令做人机交互时,用来设置对话框的大小。TTY_X TTY_Y会根据终端的变化而变化。
在lib/main.sh当中
28 # We'll use this title on all menus 29 backtitle="Armbian building script, http://www.armbian.com | Author: Igor Pecovnik" 30 31 # if language not set, set to english 32 [[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" 33 34 # default console if not set 35 [[ -z $CONSOLE_CHAR ]] && export CONSOLE_CHAR="UTF-8" 36 37 [[ -z $FORCE_CHECKOUT ]] && FORCE_CHECKOUT=yes 38
29行,用来设置对话框的标题
32行,用来设置LANGUAGE
35行,用来设置终端的输出字符集
37行,用来设置变量FORCE_CHECKOUT,后面拉取代码时会用到,在lib/generate.sh脚本,在fetch_from_repo() 钩子函数当中会用到,如下所示:
261 # working directory is not clean 262 if [[ $FORCE_CHECKOUT == yes ]]; then 263 display_alert "Checking out" 264 git checkout -f -q HEAD
继续回到lib/mian.sh当中,如下所示:加载相关的脚本函数,在后面的编译过程当中会用到,里面的内容比较多,我们在调用到的时候再进行详细分析
39 # Load libraries 40 source $SRC/lib/debootstrap-ng.sh # System specific install 41 source $SRC/lib/image-helpers.sh # helpers for OS image building 42 source $SRC/lib/distributions.sh # System specific install 43 source $SRC/lib/desktop.sh # Desktop specific install 44 source $SRC/lib/compilation.sh # Patching and compilation of kernel, uboot, ATF 45 source $SRC/lib/makeboarddeb.sh # Create board support package 46 source $SRC/lib/general.sh # General functions 47 source $SRC/lib/chroot-buildpackages.sh # Building packages in chroot
继续阅读lib/main.sh
49 # compress and remove old logs 50 mkdir -p $DEST/debug 51 (cd $DEST/debug && tar -czf logs-$(<timestamp).tgz *.log) > /dev/null 2>&1 52 rm -f $DEST/debug/*.log > /dev/null 2>&1 53 date +"%d_%m_%Y-%H_%M_%S" > $DEST/debug/timestamp 54 # delete compressed logs older than 7 days 55 (cd $DEST/debug && find . -name '*.tgz' -mtime +7 -delete) > /dev/null 56 57 if [[ $PROGRESS_DISPLAY == none ]]; then 58 OUTPUT_VERYSILENT=yes 59 elif [[ $PROGRESS_DISPLAY == dialog ]]; then 60 OUTPUT_DIALOG=yes 61 fi 62 if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi 63 64 SHOW_WARNING=yes 65 66 if [[ $USE_CCACHE != no ]]; then 67 CCACHE=ccache 68 export PATH="/usr/lib/ccache:$PATH" 69 # private ccache directory to avoid permission issues when using build script with "sudo" 70 # see https://ccache.samba.org/manual.html#_sharing_a_cache for alternative solution 71 [[ $PRIVATE_CCACHE == yes ]] && export CCACHE_DIR=$SRC/cache/ccache 72 else 73 CCACHE="" 74 fi
49-56行,主要是对之前的log文件进行压缩,并删除超过7天的log.
57-62行,由于之前的PROGRESS_DISPLAY PROGRESS_LOG_TO_FILE 都没有设置,流程不会被执行。
64行, 设置SHOW_WARNING=yes
66-71行,由于在config-default.conf当中, USE_CCACHE没有被默认设置,67 68 这两行会被执行
在lib/main.sh当中会调用到prepare_host,
76 # Check and install dependencies, directory structure and settings 77 prepare_host
该脚本函数在lib/general.sh, 第501行当中有定义,我们来看一下实现
495 # prepare_host 496 # 497 # * checks and installs necessary packages 498 # * creates directory structure 499 # * changes system settings 500 # 501 prepare_host() 502 { 503 display_alert "Preparing" "host" "info" 504 505 if [[ $(dpkg --print-architecture) != amd64 ]]; then 506 display_alert "Please read documentation to set up proper compilation environment" 507 display_alert "http://www.armbian.com/using-armbian-tools/" 508 exit_with_error "Running this tool on non x86-x64 build host in not supported" 509 fi 510 511 # exit if package manager is running in the back 512 while true; do 513 fuser -s /var/lib/dpkg/lock 514 if [[ $? = 0 ]]; then 515 display_alert "Package manager is running in the background." "retrying in 30 sec" "wrn" 516 sleep 30 517 else 518 break 519 fi 520 done 521 522 # need lsb_release to decide what to install 523 if [[ $(dpkg-query -W -f='${db:Status-Abbrev} ' lsb-release 2>/dev/null) != *ii* ]]; then 524 display_alert "Installing package" "lsb-release" 525 apt -q update && apt install -q -y --no-install-recommends lsb-release 526 fi 527 528 # packages list for host 529 # NOTE: please sync any changes here with the Dockerfile and Vagrantfile 530 local hostdeps="wget ca-certificates device-tree-compiler pv bc lzop zip binfmt-support build-essential ccache debootstrap ntpdate 531 gawk gcc-arm-linux-gnueabihf qemu-user-static u-boot-tools uuid-dev zlib1g-dev unzip libusb-1.0-0-dev fakeroot 532 parted pkg-config libncurses5-dev whiptail debian-keyring debian-archive-keyring f2fs-tools libfile-fcntllock-perl rsync libssl-dev 533 nfs-kernel-server btrfs-tools ncurses-term p7zip-full kmod dosfstools libc6-dev-armhf-cross 534 curl patchutils python liblz4-tool libpython2.7-dev linux-base swig libpython-dev aptly acl 535 locales ncurses-base pixz dialog systemd-container udev lib32stdc++6 libc6-i386 lib32ncurses5 lib32tinfo5 536 bison libbison-dev flex libfl-dev" 537 538 local codename=$(lsb_release -sc) 539 display_alert "Build host OS release" "${codename:-(unknown)}" "info" 540 541 # Ubuntu Xenial x86_64 is the only fully supported host OS release 542 # Ubuntu Bionic x86_64 support is WIP, especially for building full images and additional packages 543 # Using Docker/VirtualBox/Vagrant is the only supported way to run the build script on other Linux distributions 544 # 545 # NO_HOST_RELEASE_CHECK overrides the check for a supported host system 546 # Disable host OS check at your own risk, any issues reported with unsupported releases will be closed without a discussion 547 if [[ -z $codename || "xenial bionic" != *"$codename"* ]]; then 548 if [[ $NO_HOST_RELEASE_CHECK == yes ]]; then 549 display_alert "You are running on an unsupported system" "${codename:-(unknown)}" "wrn" 550 display_alert "Do not report any errors, warnings or other issues encountered beyond this point" "" "wrn" 551 else 552 exit_with_error "It seems you ignore documentation and run an unsupported build system: ${codename:-(unknown)}" 553 fi 554 fi 555 556 if grep -qE "(Microsoft|WSL)" /proc/version; then 557 exit_with_error "Windows subsystem for Linux is not a supported build environment" 558 fi 559 560 grep -q i386 <(dpkg --print-foreign-architectures) || dpkg --add-architecture i386 561 if systemd-detect-virt -q -c; then 562 display_alert "Running in container" "$(systemd-detect-virt)" "info" 563 # disable apt-cacher unless NO_APT_CACHER=no is not specified explicitly 564 if [[ $NO_APT_CACHER != no ]]; then 565 display_alert "apt-cacher is disabled in containers, set NO_APT_CACHER=no to override" "" "wrn" 566 NO_APT_CACHER=yes 567 fi 568 CONTAINER_COMPAT=yes 569 # trying to use nested containers is not a good idea, so don't permit EXTERNAL_NEW=compile 570 if [[ $EXTERNAL_NEW == compile ]]; then 571 display_alert "EXTERNAL_NEW=compile is not available when running in container, setting to prebuilt" "" "wrn" 572 EXTERNAL_NEW=prebuilt 573 fi 574 SYNC_CLOCK=no 575 fi 576 577 # warning: apt-cacher-ng will fail if installed and used both on host and in container/chroot environment with shared network 578 # set NO_APT_CACHER=yes to prevent installation errors in such case 579 if [[ $NO_APT_CACHER != yes ]]; then hostdeps="$hostdeps apt-cacher-ng"; fi 580 581 local deps=() 582 local installed=$(dpkg-query -W -f '${db:Status-Abbrev}|${binary:Package} ' '*' 2>/dev/null | grep '^ii' | awk -F '|' '{print $2}' | cut -d ':' -f 1) 583 584 for packet in $hostdeps; do 585 if ! grep -q -x -e "$packet" <<< "$installed"; then deps+=("$packet"); fi 586 done 587 588 # distribution packages are buggy, download from author 589 if [[ ! -f /etc/apt/sources.list.d/aptly.list ]]; then 590 display_alert "Updating from external repository" "aptly" "info" 591 apt-key adv --keyserver pool.sks-keyservers.net --recv-keys ED75B5A4483DA07C >/dev/null 2>&1 592 echo "deb http://repo.aptly.info/ squeeze main" > /etc/apt/sources.list.d/aptly.list 593 fi 594 595 if [[ ${#deps[@]} -gt 0 ]]; then 596 display_alert "Installing build dependencies" 597 apt -q update 598 apt -y upgrade 599 apt -q -y --no-install-recommends install "${deps[@]}" | tee -a $DEST/debug/hostdeps.log 600 update-ccache-symlinks 601 fi 602 603 # Temorally broken in Bionic, reverting to prvious version 604 # https://github.com/aptly-dev/aptly/issues/740 605 if [[ $(dpkg -s aptly | grep '^Version:' | sed 's/Version: //') != "1.2.0" && "$codename" == "bionic" ]]; then 606 apt -qq -y --allow-downgrades install aptly=1.2.0 607 fi 608 609 # sync clock 610 if [[ $SYNC_CLOCK != no ]]; then 611 display_alert "Syncing clock" "host" "info" 612 ntpdate -s ${NTP_SERVER:- time.ijs.si} 613 fi 614 615 if [[ $(dpkg-query -W -f='${db:Status-Abbrev} ' 'zlib1g:i386' 2>/dev/null) != *ii* ]]; then 616 apt install -qq -y --no-install-recommends zlib1g:i386 >/dev/null 2>&1 617 fi 618 619 # enable arm binary format so that the cross-architecture chroot environment will work 620 if [[ $KERNEL_ONLY != yes ]]; then 621 modprobe -q binfmt_misc 622 mountpoint -q /proc/sys/fs/binfmt_misc/ || mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc 623 test -e /proc/sys/fs/binfmt_misc/qemu-arm || update-binfmts --enable qemu-arm 624 test -e /proc/sys/fs/binfmt_misc/qemu-aarch64 || update-binfmts --enable qemu-aarch64 625 fi 626 627 # create directory structure 628 mkdir -p $SRC/{cache,output,userpatches} 629 if [[ -n $SUDO_USER ]]; then 630 chgrp --quiet sudo cache output userpatches 631 # SGID bit on cache/sources breaks kernel dpkg packaging 632 chmod --quiet g+w,g+s output userpatches 633 # fix existing permissions 634 find $SRC/output $SRC/userpatches -type d ! -group sudo -exec chgrp --quiet sudo {} ; 635 find $SRC/output $SRC/userpatches -type d ! -perm -g+w,g+s -exec chmod --quiet g+w,g+s {} ; 636 fi 637 mkdir -p $DEST/debs/extra $DEST/{config,debug,patch} $SRC/userpatches/overlay $SRC/cache/{sources,toolchains,utility,rootfs} $SRC/.tmp 638 639 find $SRC/patch -type d ! -name . | sed "s%/patch%/userpatches%" | xargs mkdir -p 640 641 # download external Linaro compiler and missing special dependencies since they are needed for certain sources 642 643 # Use backup server by default to balance the load 644 645 ARMBIANSERVER=dl.armbian.com 646 647 local toolchains=( 648 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz" 649 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu.tar.xz" 650 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz" 651 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz" 652 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz" 653 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi.tar.xz" 654 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz" 655 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-6.4.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz" 656 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz" 657 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz" 658 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz" 659 "https://${ARMBIANSERVER}/_toolchains/gcc-linaro-7.2.1-2017.11-x86_64_arm-eabi.tar.xz" 660 ) 661 662 for toolchain in ${toolchains[@]}; do 663 download_toolchain "$toolchain" 664 done 665 666 rm -rf $SRC/cache/toolchains/*.tar.xz $SRC/cache/toolchains/*.tar.xz.asc 667 local existing_dirs=( $(ls -1 $SRC/cache/toolchains) ) 668 for dir in ${existing_dirs[@]}; do 669 local found=no 670 for toolchain in ${toolchains[@]}; do 671 local filename=${toolchain##*/} 672 local dirname=${filename//.tar.xz} 673 [[ $dir == $dirname ]] && found=yes 674 done 675 if [[ $found == no ]]; then 676 display_alert "Removing obsolete toolchain" "$dir" 677 rm -rf $SRC/cache/toolchains/$dir 678 fi 679 done 680 681 # download etcher CLI utility 682 download_etcher_cli 683 684 [[ ! -f $SRC/userpatches/customize-image.sh ]] && cp $SRC/config/templates/customize-image.sh.template $SRC/userpatches/customize-image.sh 685 686 if [[ ! -f $SRC/userpatches/README ]]; then 687 rm -f $SRC/userpatches/readme.txt 688 echo 'Please read documentation about customizing build configuration' > $SRC/userpatches/README 689 echo 'http://www.armbian.com/using-armbian-tools/' >> $SRC/userpatches/README 690 fi 691 692 # check free space (basic) 693 local freespace=$(findmnt --target $SRC -n -o AVAIL -b 2>/dev/null) # in bytes 694 if [[ -n $freespace && $(( $freespace / 1073741824 )) -lt 10 ]]; then 695 display_alert "Low free space left" "$(( $freespace / 1073741824 )) GiB" "wrn" 696 # pause here since dialog-based menu will hide this message otherwise 697 echo -e "Press e[0;33m<Ctrl-C>x1B[0m to abort compilation, e[0;33m<Enter>x1B[0m to ignore and continue" 698 read 699 fi 700 } 701
该函数的功能主要:由于armbian的开发环境只支持ubuntu 16.04 18.04,且必须在64位机器上面安装,开发环境需要安装相关的软件包,通过查询已安装的软件包,然后把缺失的软件包都安装上
由于我们不是在docker容器当中编译,所以不必关心561-575行的内容,609-613行会同步网络时间,
619-625行,在本机挂载arm rootfs是需要binfmt_mist驱动的支持,参考:https://en.wikipedia.org/wiki/Binfmt_misc
Miscellaneous Binary Format(binfmt_misc)机制,可以通过要打开文件的特性来选择到底使用哪个程序来打开,该机制根据文件的元属性来选择合适的程序将其打开。
627-639行,创建相关的目录结构
645-664行,下载工具链
682行, 下载etcher_cli工具
692-700行,用于检测硬盘空间是否足够搭建开发环境
继续回到lib/mian.sh
79 # if KERNEL_ONLY, KERNEL_CONFIGURE, BOARD, BRANCH or RELEASE are not set, display selection menu 80 81 if [[ -z $KERNEL_ONLY ]]; then 82 options+=("yes" "U-boot and kernel packages") 83 options+=("no" "Full OS image for flashing") 84 KERNEL_ONLY=$(dialog --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select what to build" 85 $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}") 86 unset options 87 [[ -z $KERNEL_ONLY ]] && exit_with_error "No option selected" 88 89 fi 90 91 if [[ -z $KERNEL_CONFIGURE ]]; then 92 options+=("no" "Do not change the kernel configuration") 93 options+=("yes" "Show a kernel configuration menu before compilation") 94 KERNEL_CONFIGURE=$(dialog --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags --menu "Select the kernel configuration" 95 $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}") 96 unset options 97 [[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected" 98 99 fi 100
上面的代码会出对话框图,如下链接对dialog进行讲解,看了之后,上述代码就比较容易理解
https://www.cnblogs.com/lianghong881018/p/10315062.html
其实就是弹出如下对话框:
x x U-boot and kernel packages x x
x x Full OS image for flashing x x
x x Do not change the kernel configuration x x
x x Show a kernel configuration menu before compilation x x
在lib/main.sh
101 if [[ -z $BOARD ]]; then 102 WIP_STATE=supported 103 WIP_BUTTON='CSC/WIP/EOS' 104 STATE_DESCRIPTION=' - Officially supported boards' 105 temp_rc=$(mktemp) 106 while true; do 107 options=() 108 if [[ $WIP_STATE == supported ]]; then 109 for board in $SRC/config/boards/*.conf; do 110 options+=("$(basename $board | cut -d'.' -f1)" "$(head -1 $board | cut -d'#' -f2)") 111 done 112 else 113 for board in $SRC/config/boards/*.wip; do 114 options+=("$(basename $board | cut -d'.' -f1)" "1(WIP)n $(head -1 $board | cut -d'#' -f2)") 115 done 116 for board in $SRC/config/boards/*.csc; do 117 options+=("$(basename $board | cut -d'.' -f1)" "1(CSC)n $(head -1 $board | cut -d'#' -f2)") 118 done 119 for board in $SRC/config/boards/*.eos; do 120 options+=("$(basename $board | cut -d'.' -f1)" "1(EOS)n $(head -1 $board | cut -d'#' -f2)") 121 done 122 fi 123 if [[ $WIP_STATE != supported ]]; then 124 cat <<-'EOF' > $temp_rc 125 dialog_color = (RED,WHITE,OFF) 126 screen_color = (WHITE,RED,ON) 127 tag_color = (RED,WHITE,ON) 128 item_selected_color = (WHITE,RED,ON) 129 tag_selected_color = (WHITE,RED,ON) 130 tag_key_selected_color = (WHITE,RED,ON) 131 EOF 132 else 133 echo > $temp_rc 134 fi 135 BOARD=$(DIALOGRC=$temp_rc dialog --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar --colors 136 --extra-label "Show $WIP_BUTTON" --extra-button --menu "Select the target board. Displaying: $STATE_DESCRIPTION" 137 $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}") 138 STATUS=$? 139 if [[ $STATUS == 3 ]]; then 140 if [[ $WIP_STATE == supported ]]; then 141 [[ $SHOW_WARNING == yes ]] && show_developer_warning 142 STATE_DESCRIPTION=' - 1(CSC)n - Community Supported Configuration - 1(WIP)n - Work In Progress - 1(EOS)n - End Of Support' 143 WIP_STATE=unsupported 144 WIP_BUTTON='supported' 145 else 146 STATE_DESCRIPTION=' - Officially supported boards' 147 WIP_STATE=supported 148 WIP_BUTTON='CSC/WIP/EOS' 149 fi 150 continue 151 elif [[ $STATUS == 0 ]]; then 152 break 153 fi 154 unset options 155 [[ -z $BOARD ]] && exit_with_error "No board selected" 156 done 157 fi 158 159 if [[ -f $SRC/config/boards/${BOARD}.conf ]]; then 160 BOARD_TYPE='conf' 161 elif [[ -f $SRC/config/boards/${BOARD}.csc ]]; then 162 BOARD_TYPE='csc' 163 elif [[ -f $SRC/config/boards/${BOARD}.wip ]]; then 164 BOARD_TYPE='wip' 165 elif [[ -f $SRC/config/boards/${BOARD}.eos ]]; then 166 BOARD_TYPE='eos' 167 fi
101-157行, 通过枚举$SRC/config/boards/下的文件,弹出对话框,来设置BOARD变量。
x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x x bananapi A20 dual core 1Gb SoC x x x x bananapim2plus H3 quad core 1Gb SoC Wifi x x x x bananapipro A20 dual core 1GB SoC WiFi x x x x beelinkx2 H3 quad core 1GB SoC WiFi eMMC x x x x clearfogbase Marvell Armada 38x 1xmPCIe M.2 2xGBE SFP x x x x clearfogpro Marvell Armada 38x 2xmPCIe M.2 GBE Switch SFP x x x x cubietruck A20 dual core 2Gb SoC Wifi x x x x cubox-i Freescale iMx dual/quad core Wifi x x x x espressobin Marvell Armada 37x 1xmPCIe 2xGBE x x x x helios4 Marvell Armada 388 2GB-ECC 4xSATA 2xUSB3.0 1xGBE x x x x iotx-3 AM335X 1Gb SoC eMMC x x x x lepotato S905x Le potato quad core 2Gb SoC eMMC x x x x lime2 A20 dual core 1Gb SoC eMMC x x x x lime-a33 A33 quad core 1Gb SoC x x x x lime A20 dual core 512Mb SoC x x x x micro A20 dual core 1Gb SoC eMMC x x x x miqi RK3288 quad core 2GB SoC GBE x x x x nanopiair H3 quad core 512MB SoC Headless WiFi/BT eMMC x x x x nanopiduo H2+ quad core 256/512MB SoC Wi-Fi/Ethernet x x x x nanopik1plus H5 quad core 2GB RAM Wifi GBE eMMC x x x x nanopik2-s905 S905 K2 quad core 2GB SoC WiFi eMMC x x x x nanopim1 H3 quad core 1Gb SoC x x x x nanopim1plus H3 quad core 1GB SoC GbE/WiFi/BT eMMC x x x x nanopineo2 H5 quad core 256/512MB SoC Headless GBE x x x x nanopineo H3 quad core 256/512MB SoC Headless x x x x nanopineocore2 H5 quad core 1GB SoC Headless GBE eMMC x x x x nanopineoplus2 H5 quad core 1GB SoC Headless GBE eMMC WiFi/BT x x x x odroidc1 S805 C1 quad core x x x x odroidc2 S905 C2 quad core x x x x odroidxu4 Exynos5422 XU3/XU4 octa core x x x x orangepi2 H3 quad core 1GB RAM x x x x orangepilite H3 quad core 512MB RAM WiFi x x x x orangepione H3 quad core 512MB RAM x x x x orangepipc2 H5 quad core 1GB RAM x x x x orangepipc H3 quad core 1GB RAM x x x x orangepipcplus H3 quad core 1GB RAM WiFi eMMC x x x x orangepiplus2e H3 quad core 2GB RAM WiFi eMMC x x x x orangepiplus H3 quad core 1GB/2GB RAM WiFi eMMC x x x x orangepiprime H5 quad core 2GB RAM Wi-Fi/BT x x x x orangepi-r1 H2+ quad core 256MB Wi-Fi + dual Ethernet x x x x orangepiwin A64 quad core 1GB SoC GBE WiFi x x x x orangepizero H2+ quad core 256/512MB SoC Wi-Fi/Ethernet x x x x orangepizeroplus2-h3 H3 quad core 512MB SoC Wi-Fi/BT x x x x orangepizeroplus2-h5 H5 quad core 512MB SoC Wi-Fi/BT x x x x orangepizeroplus H5 quad core 512MB RAM, GbE, Wi-Fi x x x x pine64 A64 quad core 512MB-2GB SoC GBE x x x x pine64so A64 quad core 2GB SoC GBE x x x x pinebook-a64 A64 quad core 2GB SoC Wi-Fi/BT x x x x rock64 RK3328 quad core SoC 1GB-4GB x x x x tinkerboard RK3288 quad core 2GB SoC GBE WiFi x x x x udoo Freescale iMx dual/quad core Wifi x x x x x x x x x x x x x x x x x x x x x x x x x x
159-167行,根据$BOARD变量来设置BOARD_TYPE的值。
停一停,到了这一步,其实已经知道我们到底编译的是哪块板子了。接下来就是读取相关的配置。
把uboot kernel相关代码拉下来,并选择对应的rootfs版本,如ubuntu debian等,打包最终的镜像
当然到此处我们也知道如果要自已添加对新板子的支持,$SRC/config/boards/$BOARD.{conf,csc,wip,eos}是必不可少的。