build/lib/functions/host/mountpoints.sh

98 lines
6.6 KiB
Bash

#!/usr/bin/env bash
#
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (c) 2013-2023 Igor Pecovnik, igor@armbian.com
#
# This file is a part of the Armbian Build Framework
# https://github.com/armbian/build/
function prepare_armbian_mountpoints_description_dict() {
# array for the generic armbian 'volumes' and their paths.
# bash dicts do NOT keep their insertion order, instead "hash order", which is a bit better than random for our purposes.
# keep an array with the correct order, unfortunately
declare -g -a ARMBIAN_MOUNTPOINTS_ARRAY=(
".tmp"
"output" "output/images" "output/debs" "output/logs"
"cache"
"cache/git-bare"
"cache/git-bundles"
"cache/toolchain"
"cache/aptcache"
"cache/rootfs"
"cache/initrd"
"cache/sources"
"cache/sources/linux-kernel-worktree"
"cache/sources/u-boot-worktree"
"cache/ccache"
"cache/patch"
)
declare -A -g ARMBIAN_MOUNTPOINTS_DESC_DICT=(
[".tmp"]="docker_kind_linux=anonymous docker_kind_darwin=anonymous" # tmpfs, discard, anonymous; whatever you wanna call it. It just needs to be 100% local to the container, and there's very little value in being able to look at it from the host.
["output"]="docker_kind_linux=bind docker_kind_darwin=bind" # catch-all output. specific subdirs are mounted below. it's a bind mount by default on both Linux and Darwin.
["output/images"]="docker_kind_linux=bind docker_kind_darwin=bind" # 99% of users want this as the result of their build, no matter if it's slow or not. bind on both.
["output/debs"]="docker_kind_linux=bind docker_kind_darwin=bind" # generated output .deb files. most people are interested in this, to update kernels or dtbs after initial build. bind on both Linux and Darwin.
# output/debs-beta ... ! not needed cos "output" is fully mapped above.
["output/logs"]="docker_kind_linux=bind docker_kind_darwin=bind" # log files produced. 100% of users want this. Bind on both Linux and Darwin. Is used to integrate launcher and actual-build logs, so must exist and work otherwise confusion ensues.
["cache"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # catch-all cache, could be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/git-bare"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # Git bare repos (kernel/u-boot). On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/git-bundles"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # Downloads of git bundles, can be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/toolchain"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # toolchain cache, can be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/aptcache"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # .deb apt cache, replaces apt-cacher-ng. Can be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/rootfs"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # rootfs .tar.zst cache, can be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/initrd"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # initrd.img cache, can be bind-mounted or a volume. On Darwin it's too slow to bind-mount, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/sources"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # operating directory. many things are cloned in here, and some are even built inside. needs to be local to the container, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/sources/linux-kernel-worktree"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # working tree for kernel builds. huge. contains both sources and the built object files. needs to be local to the container, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/sources/u-boot-worktree"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # working tree for u-boot. large. contains both sources and the built object files. needs to be local to the container, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/ccache"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # ccache object store. limited to 5gb by default. needs to be local to the container, so it's a volume by default. On Linux, it's a bind-mount by default.
["cache/patch"]="docker_kind_linux=bind docker_kind_darwin=namedvolume" # auto-generated patches (for kernel drivers, etc); large patches so keep it as local as possible.
)
# These, if found, will be removed on `dockerpurge` and other cleanups.
# They "used to be" used by the build system, but no longer.
declare -g -a ARMBIAN_MOUNTPOINTS_DEPRECATED=(
"cache/gitballs"
"cache/sources/kernel"
"cache/sources/linux-kernel"
"cache/sources/u-boot"
)
}
function loop_over_armbian_mountpoints() {
prepare_armbian_mountpoints_description_dict
# loop over all mountpoints and call the function passed as first argument
: "${1:?loop_over_mountpoints needs a function as first argument}"
local func="$1"
shift
local mountpoint
for mountpoint in "${ARMBIAN_MOUNTPOINTS_ARRAY[@]}"; do
# call func passing the key and the values as arguments
local values="${ARMBIAN_MOUNTPOINTS_DESC_DICT[$mountpoint]}"
eval "$values"
# This is contrived. Would be easier to just eval (and use Linux/Darwin instead of linux/darwin)
declare docker_kind="unknown"
case "${DOCKER_ARMBIAN_HOST_OS_UNAME}" in
Linux)
# shellcheck disable=SC2154 # defined during loop_over_armbian_mountpoints
docker_kind="${docker_kind_linux}"
;;
Darwin)
# shellcheck disable=SC2154 # defined during loop_over_armbian_mountpoints
docker_kind="${docker_kind_darwin}"
;;
*)
display_alert "Unsupported host OS" "${DOCKER_ARMBIAN_HOST_OS_UNAME} - cant map mountpoint to Docker volume" "warn"
;;
esac
# volume_id is the mountpoint with all slashes replaced with dashes
local volume_id="${mountpoint//\//-}"
# shellcheck disable=SC2086
eval "$values docker_kind=$docker_kind $func '$mountpoint'"
done
}