mirror of
https://github.com/armbian/build.git
synced 2025-08-10 21:26:59 +02:00
* Add shebangs for shellcheck See #AR-1406 * Add shebangs for shellcheck Also for `extensions` scripts
103 lines
3.8 KiB
Bash
103 lines
3.8 KiB
Bash
#!/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 <compiler_prefix> <expression>
|
|
#
|
|
# returns path to toolchain that satisfies <expression>
|
|
#
|
|
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 <operation> <workdir> <description>
|
|
#
|
|
# <operation>: wrap|cleanup
|
|
# <workdir>: path to source directory
|
|
# <description>: 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
|
|
}
|