build/main.sh

284 lines
9.8 KiB
Bash
Raw Normal View History

2014-10-13 19:04:03 +02:00
#!/bin/bash
#
# Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com
2014-10-13 19:04:03 +02: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
#
# This file is a part of tool chain https://github.com/igorpecovnik/lib
#
#
# Main program
#
#
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
# We'll use this title on all menus
backtitle="Armbian building script, http://www.armbian.com | Author: Igor Pecovnik"
# 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
source $SRC/lib/debootstrap.sh # System specific install (old)
source $SRC/lib/debootstrap-ng.sh # System specific install (extended)
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
source $SRC/lib/chroot-buildpackages.sh # Building packages in chroot
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
2015-12-24 19:37:34 +03:00
(cd $DEST/debug && tar -czf logs-$(date +"%d_%m_%Y-%H_%M_%S").tgz *.log) > /dev/null 2>&1
rm -f $DEST/debug/*.log > /dev/null 2>&1
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
# 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
# clean unfinished DEB packing
rm -rf $DEST/debs/*/*/
2015-12-11 20:49:10 +03:00
# Script parameters handling
for i in "$@"; do
if [[ $i == *=* ]]; then
2015-12-11 20:49:10 +03:00
parameter=${i%%=*}
value=${i##*=}
display_alert "Command line: setting $parameter to" "${value:-(empty)}" "info"
2015-12-11 20:49:10 +03:00
eval $parameter=$value
fi
2015-12-11 20:49:10 +03:00
done
if [[ $PROGRESS_DISPLAY == none ]]; then
OUTPUT_VERYSILENT=yes
elif [[ $PROGRESS_DISPLAY != plain ]]; then
OUTPUT_DIALOG=yes
2015-12-11 20:49:10 +03:00
fi
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"
else
CCACHE=""
fi
2015-12-11 20:49:10 +03:00
if [[ $FORCE_CHECKOUT == yes ]]; then FORCE="-f"; else FORCE=""; fi
# 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
# Check and fix dependencies, directory structure and settings
prepare_host
2015-12-11 20:49:10 +03:00
# if KERNEL_ONLY, BOARD, BRANCH or RELEASE are not set, display selection menu
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
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
source $SRC/lib/config/boards/$BOARD.conf
[[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config"
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]}"
else
BRANCH=$(dialog --stdout --title "Choose a kernel" --backtitle "$backtitle" --menu "Select one of supported kernels" $TTY_Y $TTY_X $(($TTY_Y - 8)) "${options[@]}")
fi
unset options
[[ -z $BRANCH ]] && exit_with_error "No kernel branch selected"
else
[[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH"
2015-12-11 20:49:10 +03:00
fi
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"
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
source $SRC/lib/configuration.sh
2015-12-11 20:49:10 +03:00
# The name of the job
VERSION="Armbian $REVISION ${BOARD^} $DISTRIBUTION $RELEASE $BRANCH"
2016-06-27 14:13:27 +03:00
echo `date +"%d.%m.%Y %H:%M:%S"` $VERSION >> $DEST/debug/output.log
display_alert "Starting Armbian build script" "@host" "info"
2015-12-11 20:49:10 +03:00
# display what we do
2016-04-16 18:12:34 +03:00
if [[ $KERNEL_ONLY == yes ]]; then
2015-12-11 20:49:10 +03:00
display_alert "Compiling kernel" "$BOARD" "info"
else
display_alert "Building" "$VERSION" "info"
fi
# sync clock
2016-04-16 18:12:34 +03:00
if [[ $SYNC_CLOCK != no ]]; then
display_alert "Syncing clock" "host" "info"
eval ntpdate -s ${NTP_SERVER:- time.ijs.si}
2015-12-11 20:49:10 +03:00
fi
start=`date +%s`
# fetch_from_github [repository, sub directory]
2016-04-16 18:12:34 +03:00
[[ $CLEAN_LEVEL == *sources* ]] && cleaning "sources"
2015-12-11 20:49:10 +03:00
display_alert "source downloading" "@host" "info"
fetch_from_github "$BOOTLOADER" "$BOOTSOURCE" "$BOOTBRANCH" "yes"
BOOTSOURCEDIR=$BOOTSOURCE/$GITHUBSUBDIR
2016-04-16 18:12:34 +03:00
fetch_from_github "$LINUXKERNEL" "$LINUXSOURCE" "$KERNELBRANCH" "yes"
2015-12-11 20:49:10 +03:00
LINUXSOURCEDIR=$LINUXSOURCE/$GITHUBSUBDIR
2016-04-16 18:12:34 +03:00
if [[ -n $MISC1 ]]; then fetch_from_github "$MISC1" "$MISC1_DIR"; fi
if [[ -n $MISC5 ]]; then fetch_from_github "$MISC5" "$MISC5_DIR"; fi
if [[ -n $MISC6 ]]; then fetch_from_github "$MISC6" "$MISC6_DIR"; fi
2015-12-11 20:49:10 +03:00
# compile sunxi tools
if [[ $LINUXFAMILY == sun*i ]]; then
2015-12-11 20:49:10 +03:00
compile_sunxi_tools
[[ $BRANCH != default && $LINUXFAMILY != sun8i ]] && LINUXFAMILY="sunxi"
2015-12-11 20:49:10 +03:00
fi
# define package names
DEB_BRANCH=${BRANCH//default}
2016-04-02 13:40:09 +03:00
# if not empty, append hyphen
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
[[ $option != sources ]] && cleaning "$option"
2015-12-11 20:49:10 +03:00
done
# Compile u-boot if packed .deb does not exist
if [[ ! -f $DEST/debs/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]]; then
# 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
# 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"
fi
cd $SOURCES/$BOOTSOURCEDIR
grab_version "$SOURCES/$BOOTSOURCEDIR" "UBOOT_VER"
[[ $FORCE_CHECKOUT == yes ]] && advanced_patch "u-boot" "$BOOTSOURCE-$BRANCH" "$BOARD" "$BOOTSOURCE-$BRANCH $UBOOT_VER"
compile_uboot
fi
# Compile kernel if packed .deb does not exist
if [[ ! -f $DEST/debs/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb ]]; then
# 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
# 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"
fi
cd $SOURCES/$LINUXSOURCEDIR
2015-12-11 20:49:10 +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
[[ $FORCE_CHECKOUT == yes ]] && patch --batch --silent -t -p1 < $SRC/lib/patch/kernel/compiler.patch > /dev/null 2>&1
fi
grab_version "$SOURCES/$LINUXSOURCEDIR" "KERNEL_VER"
[[ $FORCE_CHECKOUT == yes ]] && advanced_patch "kernel" "$LINUXFAMILY-$BRANCH" "$BOARD" "$LINUXFAMILY-$BRANCH $KERNEL_VER"
compile_kernel
fi
2015-12-11 20:49:10 +03:00
[[ -n $RELEASE ]] && create_board_package
[[ $KERNEL_ONLY == yes && ($RELEASE == jessie || $RELEASE == xenial) && \
$EXPERIMENTAL_BUILDPKG == yes && $(lsb_release -sc) == xenial ]] && chroot_build_packages
if [[ $KERNEL_ONLY != yes ]]; then
2016-04-26 21:29:37 +03:00
if [[ $EXTENDED_DEBOOTSTRAP != no ]]; then
debootstrap_ng
else
# create or use prepared root file-system
custom_debootstrap
mount --bind $DEST/debs/ $CACHEDIR/sdcard/tmp
# install board specific applications
install_distribution_specific
install_common
2014-10-13 19:04:03 +02:00
# install external applications
[[ $EXTERNAL == yes ]] && install_external_applications
# install desktop
2016-04-16 18:12:34 +03:00
if [[ $BUILD_DESKTOP == yes ]]; then
install_desktop
fi
2014-10-13 19:04:03 +02:00
umount $CACHEDIR/sdcard/tmp > /dev/null 2>&1
# closing image
closing_image
fi
2014-10-13 19:04:03 +02: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
# workaround for bug introduced with desktop build -- please remove when fixed
chmod 777 /tmp
2015-12-11 20:49:10 +03:00
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"