2014-10-13 19:04:03 +02:00
#!/bin/bash
#
2015-12-02 20:33:32 +01:00
# Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com
2014-10-13 19:04:03 +02:00
#
2015-12-02 20:33:32 +01:00
# This file is licensed under the terms of the GNU General Public
# License version 2. This program is licensed "as is" without any
# warranty of any kind, whether express or implied.
2014-10-13 19:04:03 +02:00
#
2015-12-02 20:33:32 +01:00
# This file is a part of tool chain https://github.com/igorpecovnik/lib
#
#
# Main program
#
2016-09-03 16:42:03 +03:00
# destination
DEST = $SRC /output
# sources for compilation
SOURCES = $SRC /sources
2015-12-02 20:33:32 +01:00
2016-04-16 18:12:34 +03:00
TTY_X = $(( $( stty size | awk '{print $2}' ) - 6 )) # determine terminal width
TTY_Y = $(( $( stty size | awk '{print $1}' ) - 6 )) # determine terminal height
2016-03-27 15:39:08 +02:00
2016-04-18 18:21:43 +03:00
# We'll use this title on all menus
backtitle = "Armbian building script, http://www.armbian.com | Author: Igor Pecovnik"
2015-12-12 18:35:38 +03:00
2016-04-18 18:21:43 +03:00
# if language not set, set to english
[ [ -z $LANGUAGE ] ] && export LANGUAGE = "en_US:en"
# default console if not set
[ [ -z $CONSOLE_CHAR ] ] && export CONSOLE_CHAR = "UTF-8"
# Load libraries
2016-08-09 18:26:22 +03:00
source $SRC /lib/debootstrap-ng.sh # System specific install
2016-04-18 18:21:43 +03:00
source $SRC /lib/distributions.sh # System specific install
source $SRC /lib/desktop.sh # Desktop specific install
source $SRC /lib/common.sh # Functions
source $SRC /lib/makeboarddeb.sh # Create board support package
source $SRC /lib/general.sh # General functions
2016-06-19 16:55:03 +03:00
source $SRC /lib/chroot-buildpackages.sh # Building packages in chroot
2016-02-10 20:20:54 +01:00
2015-12-24 19:37:34 +03:00
# compress and remove old logs
2016-01-07 11:47:38 +03:00
mkdir -p $DEST /debug
2016-07-05 22:16:15 +03:00
( cd $DEST /debug && tar -czf logs-$( <timestamp) .tgz *.log) > /dev/null 2>& 1
2015-12-24 19:37:34 +03:00
rm -f $DEST /debug/*.log > /dev/null 2>& 1
2016-07-05 22:16:15 +03:00
date +"%d_%m_%Y-%H_%M_%S" > $DEST /debug/timestamp
2016-06-16 14:34:45 +03:00
# delete compressed logs older than 7 days
( cd $DEST /debug && find . -name '*.tgz' -atime +7 -delete) > /dev/null
2015-12-24 19:37:34 +03:00
2016-04-18 18:21:43 +03:00
# compile.sh version checking
ver1 = $( awk -F"=" '/^# VERSION/ {print $2}' <" $SRC /compile.sh " )
ver2 = $( awk -F"=" '/^# VERSION/ {print $2}' <" $SRC /lib/compile.sh " 2>/dev/null) || ver2 = 0
if [ [ -z $ver1 || $ver1 -lt $ver2 ] ] ; then
display_alert " File $0 is outdated. Please overwrite is with an updated version from " " $SRC /lib " "wrn"
echo -e "Press \e[0;33m<Ctrl-C>\x1B[0m to abort compilation, \e[0;33m<Enter>\x1B[0m to ignore and continue"
read
fi
2015-12-11 20:49:10 +03:00
# Script parameters handling
for i in " $@ " ; do
2016-04-23 19:06:39 +03:00
if [ [ $i = = *= * ] ] ; then
2015-12-11 20:49:10 +03:00
parameter = ${ i %%=* }
value = ${ i ##*= }
2015-12-12 18:35:38 +03:00
display_alert " Command line: setting $parameter to " " ${ value :- (empty) } " "info"
2015-12-11 20:49:10 +03:00
eval $parameter = $value
2015-12-09 18:02:04 +03:00
fi
2015-12-11 20:49:10 +03:00
done
2016-01-03 13:51:56 +03:00
if [ [ $PROGRESS_DISPLAY = = none ] ] ; then
2016-04-23 19:06:39 +03:00
OUTPUT_VERYSILENT = yes
2016-01-03 13:51:56 +03:00
elif [ [ $PROGRESS_DISPLAY != plain ] ] ; then
2016-04-23 19:06:39 +03:00
OUTPUT_DIALOG = yes
2015-12-11 20:49:10 +03:00
fi
2016-01-03 13:51:56 +03:00
if [ [ $PROGRESS_LOG_TO_FILE != yes ] ] ; then unset PROGRESS_LOG_TO_FILE; fi
if [ [ $USE_CCACHE != no ] ] ; then
CCACHE = ccache
2016-05-04 17:16:39 +03:00
export PATH = " /usr/lib/ccache: $PATH "
2016-01-03 13:51:56 +03:00
else
CCACHE = ""
fi
2015-12-11 20:49:10 +03:00
2016-04-29 12:54:41 +03:00
# optimize build time with 100% CPU usage
CPUS = $( grep -c 'processor' /proc/cpuinfo)
if [ [ $USEALLCORES != no ] ] ; then
CTHREADS = " -j $(( $CPUS + $CPUS / 2 )) "
else
CTHREADS = "-j1"
fi
2016-08-30 19:25:32 +03:00
# Check and install dependencies, directory structure and settings
2015-12-12 18:35:38 +03:00
prepare_host
2015-12-11 20:49:10 +03:00
2016-04-29 12:54:41 +03:00
# if KERNEL_ONLY, BOARD, BRANCH or RELEASE are not set, display selection menu
2016-04-18 18:21:43 +03:00
2016-04-16 18:06:21 +03:00
if [ [ -z $KERNEL_ONLY ] ] ; then
options += ( "yes" "Kernel, u-boot and other packages" )
options += ( "no" "Full OS image for writing to SD card" )
KERNEL_ONLY = $( dialog --stdout --title "Choose an option" --backtitle " $backtitle " --no-tags --menu "Select what to build" $TTY_Y $TTY_X $(( $TTY_Y - 8 )) " ${ options [@] } " )
unset options
[ [ -z $KERNEL_ONLY ] ] && exit_with_error "No option selected"
2015-12-11 20:49:10 +03:00
fi
2015-12-02 20:33:32 +01:00
2016-04-16 18:06:21 +03:00
if [ [ -z $BOARD ] ] ; then
options = ( )
for board in $SRC /lib/config/boards/*.conf; do
options += ( " $( basename $board | cut -d'.' -f1) " " $( head -1 $board | cut -d'#' -f2) " )
done
BOARD = $( dialog --stdout --title "Choose a board" --backtitle " $backtitle " --scrollbar --menu "Select one of supported boards" $TTY_Y $TTY_X $(( $TTY_Y - 8 )) " ${ options [@] } " )
unset options
[ [ -z $BOARD ] ] && exit_with_error "No board selected"
2015-12-11 20:49:10 +03:00
fi
2015-12-02 20:33:32 +01:00
2016-04-16 18:06:21 +03:00
source $SRC /lib/config/boards/$BOARD .conf
2015-12-02 20:33:32 +01:00
2016-04-16 18:06:21 +03:00
[ [ -z $KERNEL_TARGET ] ] && exit_with_error "Board configuration does not define valid kernel config"
2015-12-02 20:33:32 +01:00
2016-04-16 18:06:21 +03:00
if [ [ -z $BRANCH ] ] ; then
options = ( )
[ [ $KERNEL_TARGET = = *default* ] ] && options += ( "default" "3.4.x - 3.14.x legacy" )
[ [ $KERNEL_TARGET = = *next* ] ] && options += ( "next" "Latest stable @kernel.org" )
[ [ $KERNEL_TARGET = = *dev* ] ] && options += ( "dev" "Latest dev @kernel.org" )
# do not display selection dialog if only one kernel branch is available
if [ [ " ${# options [@] } " = = 2 ] ] ; then
2016-04-17 15:12:09 +03:00
BRANCH = " ${ options [0] } "
2016-04-16 18:06:21 +03:00
else
BRANCH = $( dialog --stdout --title "Choose a kernel" --backtitle " $backtitle " --menu "Select one of supported kernels" $TTY_Y $TTY_X $(( $TTY_Y - 8 )) " ${ options [@] } " )
2015-12-02 20:33:32 +01:00
fi
2016-04-16 18:06:21 +03:00
unset options
[ [ -z $BRANCH ] ] && exit_with_error "No kernel branch selected"
2016-04-18 15:17:28 +03:00
else
[ [ $KERNEL_TARGET != *$BRANCH * ] ] && exit_with_error "Kernel branch not defined for this board" " $BRANCH "
2015-12-11 20:49:10 +03:00
fi
2016-04-16 18:06:21 +03:00
if [ [ $KERNEL_ONLY != yes && -z $RELEASE ] ] ; then
options = ( )
options += ( "wheezy" "Debian 7 Wheezy (oldstable)" )
options += ( "jessie" "Debian 8 Jessie (stable)" )
options += ( "trusty" "Ubuntu Trusty 14.04.x LTS" )
options += ( "xenial" "Ubuntu Xenial 16.04.x LTS" )
RELEASE = $( dialog --stdout --title "Choose a release" --backtitle " $backtitle " --menu "Select one of supported releases" $TTY_Y $TTY_X $(( $TTY_Y - 8 )) " ${ options [@] } " )
unset options
[ [ -z $RELEASE ] ] && exit_with_error "No release selected"
2016-08-03 17:14:24 +03:00
fi
2016-04-16 18:06:21 +03:00
2016-08-30 19:25:32 +03:00
if [ [ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP && "jessie xenial" = = *$RELEASE * ] ] ; then
2016-04-16 18:06:21 +03:00
options = ( )
options += ( "no" "Image with console interface" )
options += ( "yes" "Image with desktop environment" )
BUILD_DESKTOP = $( dialog --stdout --title "Choose image type" --backtitle " $backtitle " --no-tags --menu "Select image type" $TTY_Y $TTY_X $(( $TTY_Y - 8 )) " ${ options [@] } " )
unset options
[ [ -z $BUILD_DESKTOP ] ] && exit_with_error "No option selected"
fi
2015-12-11 20:49:10 +03:00
2016-04-18 18:21:43 +03:00
source $SRC /lib/configuration.sh
2015-12-11 20:49:10 +03:00
2016-08-11 21:04:41 +03:00
( cd $SRC /lib; echo " Build script version: $( git rev-parse @) " ) >> $DEST /debug/output.log
2015-12-14 19:50:14 +01:00
2015-12-20 16:19:36 +03:00
display_alert "Starting Armbian build script" "@host" "info"
2015-12-11 20:49:10 +03:00
# sync clock
2016-04-16 18:12:34 +03:00
if [ [ $SYNC_CLOCK != no ] ] ; then
2015-12-20 16:19:36 +03:00
display_alert "Syncing clock" "host" "info"
2016-08-30 19:25:32 +03:00
ntpdate -s ${ NTP_SERVER :- time.ijs.si }
2015-12-11 20:49:10 +03:00
fi
start = ` date +%s`
2016-08-13 21:15:26 +03:00
# fetch_from_repo <url> <dir> <ref> <subdir_flag>
2015-12-11 20:49:10 +03:00
2016-04-16 18:12:34 +03:00
[ [ $CLEAN_LEVEL = = *sources* ] ] && cleaning "sources"
2015-12-11 20:49:10 +03:00
2016-08-13 21:15:26 +03:00
display_alert "Downloading sources" "" "info"
fetch_from_repo " $BOOTSOURCE " " $BOOTDIR " " $BOOTBRANCH " "yes"
BOOTSOURCEDIR = $BOOTDIR /${ BOOTBRANCH ##* : }
fetch_from_repo " $KERNELSOURCE " " $KERNELDIR " " $KERNELBRANCH " "yes"
LINUXSOURCEDIR = $KERNELDIR /${ KERNELBRANCH ##* : }
2015-12-11 20:49:10 +03:00
2016-08-30 19:25:32 +03:00
# TODO: move to armbian-tools or extras-buildpkgs
fetch_from_repo "https://github.com/hglm/a10disp/" "sunxi-display-changer" "branch:master"
compile_sunxi_tools
2015-12-11 20:49:10 +03:00
2016-06-19 16:55:03 +03:00
if [ [ $LINUXFAMILY = = sun*i ] ] ; then
2016-04-18 15:17:28 +03:00
[ [ $BRANCH != default && $LINUXFAMILY != sun8i ] ] && LINUXFAMILY = "sunxi"
2015-12-11 20:49:10 +03:00
fi
2016-03-14 21:54:03 +03:00
# define package names
DEB_BRANCH = ${ BRANCH //default }
2016-04-02 13:40:09 +03:00
# if not empty, append hyphen
2016-03-14 21:54:03 +03:00
DEB_BRANCH = ${ DEB_BRANCH : + ${ DEB_BRANCH } - }
CHOSEN_UBOOT = linux-u-boot-${ DEB_BRANCH } ${ BOARD }
CHOSEN_KERNEL = linux-image-${ DEB_BRANCH } ${ LINUXFAMILY }
CHOSEN_ROOTFS = linux-${ RELEASE } -root-${ DEB_BRANCH } ${ BOARD }
2015-12-11 20:49:10 +03:00
for option in $( tr ',' ' ' <<< " $CLEAN_LEVEL " ) ; do
2016-03-14 21:54:03 +03:00
[ [ $option != sources ] ] && cleaning " $option "
2015-12-11 20:49:10 +03:00
done
2016-04-18 18:21:43 +03:00
# Compile u-boot if packed .deb does not exist
if [ [ ! -f $DEST /debs/${ CHOSEN_UBOOT } _${ REVISION } _${ ARCH } .deb ] ] ; then
2016-04-20 15:38:09 +03:00
# if requires specific toolchain, check if default is suitable
2016-05-04 12:10:45 +03:00
if [ [ -n $UBOOT_NEEDS_GCC ] ] && ! check_toolchain "UBOOT" " $UBOOT_NEEDS_GCC " ; then
2016-05-24 17:57:31 +03:00
# try to find suitable in $SRC/toolchains, exit if not found
2016-05-04 12:10:45 +03:00
find_toolchain "UBOOT" " $UBOOT_NEEDS_GCC " "UBOOT_TOOLCHAIN"
2016-04-20 15:38:09 +03:00
fi
2016-04-18 18:21:43 +03:00
cd $SOURCES /$BOOTSOURCEDIR
2016-08-30 19:25:32 +03:00
[ [ $FORCE_CHECKOUT = = yes ] ] && advanced_patch "u-boot" " $BOOTDIR - $BRANCH " " $BOARD " " $BOOTDIR - $BRANCH "
2016-04-18 18:21:43 +03:00
compile_uboot
fi
2015-12-19 17:35:43 +03:00
2016-04-18 18:21:43 +03:00
# Compile kernel if packed .deb does not exist
if [ [ ! -f $DEST /debs/${ CHOSEN_KERNEL } _${ REVISION } _${ ARCH } .deb ] ] ; then
2016-04-20 15:38:09 +03:00
# if requires specific toolchain, check if default is suitable
2016-05-04 12:10:45 +03:00
if [ [ -n $KERNEL_NEEDS_GCC ] ] && ! check_toolchain " $KERNEL " " $KERNEL_NEEDS_GCC " ; then
2016-05-24 17:57:31 +03:00
# try to find suitable in $SRC/toolchains, exit if not found
2016-05-04 12:10:45 +03:00
find_toolchain "KERNEL" " $KERNEL_NEEDS_GCC " "KERNEL_TOOLCHAIN"
2016-04-20 15:38:09 +03:00
fi
2016-04-18 18:21:43 +03:00
cd $SOURCES /$LINUXSOURCEDIR
2015-12-11 20:49:10 +03:00
2016-04-18 18:21:43 +03:00
# this is a patch that Ubuntu Trusty compiler works
if [ [ $( patch --dry-run -t -p1 < $SRC /lib/patch/kernel/compiler.patch | grep Reversed) != "" ] ] ; then
2016-08-19 19:16:03 +03:00
display_alert "Patching kernel for compiler support"
[ [ $FORCE_CHECKOUT = = yes ] ] && patch --batch --silent -t -p1 < $SRC /lib/patch/kernel/compiler.patch >> $DEST /debug/output.log 2>& 1
2016-04-18 18:21:43 +03:00
fi
2016-08-30 19:25:32 +03:00
[ [ $FORCE_CHECKOUT = = yes ] ] && advanced_patch "kernel" " $LINUXFAMILY - $BRANCH " " $BOARD " " $LINUXFAMILY - $BRANCH "
2016-04-18 18:21:43 +03:00
compile_kernel
fi
2015-12-11 20:49:10 +03:00
2016-08-30 19:25:32 +03:00
# extract kernel version from .deb package
VER = $( dpkg --info $DEST /debs/${ CHOSEN_KERNEL } _${ REVISION } _${ ARCH } .deb | grep Descr | awk '{print $(NF)}' )
VER = " ${ VER /- $LINUXFAMILY / } "
2016-03-14 21:54:03 +03:00
[ [ -n $RELEASE ] ] && create_board_package
2015-12-21 18:28:40 +03:00
2016-07-13 17:45:10 +03:00
# chroot-buildpackages
2016-09-03 16:42:03 +03:00
[ [ $EXTERNAL_NEW = = compile ] ] && chroot_build_packages
2016-06-19 16:55:03 +03:00
2015-12-30 14:31:33 +03:00
if [ [ $KERNEL_ONLY != yes ] ] ; then
2016-08-09 18:26:22 +03:00
debootstrap_ng
2015-12-30 14:31:33 +03:00
else
display_alert "Kernel building done" "@host" "info"
display_alert "Target directory" " $DEST /debs/ " "info"
2016-03-23 20:58:58 +01:00
display_alert "File name" " ${ CHOSEN_KERNEL } _ ${ REVISION } _ ${ ARCH } .deb " "info"
2015-12-11 20:49:10 +03:00
fi
end = ` date +%s`
2016-04-16 18:12:34 +03:00
runtime = $(( ( end-start) / 60 ))
2016-02-13 09:36:28 +01:00
display_alert "Runtime" " $runtime min " "info"