* Update buildroot-patches for 2020.11-rc1 buildroot * Update buildroot to 2020.11-rc1 Signed-off-by: Stefan Agner <stefan@agner.ch> * Don't rely on sfdisk --list-free output The --list-free (-F) argument does not allow machine readable mode. And it seems that the output format changes over time (different spacing, using size postfixes instead of raw blocks). Use sfdisk json output and calculate free partition space ourselfs. This works for 2.35 and 2.36 and is more robust since we rely on output which is meant for scripts to parse. * Migrate defconfigs for Buildroot 2020.11-rc1 In particular, rename BR2_TARGET_UBOOT_BOOT_SCRIPT(_SOURCE) to BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT(_SOURCE). * Rebase/remove systemd patches for systemd 246 * Drop apparmor/libapparmor from buildroot-external * hassos-persists: use /run as directory for lockfiles The U-Boot tools use /var/lock by default which is not created any more by systemd by default (it is under tmpfiles legacy.conf, which we no longer install). * Disable systemd-update-done.service The service is not suited for pure read-only systems. In particular the service needs to be able to write a file in /etc and /var. Remove the service. Note: This is a static service and cannot be removed using systemd-preset. * Disable apparmor.service for now The service loads all default profiles. Some might actually cause problems. E.g. the profile for ping seems not to match our setup for /etc/resolv.conf: [85503.634653] audit: type=1400 audit(1605286002.684:236): apparmor="DENIED" operation="open" profile="ping" name="/run/resolv.conf" pid=27585 comm="ping" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
254 lines
8.4 KiB
Bash
Executable File
254 lines
8.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
# This script must be able to run with bash-3.1, so it can't use
|
|
# associative arrays. Instead, it emulates them using 'eval'. It
|
|
# can however use indexed arrays, supported since at least bash-3.0.
|
|
|
|
# The names of the br2-external trees, once validated.
|
|
declare -a BR2_EXT_NAMES
|
|
|
|
# URL to manual for help in converting old br2-external trees.
|
|
# Escape '#' so that make does not consider it a comment.
|
|
MANUAL_URL='https://buildroot.org/manual.html\#br2-external-converting'
|
|
|
|
main() {
|
|
local OPT OPTARG
|
|
local br2_ext outputdir
|
|
|
|
while getopts :d: OPT; do
|
|
case "${OPT}" in
|
|
d) outputdir="${OPTARG}";;
|
|
:) error "option '%s' expects a mandatory argument\n" "${OPTARG}";;
|
|
\?) error "unknown option '%s'\n" "${OPTARG}";;
|
|
esac
|
|
done
|
|
# Forget options; keep only positional args
|
|
shift $((OPTIND-1))
|
|
|
|
if [ -z "${outputdir}" ]; then
|
|
error "no output directory specified (-d)\n"
|
|
fi
|
|
|
|
# Trap any unexpected error to generate a meaningful error message
|
|
trap "error 'unexpected error while generating ${ofile}\n'" ERR
|
|
|
|
mkdir -p "${outputdir}"
|
|
do_validate "${outputdir}" ${@//:/ }
|
|
do_mk "${outputdir}"
|
|
do_kconfig "${outputdir}"
|
|
}
|
|
|
|
# Validates the br2-external trees passed as arguments. Makes each of
|
|
# them canonical and store them in the global arrays BR2_EXT_NAMES
|
|
# and BR2_EXT_PATHS.
|
|
#
|
|
# Note: since this script is always first called from Makefile context
|
|
# to generate the Makefile fragment before it is called to generate the
|
|
# Kconfig snippet, we're sure that any error in do_validate will be
|
|
# interpreted in Makefile context. Going up to generating the Kconfig
|
|
# snippet means that there were no error.
|
|
#
|
|
do_validate() {
|
|
local outputdir="${1}"
|
|
local br2_ext
|
|
shift
|
|
|
|
if [ ${#} -eq 0 ]; then
|
|
# No br2-external tree is valid
|
|
return
|
|
fi
|
|
|
|
for br2_ext in "${@}"; do
|
|
do_validate_one "${br2_ext}"
|
|
done >"${outputdir}/.br2-external.mk"
|
|
}
|
|
|
|
do_validate_one() {
|
|
local br2_ext="${1}"
|
|
local br2_name br2_desc n d
|
|
|
|
if [ ! -d "${br2_ext}" ]; then
|
|
error "'%s': no such file or directory\n" "${br2_ext}"
|
|
fi
|
|
if [ ! -r "${br2_ext}" -o ! -x "${br2_ext}" ]; then
|
|
error "'%s': permission denied\n" "${br2_ext}"
|
|
fi
|
|
if [ ! -f "${br2_ext}/external.desc" ]; then
|
|
error "'%s': does not have an 'external.desc'. See %s\n" \
|
|
"${br2_ext}" "${MANUAL_URL}"
|
|
fi
|
|
br2_name="$(sed -r -e '/^name: +(.*)$/!d; s//\1/' "${br2_ext}/external.desc")"
|
|
if [ -z "${br2_name}" ]; then
|
|
error "'%s/external.desc': does not define the name\n" "${br2_ext}"
|
|
fi
|
|
# Only ASCII chars in [A-Za-z0-9_] are permitted
|
|
n="$(sed -r -e 's/[A-Za-z0-9_]//g' <<<"${br2_name}" )"
|
|
if [ -n "${n}" ]; then
|
|
# Escape '$' so that it gets printed
|
|
error "'%s': name '%s' contains invalid chars: '%s'\n" \
|
|
"${br2_ext}" "${br2_name//\$/\$\$}" "${n//\$/\$\$}"
|
|
fi
|
|
eval d="\"\${BR2_EXT_PATHS_${br2_name}}\""
|
|
if [ -n "${d}" ]; then
|
|
error "'%s': name '%s' is already used in '%s'\n" \
|
|
"${br2_ext}" "${br2_name}" "${d}"
|
|
fi
|
|
br2_desc="$(sed -r -e '/^desc: +(.*)$/!d; s//\1/' "${br2_ext}/external.desc")"
|
|
if [ ! -f "${br2_ext}/external.mk" ]; then
|
|
error "'%s/external.mk': no such file or directory\n" "${br2_ext}"
|
|
fi
|
|
if [ ! -f "${br2_ext}/Config.in" ]; then
|
|
error "'%s/Config.in': no such file or directory\n" "${br2_ext}"
|
|
fi
|
|
|
|
# Register this br2-external tree, use an absolute canonical path
|
|
br2_ext="$( cd "${br2_ext}"; pwd )"
|
|
BR2_EXT_NAMES+=( "${br2_name}" )
|
|
eval BR2_EXT_PATHS_${br2_name}="\"\${br2_ext}\""
|
|
eval BR2_EXT_DESCS_${br2_name}="\"\${br2_desc:-\${br2_name}}\""
|
|
}
|
|
|
|
# Generate the .mk snippet that defines makefile variables
|
|
# for the br2-external tree
|
|
do_mk() {
|
|
local outputdir="${1}"
|
|
local br2_name br2_desc br2_ext
|
|
|
|
{
|
|
printf '#\n# Automatically generated file; DO NOT EDIT.\n#\n'
|
|
printf '\n'
|
|
|
|
printf 'BR2_EXTERNAL ?='
|
|
for br2_name in "${BR2_EXT_NAMES[@]}"; do
|
|
eval br2_ext="\"\${BR2_EXT_PATHS_${br2_name}}\""
|
|
printf ' %s' "${br2_ext}"
|
|
done
|
|
printf '\n'
|
|
|
|
printf 'BR2_EXTERNAL_NAMES = \n'
|
|
printf 'BR2_EXTERNAL_DIRS = \n'
|
|
printf 'BR2_EXTERNAL_MKS = \n'
|
|
|
|
if [ ${#BR2_EXT_NAMES[@]} -eq 0 ]; then
|
|
printf '\n'
|
|
printf '# No br2-external tree defined.\n'
|
|
return
|
|
fi
|
|
|
|
for br2_name in "${BR2_EXT_NAMES[@]}"; do
|
|
eval br2_desc="\"\${BR2_EXT_DESCS_${br2_name}}\""
|
|
eval br2_ext="\"\${BR2_EXT_PATHS_${br2_name}}\""
|
|
printf '\n'
|
|
printf 'BR2_EXTERNAL_NAMES += %s\n' "${br2_name}"
|
|
printf 'BR2_EXTERNAL_DIRS += %s\n' "${br2_ext}"
|
|
printf 'BR2_EXTERNAL_MKS += %s/external.mk\n' "${br2_ext}"
|
|
printf 'export BR2_EXTERNAL_%s_PATH = %s\n' "${br2_name}" "${br2_ext}"
|
|
printf 'export BR2_EXTERNAL_%s_DESC = %s\n' "${br2_name}" "${br2_desc}"
|
|
done
|
|
} >"${outputdir}/.br2-external.mk"
|
|
}
|
|
|
|
# Generate the kconfig snippets for the br2-external tree.
|
|
do_kconfig() {
|
|
local outputdir="${1}"
|
|
local br2_name br2_desc br2_ext br2
|
|
local -a items
|
|
|
|
items=(
|
|
paths
|
|
menus
|
|
toolchains
|
|
jpeg
|
|
openssl
|
|
skeleton
|
|
init
|
|
)
|
|
|
|
for br2 in "${items[@]}"; do
|
|
{
|
|
printf '#\n# Automatically generated file; DO NOT EDIT.\n#\n'
|
|
printf '\n'
|
|
if [ ${#BR2_EXT_NAMES[@]} -eq 0 ]; then
|
|
printf '# No br2-external tree defined.\n'
|
|
fi
|
|
} >"${outputdir}/.br2-external.in.${br2}"
|
|
done
|
|
if [ ${#BR2_EXT_NAMES[@]} -eq 0 ]; then
|
|
return
|
|
fi
|
|
|
|
printf 'menu "External options"\n\n' >>"${outputdir}/.br2-external.in.menus"
|
|
|
|
for br2_name in "${BR2_EXT_NAMES[@]}"; do
|
|
eval br2_desc="\"\${BR2_EXT_DESCS_${br2_name}}\""
|
|
eval br2_ext="\"\${BR2_EXT_PATHS_${br2_name}}\""
|
|
|
|
{
|
|
printf 'config BR2_EXTERNAL_%s_PATH\n' "${br2_name}"
|
|
printf '\tstring\n'
|
|
printf '\tdefault "%s"\n' "${br2_ext}"
|
|
printf '\n'
|
|
} >>"${outputdir}/.br2-external.in.paths"
|
|
|
|
{
|
|
if [ ${#BR2_EXT_NAMES[@]} -gt 1 ]; then
|
|
printf 'menu "%s"\n' "${br2_desc}"
|
|
fi
|
|
printf 'comment "%s (in %s)"\n' "${br2_desc}" "${br2_ext}"
|
|
printf 'source "%s/Config.in"\n' "${br2_ext}"
|
|
if [ ${#BR2_EXT_NAMES[@]} -gt 1 ]; then
|
|
printf 'endmenu # %s\n' "${br2_name}"
|
|
fi
|
|
printf '\n'
|
|
} >>"${outputdir}/.br2-external.in.menus"
|
|
|
|
if [ -f "${br2_ext}/provides/toolchains.in" ]; then
|
|
printf 'comment "Toolchains from: %s"\n' "${br2_desc}"
|
|
printf 'source "%s/provides/toolchains.in"\n' "${br2_ext}"
|
|
printf '\n'
|
|
else
|
|
printf '# No toolchain from: %s\n\n' "${br2_desc}"
|
|
fi >>"${outputdir}/.br2-external.in.toolchains"
|
|
|
|
if [ -f "${br2_ext}/provides/jpeg.in" ]; then
|
|
printf 'comment "jpeg from: %s"\n' "${br2_desc}"
|
|
printf 'source "%s/provides/jpeg.in"\n' "${br2_ext}"
|
|
printf '\n'
|
|
else
|
|
printf '# No jpeg from: %s\n\n' "${br2_desc}"
|
|
fi >>"${outputdir}/.br2-external.in.jpeg"
|
|
|
|
if [ -f "${br2_ext}/provides/openssl.in" ]; then
|
|
printf 'comment "openssl from: %s"\n' "${br2_desc}"
|
|
printf 'source "%s/provides/openssl.in"\n' "${br2_ext}"
|
|
printf '\n'
|
|
else
|
|
printf '# No openssl from: %s\n\n' "${br2_desc}"
|
|
fi >>"${outputdir}/.br2-external.in.openssl"
|
|
|
|
if [ -f "${br2_ext}/provides/skeleton.in" ]; then
|
|
printf 'comment "skeleton from: %s"\n' "${br2_desc}"
|
|
printf 'source "%s/provides/skeleton.in"\n' "${br2_ext}"
|
|
printf '\n'
|
|
else
|
|
printf '# No skeleton from: %s\n\n' "${br2_desc}"
|
|
fi >>"${outputdir}/.br2-external.in.skeleton"
|
|
|
|
if [ -f "${br2_ext}/provides/init.in" ]; then
|
|
printf 'comment "init from: %s"\n' "${br2_desc}"
|
|
printf 'source "%s/provides/init.in"\n' "${br2_ext}"
|
|
printf '\n'
|
|
else
|
|
printf '# No init from: %s\n\n' "${br2_desc}"
|
|
fi >>"${outputdir}/.br2-external.in.init"
|
|
done
|
|
|
|
printf 'endmenu\n' >>"${outputdir}/.br2-external.in.menus"
|
|
}
|
|
|
|
error() { local fmt="${1}"; shift; printf "BR2_EXTERNAL_ERROR = ${fmt}" "${@}"; exit 1; }
|
|
|
|
my_name="${0##*/}"
|
|
main "${@}"
|