From: Scott Weaver <scwea...@redhat.com> redhat/Makefile: automate committing config mismatches
This commit introduces the `dist-configs-commit-mismatches` make target to resolve config mismatches. A new option (-M) was added to process_configs.sh that iterates through each config mismatch for each arch-variant and creates a specific config file in the corresponding pending directory. Note: This uses the default output from `make olddefconfig` and does not include any post-processing to consolidate configs. It will always create per-arch-variant config files even if a generic config could be used. Signed-off-by: Scott Weaver <scwea...@redhat.com> diff --git a/redhat/Makefile b/redhat/Makefile index blahblah..blahblah 100644 --- a/redhat/Makefile +++ b/redhat/Makefile @@ -596,6 +596,10 @@ dist-configs-commit: dist-configs-prep +@cd $(REDHAT)/configs; ./generate_all_configs.sh 1;\ ./process_configs.sh -z "$(SPECRPMVERSION)" "$(FLAVOR)" +dist-configs-commit-mismatches: dist-configs-prep + +@cd $(REDHAT)/configs; ./generate_all_configs.sh 1;\ + ./process_configs.sh -M "$(SPECRPMVERSION)" "$(FLAVOR)" + dist-configs: ##configuration Create RHEL config files in redhat/config/. dist-configs: dist-configs-prep +@cd $(REDHAT)/configs; ./generate_all_configs.sh 1;\ diff --git a/redhat/configs/process_configs.sh b/redhat/configs/process_configs.sh index blahblah..blahblah 100755 --- a/redhat/configs/process_configs.sh +++ b/redhat/configs/process_configs.sh @@ -1,13 +1,15 @@ #!/bin/bash # -# This script takes the merged config files and processes them through oldconfig -# and listnewconfig +# This script takes the merged config files and processes them through olddefconfig +# and listnewconfig to ensure kernel configurations are valid and complete. # # Globally disable suggestion of appending '|| exit' or '|| return' to cd/pushd/popd commands # shellcheck disable=SC2164 +# Exit if this is a test environment test -n "$RHTEST" && exit 0 +# Display usage information and available command line options usage() { # alphabetical order please @@ -15,6 +17,8 @@ usage() echo " -a: report all errors, equivalent to [-c -n -w -i]" echo " -c: error on mismatched config options" echo " -i: ignore any errors, but print them" + echo " -m: specify make options (e.g., -m CC=clang, -m LLVM=1)" + echo " -M: commit mismatched configs to pending directory" echo " -n: error on unset config options" echo " -t: test run, do not overwrite original config" echo " -w: error on misconfigured config options" @@ -33,6 +37,9 @@ die() exit 1 } +# Determine the correct cross-compiler prefix based on compiler type +# For clang builds, return the architecture directly +# For GCC builds, use the dummy-tools directory get_cross_compile() { arch=$1 @@ -43,7 +50,8 @@ get_cross_compile() fi } -# stupid function to find top of tree to do kernel make configs +# Find the top-level kernel source directory +# (identified by MAINTAINERS file and drivers directory) switch_to_toplevel() { path="$(pwd)" @@ -60,11 +68,117 @@ switch_to_toplevel() echo "$path" } +# Determine the correct config path based on architecture and variant +# This function maps arch/variant combinations to the proper pending directory +determine_config_path() +{ + local arch="$1" + local variant="$2" + local config_path="" + + # Identify the variant - they have their own top-level directories + if [[ "$variant" == *"rt"* ]]; then + # RT variant - goes under rt/ + if [[ "$variant" == *"debug"* ]]; then + config_path="rt/debug" + else + config_path="rt/generic" + fi + elif [[ "$variant" == *"automotive"* ]]; then + # Automotive variant - goes under automotive/ + if [[ "$variant" == *"debug"* ]]; then + config_path="automotive/debug" + else + config_path="automotive/generic" + fi + else + # Stock kernel - goes under top-level debug or generic + if [[ "$variant" == *"debug"* ]]; then + config_path="debug" + else + config_path="generic" + fi + fi + + # Add architecture-specific subdirectories + case "$arch" in + arm64) + config_path="$config_path/arm/aarch64" + ;; + powerpc) + config_path="$config_path/powerpc" + ;; + riscv) + config_path="$config_path/riscv/riscv64" + ;; + s390) + if [[ "$variant" == *"zfcpdump"* ]]; then + config_path="$config_path/s390x/zfcpdump" + else + config_path="$config_path/s390x" + fi + ;; + x86_64) + config_path="$config_path/x86" + ;; + *) + # For unknown architectures, don't add arch subdirectory + ;; + esac + + echo "$config_path" +} + +# Parse mismatched configs found during processing and create +# individual CONFIG files in the pending directory for each +parse_mismatched_configs() +{ + local tmpdir=$(mktemp -d) + local count=$1 # Counter for unique filenames + local arch=$2 + local variant=$3 + + # Parse the mismatches file and create individual CONFIG files + tail -n +2 .mismatches"${count}" | while read -r LINE + do + if echo "$LINE" | grep -q "Found # .* is not set, after generation"; then + # Handle case where we found "# CONFIG_FOO is not set" after generation + config_name=$(echo "$LINE" | sed 's/.*Found # \([^ ]*\) is not set, after generation.*/\1/') + if [ -n "$config_name" ]; then + echo "# Mismatch found in $arch $variant config" > "$tmpdir/$config_name" + echo "# $config_name is not set" >> "$tmpdir/$config_name" + fi + elif echo "$LINE" | grep -q "Found .* after generation"; then + # Handle case where we found "CONFIG_FOO=value" after generation + config_name=$(echo "$LINE" | sed 's/.*Found \([^=]*\)=.*/\1/') + config_value=$(echo "$LINE" | sed 's/.*Found [^=]*=\([^ ]*\) after generation.*/\1/') + if [ -n "$config_name" ] && [ -n "$config_value" ]; then + echo "# Mismatch found in $arch $variant config" > "$tmpdir/$config_name" + echo "$config_name=$config_value" >> "$tmpdir/$config_name" + fi + fi + done + + # Copy the CONFIG files to the pending directory + config_path=$(determine_config_path "$arch" "$variant") + mkdir -p "$SCRIPT_DIR/pending-$FLAVOR/$config_path/" + for f in "$tmpdir"/*; do + [[ -e "$f" ]] || break + cp "$f" "$SCRIPT_DIR/pending-$FLAVOR/$config_path/" + done + + rm -rf "$tmpdir" +} + +# Check for configuration mismatches between the original and generated configs checkoptions() { - count=$3 - variant=$4 + cfg=$1 # Original config file + cfgtmp=$2 # Generated config file + count=$3 # Counter for unique filenames + variant=$4 # Config variant (e.g., debug, rt) + # This awk script compares configuration files for mismatches /usr/bin/awk ' /is not set/ { @@ -87,7 +201,7 @@ checkoptions() print "Found "a[1]"="a[2]" after generation, had " a[1]"="configs[a[1]]" in Source tree"; } } - ' "$1" "$2" > .mismatches"${count}" + ' "$cfg" "$cfgtmp" > .mismatches"${count}" checkoptions_error=false if test -s .mismatches"${count}" @@ -107,11 +221,18 @@ checkoptions() ! $checkoptions_error && return sed -i "1s/^/Error: Mismatches found in configuration files for ${arch} ${variant}\n/" .mismatches"${count}" + + # Add mismatched configs to the pending directory + if test -n "$COMMITMISMATCHES"; then + parse_mismatched_configs "$count" "$arch" "$variant" + fi else rm -f .mismatches"${count}" fi } +# Parse the output of 'make listnewconfig' and 'make helpnewconfig' +# to create properly formatted configuration files for new configs parsenewconfigs() { tmpdir=$(mktemp -d) @@ -196,12 +317,32 @@ parsenewconfigs() popd &> /dev/null for f in "$tmpdir"/*; do [[ -e "$f" ]] || break - cp "$f" "$SCRIPT_DIR/pending$FLAVOR/generic/" + cp "$f" "$SCRIPT_DIR/pending-$FLAVOR/generic/" done rm -rf "$tmpdir" } +# Commit any mismatched configs that were saved to the pending directory +commit_mismatched_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd "$(switch_to_toplevel)" &>/dev/null + + # Check if there are any modified or untracked mismatched configs to commit + if git status --porcelain "$SCRIPT_DIR/pending-$FLAVOR/" | grep -q .; then + echo "Committing mismatched configuration files..." + git add "$SCRIPT_DIR/pending-$FLAVOR" + git commit -m "[redhat] AUTOMATIC: Mismatched $FLAVOR configs" + echo "Mismatched configs committed to pending-$FLAVOR directory" + else + echo "No mismatched configs found to commit" + fi + + popd &>/dev/null +} + +# Processes all config files, finds new/unset configs, and commits them function commit_new_configs() { # assume we are in $source_tree/configs, need to get to top level @@ -234,10 +375,12 @@ function commit_new_configs() echo "done" done - git add "$SCRIPT_DIR/pending$FLAVOR" - git commit -m "[redhat] AUTOMATIC: New configs" + # Commit the new configuration files to git + git add "$SCRIPT_DIR/pending-$FLAVOR" + git commit -m "[redhat] AUTOMATIC: New $FLAVOR configs" } +# Process a single configuration file function process_config() { local cfg @@ -307,16 +450,13 @@ function process_config() echo "Processing $cfg complete" } +# Process all configuration files +# Handles parallel processing and error reporting function process_configs() { # assume we are in $source_tree/configs, need to get to top level pushd "$(switch_to_toplevel)" &>/dev/null - # The next line is throwaway code for transition to parallel - # processing. Leaving this line in place is harmless, but it can be - # removed the next time anyone updates this function. - [ -f .mismatches ] && rm -f .mismatches - count=0 for cfg in "$SCRIPT_DIR/${SPECPACKAGE_NAME}${KVERREL}"*.config do @@ -342,7 +482,13 @@ function process_configs() cat .errors* rm .errors* -f fi - if ls .mismatches* 1> /dev/null 2>&1; then + + # Commit any mismatched configs found during processing + if [ $RETURNCODE -eq 0 ] && test -n "$COMMITMISMATCHES"; then + rm .mismatches* -f + commit_mismatched_configs + # Otherwise, display any mismatched configs + elif ls .mismatches* 1> /dev/null 2>&1; then RETURNCODE=1 cat .mismatches* rm .mismatches* -f @@ -360,14 +506,17 @@ TESTRUN="" CHECKWARNINGS="" MAKEOPTS="" CC_IS_CLANG=0 +COMMITMISMATCHES="" RETURNCODE=0 +# Parse command line arguments while [[ $# -gt 0 ]] do key="$1" case $key in -a) + # Enable all error checking options CHECKOPTIONS="x" IGNOREERRORS="x" NEWOPTIONS="x" @@ -396,29 +545,29 @@ do ;; -m) shift + # Handle clang compiler options if [ "$1" = "CC=clang" ] || [ "$1" = "LLVM=1" ]; then CC_IS_CLANG=1 fi MAKEOPTS="$MAKEOPTS $1" ;; + -M) + COMMITMISMATCHES="x" + CHECKOPTIONS="x" # Enable mismatch checking when committing mismatches + ;; *) break;; esac shift done +# Set up script variables based on arguments KVERREL="$(test -n "$1" && echo "-$1" || echo "")" -FLAVOR="$(test -n "$2" && echo "-$2" || echo "-rhel")" +FLAVOR="$(test -n "$2" && echo "$2" || echo "rhel")" # shellcheck disable=SC2015 SCRIPT=$(readlink -f "$0") SCRIPT_DIR=$(dirname "$SCRIPT") -# Config options for RHEL should target the pending-rhel directory, not pending-common. -if [ "$FLAVOR" = "-rhel" ] -then - FLAVOR="-rhel" -fi - # to handle this script being a symlink cd "$SCRIPT_DIR" -- https://gitlab.com/cki-project/kernel-ark/-/merge_requests/3971 -- _______________________________________________ kernel mailing list -- kernel@lists.fedoraproject.org To unsubscribe send an email to kernel-le...@lists.fedoraproject.org Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/ List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines List Archives: https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue