From eb2637d0a0f5a8c0edddd9ecb32bc9757fcefb19 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Thu, 21 May 2026 14:28:52 +0200 Subject: [PATCH 1/2] feat: dynamically solve all requirements.mod files Signed-off-by: Eike Waldt On-behalf-of: SAP --- builder/image.requirements | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/builder/image.requirements b/builder/image.requirements index 53d79b7..d1d7974 100755 --- a/builder/image.requirements +++ b/builder/image.requirements @@ -1,21 +1,33 @@ #!/usr/bin/env bash -set -eufo pipefail +set -euo pipefail -uefi=false -secureboot=false -tpm2=false +features_dir="${FEATURES_DIR:-/builder/features}" +# Scan all requirements.mod files to find all possible modifiers and set defaults +for req_mod in "$features_dir"/*/requirements.mod; do + [ -e "$req_mod" ] || continue + while IFS='=' read -r key _; do + [[ $key =~ ^[a-z_][a-z0-9_]*$ ]] && declare "$key=false" + done < <(grep -E '^[a-z_][a-z0-9_]*=' "$req_mod") +done + +# Source requirements.mod files for selected features to override defaults IFS=',' read -r -a features <<< "$BUILDER_FEATURES" for feature in "${features[@]}"; do - if [ -e "/builder/features/$feature/requirements.mod" ]; then - source "/builder/features/$feature/requirements.mod" - fi + [ -z "$feature" ] && continue + req_file="$features_dir/$feature/requirements.mod" + # shellcheck source=/dev/null + [ -e "$req_file" ] && source "$req_file" done -cat > "$2" << EOF -arch=$BUILDER_ARCH -uefi=$uefi -secureboot=$secureboot -tpm2=$tpm2 -EOF +# Output all modifiers +{ + echo "arch=$BUILDER_ARCH" + for req_mod in "$features_dir"/*/requirements.mod; do + [ -e "$req_mod" ] || continue + while IFS='=' read -r key _; do + [[ $key =~ ^[a-z_][a-z0-9_]*$ ]] && echo "$key=${!key}" + done < <(grep -E '^[a-z_][a-z0-9_]*=' "$req_mod") + done | sort -u +} > "$2" From 17b7dc323189b17aa8293e7e049ee7f211b20809 Mon Sep 17 00:00:00 2001 From: Eike Waldt Date: Mon, 8 Jun 2026 10:09:37 +0200 Subject: [PATCH 2/2] feat: dynamically solve all requirements.mod files Use requirements_keys array to discover existing modifiers. Signed-off-by: Eike Waldt On-behalf-of: SAP --- builder/image.requirements | 42 +++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/builder/image.requirements b/builder/image.requirements index d1d7974..78f599a 100755 --- a/builder/image.requirements +++ b/builder/image.requirements @@ -4,30 +4,38 @@ set -euo pipefail features_dir="${FEATURES_DIR:-/builder/features}" -# Scan all requirements.mod files to find all possible modifiers and set defaults +# Built-in keys. requirements.mod scripts may extend this array via: +# requirements_keys+=(mykey) +# mykey=true +requirements_keys=(arch) +export arch="$BUILDER_ARCH" + +# Pass 1: source every requirements.mod to discover all keys any feature +# may contribute, then reset discovered keys to "false" as defaults. +# This ensures output keys are stable regardless of which features are selected. for req_mod in "$features_dir"/*/requirements.mod; do [ -e "$req_mod" ] || continue - while IFS='=' read -r key _; do - [[ $key =~ ^[a-z_][a-z0-9_]*$ ]] && declare "$key=false" - done < <(grep -E '^[a-z_][a-z0-9_]*=' "$req_mod") + # shellcheck source=/dev/null + source "$req_mod" +done + +# Reset all discovered (non-arch) keys to false as defaults for pass 2. +for key in "${requirements_keys[@]}"; do + [ "$key" = arch ] && continue + declare "$key=false" done -# Source requirements.mod files for selected features to override defaults +# Pass 2: source only the selected features' requirements.mod files, +# allowing them to override the defaults set above. IFS=',' read -r -a features <<< "$BUILDER_FEATURES" for feature in "${features[@]}"; do [ -z "$feature" ] && continue - req_file="$features_dir/$feature/requirements.mod" + req_mod="$features_dir/$feature/requirements.mod" # shellcheck source=/dev/null - [ -e "$req_file" ] && source "$req_file" + [ -e "$req_mod" ] && source "$req_mod" done -# Output all modifiers -{ - echo "arch=$BUILDER_ARCH" - for req_mod in "$features_dir"/*/requirements.mod; do - [ -e "$req_mod" ] || continue - while IFS='=' read -r key _; do - [[ $key =~ ^[a-z_][a-z0-9_]*$ ]] && echo "$key=${!key}" - done < <(grep -E '^[a-z_][a-z0-9_]*=' "$req_mod") - done | sort -u -} > "$2" +# Emit each key alphabetically (duplicates silently dropped by sort -u). +for key in "${requirements_keys[@]}"; do + printf '%s=%s\n' "$key" "${!key}" +done | sort -u -t= -k1,1 > "$2"