* extensions framework (née "fragments")
- this should actually change nothing at this point, just add capabilities
- the framework is implemented in lib/extensions.sh
- the "if function x exists then call x" replaced with call_extension_method()
- +inline documentation
- +compatibility names
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions framework; meta-extensions: auto-docs and sample extension gen
- 2 extensions dealing with extensibility itself
- detect-unused-extensions: shows which extensions are enabled, but never called.
- gen-sample-extension-docs: generates a sample empty extension & Markdown documentation for extensions
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* new extension methods and features via config variables in core Armbian
- `SKIP_EXTERNAL_TOOLCHAINS=yes` - does not download or use any linaro toolchains, only build host-installed ones
- `SKIP_BOOTSPLASH=yes` - does not patch kernel for splash file
- `EXTRA_BSP_NAME=xyz` - allows for BSP variants, useful for when extensions modify the BSP
- `EXTRA_ROOTFS_MIB_SIZE=x` - add x mib's to rootfs size, for use with very small images
- `KERNEL_EXTRA_TARGETS` - what extra targets to make kernel for, default to "modules dtbs"
- `BOOTCONFIG=none` - does not build nor install u-boot; also doesn't handle bootscripts et al
- `unset KERNELSOURCE` - does not build nor install kernel, nor build initrd, nor build nor install firmware
- `ARMHF_ARCH=skip` - does not add armhf to apt/dpkg, thus pure arm64
- `SKIP_ARMBIAN_REPO=yes` - results in armbian.list.disabled in the final image
- define `APT_EXTRA_DIST_PARAMS` with apt-cacher-ng options and use it for `PACKAGE_LIST_INSTALL/REMOVE` et al
- initial support for targeting x86/amd64 UEFI and BIOS
- some do's/don'ts for x86/amd64, like a different `UBUNTU_MIRROR` default
- GPT/EFI(ESP) partitions (fat, `UEFISIZE=256` to enable, mount `UEFI_MOUNT_POINT=/boot/efi`, first on disk but ends
up at `$uefipart`=15)
- GPT/BIOS partitions (fat, `BIOSSIZE=1` to enable, second on disk but ends up at partition 14)
- `UEFI_FS_LABEL="armbiefi"` - to set the FAT label for the EFI partition, visible in Win/Mac
- hard-requires gdisk package host-side
- add add_host_dependencies() extension method; fill `EXTRA_BUILD_DEPS="pkg pkg2"` to install to host before toolchains
download
- add pre_prepare_partitions() extension method, for custom partition size calculations
- add create_partition_table() extension method, used to do full-custom partitioning if `USE_HOOK_FOR_PARTITION=yes`
- add post_create_partitions() extension method, mostly for easy debugging
- add post_write_sdcard() extension method, where you can also set `SKIP_VERIFY=yes` to skip sdcard verification
- add post_install_kernel_debs() extension method.
- multiple fixes to bsp to avoid spurious errors when files are not where it expects
- v4: detect `update-initramfs` failure and abort build with useful message if it does
- v4: show useful stacktrace in `exit_with_error`
- if `ERROR_DEBUG_SHELL=yes`, drop into a shell before unmounting/deleting everything, so we can inspect what went wrong
- v4: display a message before `apt-get remove PACKAGE_LIST_BOARD_REMOVE` packages, so any errors while removing are easy to understand
- v4: preserve kernel .config's dates when copying
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions framework; refactor tool fetching/building into extensions
- a few examples of core refactoring using extensions
- sunxi-tools extension, enabled by 2 different sunxi family includes ("reuse" example)
- marvel-tools extension, enabled by 2 different mvebu family includes
- rkbin-tools extension, enabled by rockship64_common family include
- amlogic-fip/c2-blobs stuff refactored directly into meson64_common.inc ("single-use" example)
- removed the 'testings' fetch_from_repo completely since not used anywhere.
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* .wip's for UEFI arm64 and UEFI/BIOS x86 via new GRUB extension
- v3: added `growroot`-awareness to `armbian-resize-filesystem`
- the partition-growing part of `armbian-resize-filesystem` does not deal correctly with the UEFI layout
- `growroot` is installed on UEFI images by default, that handles growing partition during initramfs
- now `armbian-resize-filesystem` handles `resize2fs` only, and works.
- v4: reworked UEFI board/family/include structure:
- use Distro's `linux-generic` kernel only for `current`
- `edge` now builds it's own pure-mainline `5.15.y` kernel, for both x86 and arm64
- `.config` taken from Ubuntu, probably needs tuning for EXTRAWIFI=yes et al
- v4: introduce `SKIP_KERNEL_SYMLINK=yes`, tested in `builddeb`
- to avoid symlinking kernel; u-boot likes it, but grub and flash-kernel hates it
- v5: many fixes
- v7: more small fixes.
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* .wip for the RaspberryPi 4B via new flash-kernel extension
- this does not build it's own kernel "yet", but uses default linux-raspi kernel from Ubuntu
- flash-kernel is not really a bootloader
- it just prepares kernel et al a FAT partition for booting by the RPi4b bootloader
- flash-kernel is standard Debian package, but has only been tested on Ubuntu releases
- it is really only known-working since Hirsute release.
- Debian's rpi kernel is armhf only, so out of scope here, at least until we add source-built kernels.
- v3: fixed focal rootfs build. untested.
- v3: better variable names, preparing for source-built kernel.
- v5: new edge build with pure mainline kernel.
- v6: many fixes and some hacks for packaging and layout, also firmware (using Ubuntu's)
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* Added first patch to edge x86 related to wifi drivers
* extensions: leave hostapd alone; remove hackish ext; block reentrancy
- package-list-utils does not belong in this PR
- grub or bcm2711 is not the place to remove hostapd
- block recursive enable_extension() calls, for now.
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* gen-sample-extension-docs: fix: avoid counter in generated sample
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: dependencies: enable_extension() in extensions with a stack
- and better stacktraces, I hope
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* Remove code from package list since we don't have it in repository
Adjust kernel config to disable driver that needs further polishing.
* Allow amd64 to build the same desktops as aarch64. We only have this limit for armhf, where some desktops don't work
* amd64: allow building amd64 on aarch64 with system toolchain
- conditionally add gcc-x86-64-linux-gnu to hostdeps
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* add libelf-dev directly to hostdeps (and Dockerfile), remove extension
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* packaging: remove SKIP_KERNEL_SYMLINK hack, fix the root cause
- which was the missing $image_name for non-arm64 & non-arm, so: x86 for example
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* grub: really obliterate u-boot stuff from BSP
- for now. soon we'll refactor u-boot so not have to do this
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* flash-kernel: really obliterate u-boot stuff from BSP
- for now. soon we'll refactor u-boot so not have to do this
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: add host_dependencies_ready() hook
- this passes FINAL_HOST_DEPS containing all hostdeps for the run after they're installed
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* Add verification functions for correct selection.
* If UEFI Skip symlink creation
* Do not create dtb package for amd64
* Skip scripts folder cleaning if build process native.
Skip creating postinst prerm scripts for headers.
* Skip applying headers-debian-byteshift.patch if build native
* Fix architecture syntax as x86_64
* Revert "amd64: allow building amd64 on aarch64 with system toolchain"
This reverts commit 0c5ee20bb1.
* Compare architectures before starting compilation.
Signed-off-by: The-going <48602507+The-going@users.noreply.github.com>
* extensions: cleanups after fixes by the-Going
- packaging:
- there is _no need_ anymore for the symlink hack, CONFIG_EFI or no. But check is great, see below
- it's not `amd64` that has no DTB's, it's all UEFI, thus: `is_enabled CONFIG_EFI`, thanks!
- Explicitly disallow "reverse cross compile" in amd64.conf.
- whitespace-only-deletions: revert. we shall shellfmt the whole thing one day, but not today.
- fix a few syntax warnings in newly introduced code (floating `$ARCH` vs `"${ARCH}`) - blame shellcheck
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* packaging: fix: turns out a lot of boards have CONFIG_EFI=y, can't use that for dtb/no-dtb decision.
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* grub: remove debug
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* firmware: allow installing `armbian-firmware-full`; make it really full
- can now use `BOARD_FIRMWARE_INSTALL="-full"` to install full firmware for the board. enable for UEFI.
- don't rely on KERNELSOURCE for firmware-related decisions. introduce `INSTALL_ARMBIAN_FIRMWARE` which defaults to `yes`
- rpi4b/flash-kernel: disable Armbian firmware; we need linux-firmware-raspi2, which conflicts.
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: log to /${LOG_SUBPATH}/ instead of fixed /debug/
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: introduce cleanup_extension_manager() called by build-all-ng's unset_all()
- to reset/unset everything done by the the initializer, so build can run again
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: remove 'global' logging, for use with build_all_ng
- enable_extensions() will have to live on without logging to file. it's just too early.
- now init EXTENSION_MANAGER_TMP_DIR in initialize_extension_manager()
- now init EXTENSION_MANAGER_LOG_FILE in initialize_extension_manager()
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* extensions: build-all-ng.sh bugfix due to extension's debug to stdout
- extensions (among other things) can produce output to stdout when activated
- fix: check_hash() produced "idential" (sic, now changed to IDENTICAL) to stdout as a trigger
- debugging output got mixed with "idential", rendering hash cache void for families that used extensions
- eg: sunxi, others
- fix is to send stdout to the bitbucket when sourcing the board & arch config files
- proper fix would be stop using stdout in this case and use return code for check_hash()
- one day soon
Signed-off-by: Ricardo Pardini <ricardo@pardini.net>
* Add CI build targets
Co-authored-by: Igor Pecovnik <igor.pecovnik@gmail.com>
Co-authored-by: The-going <48602507+The-going@users.noreply.github.com>
578 lines
18 KiB
Bash
578 lines
18 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright (c) 2013-2021 Igor Pecovnik, igor.pecovnik@gma**.com
|
|
#
|
|
# 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.
|
|
#
|
|
# This file is a part of the Armbian build script
|
|
# https://github.com/armbian/build/
|
|
|
|
|
|
|
|
|
|
cleanup_list() {
|
|
local varname="${1}"
|
|
local list_to_clean="${!varname}"
|
|
list_to_clean="${list_to_clean#"${list_to_clean%%[![:space:]]*}"}"
|
|
list_to_clean="${list_to_clean%"${list_to_clean##*[![:space:]]}"}"
|
|
echo ${list_to_clean}
|
|
}
|
|
|
|
|
|
|
|
|
|
if [[ $(basename "$0") == main.sh ]]; then
|
|
|
|
echo "Please use compile.sh to start the build process"
|
|
exit 255
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# default umask for root is 022 so parent directories won't be group writeable without this
|
|
# this is used instead of making the chmod in prepare_host() recursive
|
|
umask 002
|
|
|
|
# destination
|
|
if [ -d "$CONFIG_PATH/output" ]; then
|
|
DEST="${CONFIG_PATH}"/output
|
|
else
|
|
DEST="${SRC}"/output
|
|
fi
|
|
|
|
if [[ $BUILD_ALL != "yes" && -z $ROOT_FS_CREATE_ONLY ]]; then
|
|
# override stty size
|
|
[[ -n $COLUMNS ]] && stty cols $COLUMNS
|
|
[[ -n $LINES ]] && stty rows $LINES
|
|
TTY_X=$(($(stty size | awk '{print $2}')-6)) # determine terminal width
|
|
TTY_Y=$(($(stty size | awk '{print $1}')-6)) # determine terminal height
|
|
fi
|
|
|
|
# We'll use this title on all menus
|
|
backtitle="Armbian building script, https://www.armbian.com | https://docs.armbian.com | (c) 2013-2021 Igor Pecovnik "
|
|
|
|
|
|
# Warnings mitigation
|
|
[[ -z $LANGUAGE ]] && export LANGUAGE="en_US:en" # set to english if not set
|
|
[[ -z $CONSOLE_CHAR ]] && export CONSOLE_CHAR="UTF-8" # set console to UTF-8 if not set
|
|
|
|
# Libraries include
|
|
|
|
# shellcheck source=debootstrap.sh
|
|
source "${SRC}"/lib/debootstrap.sh # system specific install
|
|
# shellcheck source=image-helpers.sh
|
|
source "${SRC}"/lib/image-helpers.sh # helpers for OS image building
|
|
# shellcheck source=distributions.sh
|
|
source "${SRC}"/lib/distributions.sh # system specific install
|
|
# shellcheck source=desktop.sh
|
|
source "${SRC}"/lib/desktop.sh # desktop specific install
|
|
# shellcheck source=compilation.sh
|
|
source "${SRC}"/lib/compilation.sh # patching and compilation of kernel, uboot, ATF
|
|
# shellcheck source=compilation-prepare.sh
|
|
source "${SRC}"/lib/compilation-prepare.sh # drivers that are not upstreamed
|
|
# shellcheck source=makeboarddeb.sh
|
|
source "${SRC}"/lib/makeboarddeb.sh # board support package
|
|
# shellcheck source=general.sh
|
|
source "${SRC}"/lib/general.sh # general functions
|
|
# shellcheck source=chroot-buildpackages.sh
|
|
source "${SRC}"/lib/chroot-buildpackages.sh # chroot packages building
|
|
|
|
|
|
# set log path
|
|
LOG_SUBPATH=${LOG_SUBPATH:=debug}
|
|
|
|
# compress and remove old logs
|
|
mkdir -p "${DEST}"/${LOG_SUBPATH}
|
|
(cd "${DEST}"/${LOG_SUBPATH} && tar -czf logs-"$(<timestamp)".tgz ./*.log) > /dev/null 2>&1
|
|
rm -f "${DEST}"/${LOG_SUBPATH}/*.log > /dev/null 2>&1
|
|
date +"%d_%m_%Y-%H_%M_%S" > "${DEST}"/${LOG_SUBPATH}/timestamp
|
|
|
|
# delete compressed logs older than 7 days
|
|
(cd "${DEST}"/${LOG_SUBPATH} && find . -name '*.tgz' -mtime +7 -delete) > /dev/null
|
|
|
|
if [[ $PROGRESS_DISPLAY == none ]]; then
|
|
|
|
OUTPUT_VERYSILENT=yes
|
|
|
|
elif [[ $PROGRESS_DISPLAY == dialog ]]; then
|
|
|
|
OUTPUT_DIALOG=yes
|
|
|
|
fi
|
|
|
|
if [[ $PROGRESS_LOG_TO_FILE != yes ]]; then unset PROGRESS_LOG_TO_FILE; fi
|
|
|
|
|
|
|
|
SHOW_WARNING=yes
|
|
|
|
|
|
|
|
if [[ $USE_CCACHE != no ]]; then
|
|
|
|
CCACHE=ccache
|
|
export PATH="/usr/lib/ccache:$PATH"
|
|
# private ccache directory to avoid permission issues when using build script with "sudo"
|
|
# see https://ccache.samba.org/manual.html#_sharing_a_cache for alternative solution
|
|
[[ $PRIVATE_CCACHE == yes ]] && export CCACHE_DIR=$SRC/cache/ccache
|
|
|
|
else
|
|
|
|
CCACHE=""
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -n $REPOSITORY_UPDATE ]]; then
|
|
|
|
# select stable/beta configuration
|
|
if [[ $BETA == yes ]]; then
|
|
DEB_STORAGE=$DEST/debs-beta
|
|
REPO_STORAGE=$DEST/repository-beta
|
|
REPO_CONFIG="aptly-beta.conf"
|
|
else
|
|
DEB_STORAGE=$DEST/debs
|
|
REPO_STORAGE=$DEST/repository
|
|
REPO_CONFIG="aptly.conf"
|
|
fi
|
|
|
|
# For user override
|
|
if [[ -f "${USERPATCHES_PATH}"/lib.config ]]; then
|
|
display_alert "Using user configuration override" "userpatches/lib.config" "info"
|
|
source "${USERPATCHES_PATH}"/lib.config
|
|
fi
|
|
|
|
repo-manipulate "$REPOSITORY_UPDATE"
|
|
exit
|
|
|
|
fi
|
|
|
|
|
|
|
|
# if KERNEL_ONLY, KERNEL_CONFIGURE, BOARD, BRANCH or RELEASE are not set, display selection menu
|
|
if [[ -z $KERNEL_ONLY ]]; then
|
|
|
|
options+=("yes" "U-boot and kernel packages")
|
|
options+=("no" "Full OS image for flashing")
|
|
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"
|
|
|
|
fi
|
|
|
|
if [[ -z $KERNEL_CONFIGURE ]]; then
|
|
|
|
options+=("no" "Do not change the kernel configuration")
|
|
options+=("yes" "Show a kernel configuration menu before compilation")
|
|
options+=("prebuilt" "Use precompiled packages from Armbian repository")
|
|
KERNEL_CONFIGURE=$(dialog --stdout --title "Choose an option" --backtitle "$backtitle" --no-tags \
|
|
--menu "Select the kernel configuration" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
unset options
|
|
[[ -z $KERNEL_CONFIGURE ]] && exit_with_error "No option selected"
|
|
|
|
fi
|
|
|
|
if [[ -z $BOARD ]]; then
|
|
|
|
WIP_STATE=supported
|
|
WIP_BUTTON='CSC/WIP/EOS/TVB'
|
|
STATE_DESCRIPTION=' - boards with high level of software maturity'
|
|
temp_rc=$(mktemp)
|
|
|
|
while true; do
|
|
options=()
|
|
if [[ $WIP_STATE == supported ]]; then
|
|
|
|
for board in "${SRC}"/config/boards/*.conf; do
|
|
options+=("$(basename "${board}" | cut -d'.' -f1)" "$(head -1 "${board}" | cut -d'#' -f2)")
|
|
done
|
|
|
|
else
|
|
|
|
for board in "${SRC}"/config/boards/*.wip; do
|
|
options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(WIP)\Zn $(head -1 "${board}" | cut -d'#' -f2)")
|
|
done
|
|
for board in "${SRC}"/config/boards/*.csc; do
|
|
options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(CSC)\Zn $(head -1 "${board}" | cut -d'#' -f2)")
|
|
done
|
|
for board in "${SRC}"/config/boards/*.eos; do
|
|
options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(EOS)\Zn $(head -1 "${board}" | cut -d'#' -f2)")
|
|
done
|
|
for board in "${SRC}"/config/boards/*.tvb; do
|
|
options+=("$(basename "${board}" | cut -d'.' -f1)" "\Z1(TVB)\Zn $(head -1 "${board}" | cut -d'#' -f2)")
|
|
done
|
|
|
|
fi
|
|
|
|
if [[ $WIP_STATE != supported ]]; then
|
|
cat <<-'EOF' > "${temp_rc}"
|
|
dialog_color = (RED,WHITE,OFF)
|
|
screen_color = (WHITE,RED,ON)
|
|
tag_color = (RED,WHITE,ON)
|
|
item_selected_color = (WHITE,RED,ON)
|
|
tag_selected_color = (WHITE,RED,ON)
|
|
tag_key_selected_color = (WHITE,RED,ON)
|
|
EOF
|
|
else
|
|
echo > "${temp_rc}"
|
|
fi
|
|
BOARD=$(DIALOGRC=$temp_rc dialog --stdout --title "Choose a board" --backtitle "$backtitle" --scrollbar \
|
|
--colors --extra-label "Show $WIP_BUTTON" --extra-button \
|
|
--menu "Select the target board. Displaying:\n$STATE_DESCRIPTION" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
STATUS=$?
|
|
if [[ $STATUS == 3 ]]; then
|
|
if [[ $WIP_STATE == supported ]]; then
|
|
|
|
[[ $SHOW_WARNING == yes ]] && show_developer_warning
|
|
STATE_DESCRIPTION=' - \Z1(CSC)\Zn - Community Supported Configuration\n - \Z1(WIP)\Zn - Work In Progress
|
|
\n - \Z1(EOS)\Zn - End Of Support\n - \Z1(TVB)\Zn - TV boxes'
|
|
WIP_STATE=unsupported
|
|
WIP_BUTTON='matured'
|
|
EXPERT=yes
|
|
|
|
else
|
|
|
|
STATE_DESCRIPTION=' - boards with high level of software maturity'
|
|
WIP_STATE=supported
|
|
WIP_BUTTON='CSC/WIP/EOS'
|
|
EXPERT=no
|
|
|
|
fi
|
|
continue
|
|
elif [[ $STATUS == 0 ]]; then
|
|
break
|
|
fi
|
|
unset options
|
|
[[ -z $BOARD ]] && exit_with_error "No board selected"
|
|
done
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [[ -f $SRC/config/boards/${BOARD}.conf ]]; then
|
|
BOARD_TYPE='conf'
|
|
elif [[ -f $SRC/config/boards/${BOARD}.csc ]]; then
|
|
BOARD_TYPE='csc'
|
|
elif [[ -f $SRC/config/boards/${BOARD}.wip ]]; then
|
|
BOARD_TYPE='wip'
|
|
elif [[ -f $SRC/config/boards/${BOARD}.eos ]]; then
|
|
BOARD_TYPE='eos'
|
|
elif [[ -f $SRC/config/boards/${BOARD}.tvb ]]; then
|
|
BOARD_TYPE='tvb'
|
|
fi
|
|
|
|
|
|
|
|
|
|
# shellcheck source=/dev/null
|
|
source "${SRC}/config/boards/${BOARD}.${BOARD_TYPE}"
|
|
LINUXFAMILY="${BOARDFAMILY}"
|
|
|
|
[[ -z $KERNEL_TARGET ]] && exit_with_error "Board configuration does not define valid kernel config"
|
|
|
|
if [[ -z $BRANCH ]]; then
|
|
|
|
options=()
|
|
[[ $KERNEL_TARGET == *current* ]] && options+=("current" "Recommended. Come with best support")
|
|
[[ $KERNEL_TARGET == *legacy* ]] && options+=("legacy" "Old stable / Legacy")
|
|
[[ $KERNEL_TARGET == *edge* && $EXPERT = yes ]] && options+=("edge" "\Z1Bleeding edge from @kernel.org\Zn")
|
|
|
|
# do not display selection dialog if only one kernel branch is available
|
|
if [[ "${#options[@]}" == 2 ]]; then
|
|
BRANCH="${options[0]}"
|
|
else
|
|
BRANCH=$(dialog --stdout --title "Choose a kernel" --backtitle "$backtitle" --colors \
|
|
--menu "Select the target kernel branch\nExact kernel versions depend on selected board" \
|
|
$TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
fi
|
|
unset options
|
|
[[ -z $BRANCH ]] && exit_with_error "No kernel branch selected"
|
|
[[ $BRANCH == dev && $SHOW_WARNING == yes ]] && show_developer_warning
|
|
|
|
else
|
|
|
|
[[ $BRANCH == next ]] && KERNEL_TARGET="next"
|
|
# next = new legacy. Should stay for backward compatibility, but be removed from menu above
|
|
# or we left definitions in board configs and only remove menu
|
|
[[ $KERNEL_TARGET != *$BRANCH* ]] && exit_with_error "Kernel branch not defined for this board" "$BRANCH"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ $KERNEL_ONLY != yes && -z $RELEASE ]]; then
|
|
|
|
options=()
|
|
|
|
distros_options
|
|
|
|
RELEASE=$(dialog --stdout --title "Choose a release package base" --backtitle "$backtitle" \
|
|
--menu "Select the target OS release package base" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
echo "options : ${options}"
|
|
[[ -z $RELEASE ]] && exit_with_error "No release selected"
|
|
|
|
unset options
|
|
fi
|
|
|
|
# don't show desktop option if we choose minimal build
|
|
[[ $BUILD_MINIMAL == yes ]] && BUILD_DESKTOP=no
|
|
|
|
if [[ $KERNEL_ONLY != yes && -z $BUILD_DESKTOP ]]; then
|
|
|
|
# read distribution support status which is written to the armbian-release file
|
|
set_distribution_status
|
|
|
|
options=()
|
|
options+=("no" "Image with console interface (server)")
|
|
options+=("yes" "Image with desktop environment")
|
|
BUILD_DESKTOP=$(dialog --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \
|
|
--menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
unset options
|
|
[[ -z $BUILD_DESKTOP ]] && exit_with_error "No option selected"
|
|
if [[ ${BUILD_DESKTOP} == "yes" ]]; then
|
|
BUILD_MINIMAL=no
|
|
SELECTED_CONFIGURATION="desktop"
|
|
fi
|
|
|
|
fi
|
|
|
|
if [[ $KERNEL_ONLY != yes && $BUILD_DESKTOP == no && -z $BUILD_MINIMAL ]]; then
|
|
|
|
options=()
|
|
options+=("no" "Standard image with console interface")
|
|
options+=("yes" "Minimal image with console interface")
|
|
BUILD_MINIMAL=$(dialog --stdout --title "Choose image type" --backtitle "$backtitle" --no-tags \
|
|
--menu "Select the target image type" $TTY_Y $TTY_X $((TTY_Y - 8)) "${options[@]}")
|
|
unset options
|
|
[[ -z $BUILD_MINIMAL ]] && exit_with_error "No option selected"
|
|
if [[ $BUILD_MINIMAL == "yes" ]]; then
|
|
SELECTED_CONFIGURATION="cli_minimal"
|
|
else
|
|
SELECTED_CONFIGURATION="cli_standard"
|
|
fi
|
|
|
|
fi
|
|
|
|
#prevent conflicting setup
|
|
if [[ $BUILD_DESKTOP == "yes" ]]; then
|
|
BUILD_MINIMAL=no
|
|
SELECTED_CONFIGURATION="desktop"
|
|
elif [[ $BUILD_MINIMAL != "yes" || -z "${BUILD_MINIMAL}" ]]; then
|
|
BUILD_MINIMAL=no # Just in case BUILD_MINIMAL is not defined
|
|
BUILD_DESKTOP=no
|
|
SELECTED_CONFIGURATION="cli_standard"
|
|
elif [[ $BUILD_MINIMAL == "yes" ]]; then
|
|
BUILD_DESKTOP=no
|
|
SELECTED_CONFIGURATION="cli_minimal"
|
|
fi
|
|
|
|
[[ ${KERNEL_CONFIGURE} == prebuilt ]] && [[ -z ${REPOSITORY_INSTALL} ]] && \
|
|
REPOSITORY_INSTALL="u-boot,kernel,bsp,armbian-zsh,armbian-config,armbian-firmware${BUILD_DESKTOP:+,armbian-desktop}"
|
|
|
|
|
|
#shellcheck source=configuration.sh
|
|
source "${SRC}"/lib/configuration.sh
|
|
|
|
# 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
|
|
|
|
call_extension_method "post_determine_cthreads" "config_post_determine_cthreads" << 'POST_DETERMINE_CTHREADS'
|
|
*give config a chance modify CTHREADS programatically. A build server may work better with hyperthreads-1 for example.*
|
|
Called early, before any compilation work starts.
|
|
POST_DETERMINE_CTHREADS
|
|
|
|
if [[ $BETA == yes ]]; then
|
|
IMAGE_TYPE=nightly
|
|
elif [[ $BETA != "yes" && $BUILD_ALL == yes && -n $GPG_PASS ]]; then
|
|
IMAGE_TYPE=stable
|
|
else
|
|
IMAGE_TYPE=user-built
|
|
fi
|
|
|
|
branch2dir() {
|
|
[[ "${1}" == "head" ]] && echo "HEAD" || echo "${1##*:}"
|
|
}
|
|
|
|
BOOTSOURCEDIR="${BOOTDIR}/$(branch2dir "${BOOTBRANCH}")"
|
|
LINUXSOURCEDIR="${KERNELDIR}/$(branch2dir "${KERNELBRANCH}")"
|
|
[[ -n $ATFSOURCE ]] && ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")"
|
|
|
|
BSP_CLI_PACKAGE_NAME="armbian-bsp-cli-${BOARD}${EXTRA_BSP_NAME}"
|
|
BSP_CLI_PACKAGE_FULLNAME="${BSP_CLI_PACKAGE_NAME}_${REVISION}_${ARCH}"
|
|
BSP_DESKTOP_PACKAGE_NAME="armbian-bsp-desktop-${BOARD}${EXTRA_BSP_NAME}"
|
|
BSP_DESKTOP_PACKAGE_FULLNAME="${BSP_DESKTOP_PACKAGE_NAME}_${REVISION}_${ARCH}"
|
|
|
|
CHOSEN_UBOOT=linux-u-boot-${BRANCH}-${BOARD}
|
|
CHOSEN_KERNEL=linux-image-${BRANCH}-${LINUXFAMILY}
|
|
CHOSEN_ROOTFS=${BSP_CLI_PACKAGE_NAME}
|
|
CHOSEN_DESKTOP=armbian-${RELEASE}-desktop-${DESKTOP_ENVIRONMENT}
|
|
CHOSEN_KSRC=linux-source-${BRANCH}-${LINUXFAMILY}
|
|
|
|
do_default() {
|
|
|
|
start=$(date +%s)
|
|
|
|
# Check and install dependencies, directory structure and settings
|
|
# The OFFLINE_WORK variable inside the function
|
|
prepare_host
|
|
|
|
[[ "${JUST_INIT}" == "yes" ]] && exit 0
|
|
|
|
[[ $CLEAN_LEVEL == *sources* ]] && cleaning "sources"
|
|
|
|
# fetch_from_repo <url> <dir> <ref> <subdir_flag>
|
|
|
|
# ignore updates help on building all images - for internal purposes
|
|
if [[ $IGNORE_UPDATES != yes ]]; then
|
|
display_alert "Downloading sources" "" "info"
|
|
[[ -n $BOOTSOURCE ]] && fetch_from_repo "$BOOTSOURCE" "$BOOTDIR" "$BOOTBRANCH" "yes"
|
|
[[ -n $KERNELSOURCE ]] && fetch_from_repo "$KERNELSOURCE" "$KERNELDIR" "$KERNELBRANCH" "yes"
|
|
[[ -n $ATFSOURCE ]] && fetch_from_repo "$ATFSOURCE" "$ATFDIR" "$ATFBRANCH" "yes"
|
|
|
|
call_extension_method "fetch_sources_tools" <<- 'FETCH_SOURCES_TOOLS'
|
|
*fetch host-side sources needed for tools and build*
|
|
Run early to fetch_from_repo or otherwise obtain sources for needed tools.
|
|
FETCH_SOURCES_TOOLS
|
|
|
|
call_extension_method "build_host_tools" <<- 'BUILD_HOST_TOOLS'
|
|
*build needed tools for the build, host-side*
|
|
After sources are fetched, build host-side tools needed for the build.
|
|
BUILD_HOST_TOOLS
|
|
|
|
for option in $(tr ',' ' ' <<< "$CLEAN_LEVEL"); do
|
|
[[ $option != sources ]] && cleaning "$option"
|
|
done
|
|
fi
|
|
|
|
# Don't build at all if the BOOTCONFIG is 'none'.
|
|
[[ "${BOOTCONFIG}" != "none" ]] && {
|
|
# Compile u-boot if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f "${DEB_STORAGE}"/${CHOSEN_UBOOT}_${REVISION}_${ARCH}.deb ]]; then
|
|
if [[ -n "${ATFSOURCE}" && "${REPOSITORY_INSTALL}" != *u-boot* ]]; then
|
|
compile_atf
|
|
fi
|
|
[[ "${REPOSITORY_INSTALL}" != *u-boot* ]] && compile_uboot
|
|
fi
|
|
}
|
|
|
|
# Compile kernel if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb ]]; then
|
|
|
|
KDEB_CHANGELOG_DIST=$RELEASE
|
|
[[ -n $KERNELSOURCE ]] && [[ "${REPOSITORY_INSTALL}" != *kernel* ]] && compile_kernel
|
|
|
|
fi
|
|
|
|
# Compile armbian-config if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/armbian-config_${REVISION}_all.deb ]]; then
|
|
|
|
[[ "${REPOSITORY_INSTALL}" != *armbian-config* ]] && compile_armbian-config
|
|
|
|
fi
|
|
|
|
# Compile armbian-zsh if packed .deb does not exist or use the one from repository
|
|
if [[ ! -f ${DEB_STORAGE}/armbian-zsh_${REVISION}_all.deb ]]; then
|
|
|
|
[[ "${REPOSITORY_INSTALL}" != *armbian-zsh* ]] && compile_armbian-zsh
|
|
|
|
fi
|
|
|
|
# Compile armbian-firmware if packed .deb does not exist or use the one from repository
|
|
if ! ls "${DEB_STORAGE}/armbian-firmware_${REVISION}_all.deb" 1> /dev/null 2>&1 || ! ls "${DEB_STORAGE}/armbian-firmware-full_${REVISION}_all.deb" 1> /dev/null 2>&1; then
|
|
|
|
if [[ "${REPOSITORY_INSTALL}" != *armbian-firmware* ]]; then
|
|
[[ "${INSTALL_ARMBIAN_FIRMWARE:-yes}" == "yes" ]] && { # Build firmware by default.
|
|
FULL=""
|
|
REPLACE="-full"
|
|
compile_firmware
|
|
FULL="-full"
|
|
REPLACE=""
|
|
compile_firmware
|
|
}
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
overlayfs_wrapper "cleanup"
|
|
|
|
|
|
|
|
|
|
# create board support package
|
|
[[ -n $RELEASE && ! -f ${DEB_STORAGE}/$RELEASE/${BSP_CLI_PACKAGE_FULLNAME}.deb ]] && create_board_package
|
|
|
|
|
|
|
|
# create desktop package
|
|
[[ -n $RELEASE && $DESKTOP_ENVIRONMENT && ! -f ${DEB_STORAGE}/$RELEASE/${CHOSEN_DESKTOP}_${REVISION}_all.deb ]] && create_desktop_package
|
|
[[ -n $RELEASE && $DESKTOP_ENVIRONMENT && ! -f ${DEB_STORAGE}/${RELEASE}/${BSP_DESKTOP_PACKAGE_FULLNAME}.deb ]] && create_bsp_desktop_package
|
|
|
|
|
|
|
|
# build additional packages
|
|
[[ $EXTERNAL_NEW == compile ]] && chroot_build_packages
|
|
|
|
if [[ $KERNEL_ONLY != yes ]]; then
|
|
|
|
[[ $BSP_BUILD != yes ]] && debootstrap_ng
|
|
|
|
else
|
|
|
|
display_alert "Kernel build done" "@host" "info"
|
|
display_alert "Target directory" "${DEB_STORAGE}/" "info"
|
|
display_alert "File name" "${CHOSEN_KERNEL}_${REVISION}_${ARCH}.deb" "info"
|
|
|
|
fi
|
|
|
|
call_extension_method "run_after_build" << 'RUN_AFTER_BUILD'
|
|
*hook for function to run after build, i.e. to change owner of `$SRC`*
|
|
Really one of the last hooks ever called. The build has ended. Congratulations.
|
|
- *NOTE:* this will run only if there were no errors during build process.
|
|
RUN_AFTER_BUILD
|
|
|
|
|
|
end=$(date +%s)
|
|
runtime=$(((end-start)/60))
|
|
display_alert "Runtime" "$runtime min" "info"
|
|
|
|
# Make it easy to repeat build by displaying build options used
|
|
[ "$(systemd-detect-virt)" == 'docker' ] && BUILD_CONFIG='docker'
|
|
display_alert "Repeat Build Options" "./compile.sh ${BUILD_CONFIG} BOARD=${BOARD} BRANCH=${BRANCH} \
|
|
$([[ -n $RELEASE ]] && echo "RELEASE=${RELEASE} ")\
|
|
$([[ -n $BUILD_MINIMAL ]] && echo "BUILD_MINIMAL=${BUILD_MINIMAL} ")\
|
|
$([[ -n $BUILD_DESKTOP ]] && echo "BUILD_DESKTOP=${BUILD_DESKTOP} ")\
|
|
$([[ -n $KERNEL_ONLY ]] && echo "KERNEL_ONLY=${KERNEL_ONLY} ")\
|
|
$([[ -n $KERNEL_CONFIGURE ]] && echo "KERNEL_CONFIGURE=${KERNEL_CONFIGURE} ")\
|
|
$([[ -n $DESKTOP_ENVIRONMENT ]] && echo "DESKTOP_ENVIRONMENT=${DESKTOP_ENVIRONMENT} ")\
|
|
$([[ -n $DESKTOP_ENVIRONMENT_CONFIG_NAME ]] && echo "DESKTOP_ENVIRONMENT_CONFIG_NAME=${DESKTOP_ENVIRONMENT_CONFIG_NAME} ")\
|
|
$([[ -n $DESKTOP_APPGROUPS_SELECTED ]] && echo "DESKTOP_APPGROUPS_SELECTED=\"${DESKTOP_APPGROUPS_SELECTED}\" ")\
|
|
$([[ -n $DESKTOP_APT_FLAGS_SELECTED ]] && echo "DESKTOP_APT_FLAGS_SELECTED=\"${DESKTOP_APT_FLAGS_SELECTED}\" ")\
|
|
$([[ -n $COMPRESS_OUTPUTIMAGE ]] && echo "COMPRESS_OUTPUTIMAGE=${COMPRESS_OUTPUTIMAGE} ")\
|
|
" "ext"
|
|
|
|
} # end of do_default()
|
|
|
|
if [[ -z $1 ]]; then
|
|
do_default
|
|
else
|
|
eval "$@"
|
|
fi
|