#!/usr/bin/env bash grab_version() { local ver=() ver[0]=$(grep "^VERSION" "${1}"/Makefile | head -1 | awk '{print $(NF)}' | grep -oE '^[[:digit:]]+') ver[1]=$(grep "^PATCHLEVEL" "${1}"/Makefile | head -1 | awk '{print $(NF)}' | grep -oE '^[[:digit:]]+') ver[2]=$(grep "^SUBLEVEL" "${1}"/Makefile | head -1 | awk '{print $(NF)}' | grep -oE '^[[:digit:]]+') ver[3]=$(grep "^EXTRAVERSION" "${1}"/Makefile | head -1 | awk '{print $(NF)}' | grep -oE '^-rc[[:digit:]]+') echo "${ver[0]:-0}${ver[1]:+.${ver[1]}}${ver[2]:+.${ver[2]}}${ver[3]}" } # find_toolchain # # returns path to toolchain that satisfies # find_toolchain() { [[ "${SKIP_EXTERNAL_TOOLCHAINS}" == "yes" ]] && { echo "/usr/bin" return } local compiler=$1 local expression=$2 local dist=10 local toolchain="" # extract target major.minor version from expression local target_ver target_ver=$(grep -oE "[[:digit:]]+\.[[:digit:]]" <<< "$expression") for dir in "${SRC}"/cache/toolchain/*/; do # check if is a toolchain for current $ARCH [[ ! -f ${dir}bin/${compiler}gcc ]] && continue # get toolchain major.minor version local gcc_ver gcc_ver=$("${dir}bin/${compiler}gcc" -dumpversion | grep -oE "^[[:digit:]]+\.[[:digit:]]") # check if toolchain version satisfies requirement awk "BEGIN{exit ! ($gcc_ver $expression)}" > /dev/null || continue # check if found version is the closest to target # may need different logic here with more than 1 digit minor version numbers # numbers: 3.9 > 3.10; versions: 3.9 < 3.10 # dpkg --compare-versions can be used here if operators are changed local d d=$(awk '{x = $1 - $2}{printf "%.1f\n", (x > 0) ? x : -x}' <<< "$target_ver $gcc_ver") if awk "BEGIN{exit ! ($d < $dist)}" > /dev/null; then dist=$d toolchain=${dir}bin fi done echo "$toolchain" # logging a stack of used compilers. if [[ -f "${DEST}"/${LOG_SUBPATH}/compiler.log ]]; then if ! grep -q "$toolchain" "${DEST}"/${LOG_SUBPATH}/compiler.log; then echo "$toolchain" >> "${DEST}"/${LOG_SUBPATH}/compiler.log fi else echo "$toolchain" >> "${DEST}"/${LOG_SUBPATH}/compiler.log fi } # overlayfs_wrapper # # : wrap|cleanup # : path to source directory # : suffix for merged directory to help locating it in /tmp # return value: new directory # # Assumptions/notes: # - Ubuntu Xenial host # - /tmp is mounted as tmpfs # - there is enough space on /tmp # - UB if running multiple compilation tasks in parallel # - should not be used with CREATE_PATCHES=yes # overlayfs_wrapper() { local operation="$1" if [[ $operation == wrap ]]; then local srcdir="$2" local description="$3" mkdir -p /tmp/overlay_components/ /tmp/armbian_build/ local tempdir workdir mergeddir tempdir=$(mktemp -d --tmpdir="/tmp/overlay_components/") workdir=$(mktemp -d --tmpdir="/tmp/overlay_components/") mergeddir=$(mktemp -d --suffix="_$description" --tmpdir="/tmp/armbian_build/") mount -t overlay overlay -o lowerdir="$srcdir",upperdir="$tempdir",workdir="$workdir" "$mergeddir" # this is executed in a subshell, so use temp files to pass extra data outside echo "$tempdir" >> /tmp/.overlayfs_wrapper_cleanup echo "$mergeddir" >> /tmp/.overlayfs_wrapper_umount echo "$mergeddir" >> /tmp/.overlayfs_wrapper_cleanup echo "$mergeddir" return fi if [[ $operation == cleanup ]]; then if [[ -f /tmp/.overlayfs_wrapper_umount ]]; then for dir in $(< /tmp/.overlayfs_wrapper_umount); do [[ $dir == /tmp/* ]] && umount -l "$dir" > /dev/null 2>&1 done fi if [[ -f /tmp/.overlayfs_wrapper_cleanup ]]; then for dir in $(< /tmp/.overlayfs_wrapper_cleanup); do [[ $dir == /tmp/* ]] && rm -rf "$dir" done fi rm -f /tmp/.overlayfs_wrapper_umount /tmp/.overlayfs_wrapper_cleanup fi }