diff options
author | Jeremy Cline <jcline@redhat.com> | 2020-04-14 17:53:23 -0400 |
---|---|---|
committer | Jeremy Cline <jcline@redhat.com> | 2020-04-14 17:53:23 -0400 |
commit | 0310b312a7e5dffcdf24ae835ed732f7a6a9c471 (patch) | |
tree | ca12edc19a6f6e05ef31919d65adf895a39d12c0 /process_configs.sh | |
parent | 48b75e92d6f4024e7f99442334f6969345516a72 (diff) | |
download | kernel-0310b312a7e5dffcdf24ae835ed732f7a6a9c471.tar.gz kernel-0310b312a7e5dffcdf24ae835ed732f7a6a9c471.tar.xz kernel-0310b312a7e5dffcdf24ae835ed732f7a6a9c471.zip |
kernel-5.7.0-0.rc1.20200414git8632e9b5645b.1
This is an automated commit generated from the
kernel-5.7.0-0.rc1.20200414git8632e9b5645b.1 tag in
https://gitlab.com/cki-project/kernel-ark.git
Diffstat (limited to 'process_configs.sh')
-rwxr-xr-x[l---------] | process_configs.sh | 326 |
1 files changed, 325 insertions, 1 deletions
diff --git a/process_configs.sh b/process_configs.sh index 134a69099..14773fef2 120000..100755 --- a/process_configs.sh +++ b/process_configs.sh @@ -1 +1,325 @@ -configs/process_configs.sh
\ No newline at end of file +#!/bin/bash +# +# This script takes the merged config files and processes them through oldconfig +# and listnewconfig +# + +usage() +{ + # alphabetical order please + echo "process_configs.sh [ options ] package_name kernel_version" + echo " -a: report all errors, equivalent to [-c -n -w -i]" + echo " -c: error on mismatched config options" + echo " -i: continue on error" + echo " -n: error on unset config options" + echo " -t: test run, do not overwrite original config" + echo " -w: error on misconfigured config options" + echo " -z: commit new configs to pending directory" + exit 1 +} + +die() +{ + echo "$1" + exit 1 +} + +# stupid function to find top of tree to do kernel make configs +switch_to_toplevel() +{ + path="$(pwd)" + while test -n "$path" + do + test -e $path/MAINTAINERS && \ + test -d $path/drivers && \ + break + + path="$(dirname $path)" + done + + test -n "$path" || die "Can't find toplevel" + echo "$path" +} + +checkoptions() +{ + /usr/bin/awk ' + + /is not set/ { + split ($0, a, "#"); + split(a[2], b); + if (NR==FNR) { + configs[b[1]]="is not set"; + } else { + if (configs[b[1]] != "" && configs[b[1]] != "is not set") + print "Found # "b[1] " is not set, after generation, had " b[1] " " configs[b[1]] " in Source tree"; + } + } + + /=/ { + split ($0, a, "="); + if (NR==FNR) { + configs[a[1]]=a[2]; + } else { + if (configs[a[1]] != "" && configs[a[1]] != a[2]) + print "Found "a[1]"="a[2]" after generation, had " a[1]"="configs[a[1]]" in Source tree"; + } + } + ' $1 $2 > .mismatches + + if test -s .mismatches + then + echo "Error: Mismatches found in configuration files" + cat .mismatches + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi +} + +parsenewconfigs() +{ + tmpdir=$(mktemp -d) + + # This awk script reads the output of make listnewconfig + # and puts it into CONFIG_FOO files. Using the output of + # listnewconfig is much easier to ensure we get the default + # output. + /usr/bin/awk -v BASE=$tmpdir ' + /is not set/ { + split ($0, a, "#"); + split(a[2], b); + OUT_FILE=BASE"/"b[1]; + print $0 >> OUT_FILE; + } + + /=/ { + split ($0, a, "="); + OUT_FILE=BASE"/"a[1]; + if (a[2] == "n") + print "# " a[1] " is not set" >> OUT_FILE; + else + print $0 >> OUT_FILE; + } + + ' .newoptions + + # This awk script parses the output of helpnewconfig. + # Each option is separated between ----- markers + # The goal is to put all the help text as a comment in + # each CONFIG_FOO file. Because of how awk works + # there's a lot of moving files around and catting to + # get what we need. + /usr/bin/awk -v BASE=$tmpdir ' + BEGIN { inpatch=0; + outfile="none"; + symbol="none"; } + /^CONFIG_.*:$/ { + split($0, a, ":"); + symbol=a[1]; + outfile=BASE "/fake_"symbol + } + /-----/ { + if (inpatch == 0) { + inpatch = 1; + } + else { + if (symbol != "none") { + system("cat " outfile " " BASE "/" symbol " > " BASE "/tmpf"); + system("mv " BASE "/tmpf " BASE "/" symbol); + symbol="none" + } + outfile="none" + inpatch = 0; + } + } + !/-----/ { + if (inpatch == 1 && outfile != "none") { + print "# "$0 >> outfile; + } + } + + + ' .helpnewconfig + + pushd $tmpdir &> /dev/null + rm fake_* + popd &> /dev/null + for f in `ls $tmpdir`; do + [[ -e "$tmpdir/$f" ]] || break + cp $tmpdir/$f $SCRIPT_DIR/pending"$FLAVOR"/generic/ + done + + rm -rf $tmpdir +} + +function commit_new_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd $(switch_to_toplevel) &>/dev/null + + for cfg in $SCRIPT_DIR/${PACKAGE_NAME}${KVERREL}${SUBARCH}*.config + do + arch=$(head -1 $cfg | cut -b 3-) + cfgtmp="${cfg}.tmp" + cfgorig="${cfg}.orig" + cat $cfg > $cfgorig + + if [ "$arch" = "EMPTY" ] + then + # This arch is intentionally left blank + continue + fi + echo -n "Checking for new configs in $cfg ... " + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig listnewconfig >& .listnewconfig + grep -E 'CONFIG_' .listnewconfig > .newoptions + if test -s .newoptions + then + make ARCH=$arch KCONFIG_CONFIG=$cfgorig helpnewconfig >& .helpnewconfig + parsenewconfigs + fi + rm .newoptions + echo "done" + done + + git add $SCRIPT_DIR/pending"$FLAVOR" + git commit -m "[redhat] AUTOMATIC: New configs" +} + +function process_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd $(switch_to_toplevel) &>/dev/null + + for cfg in $SCRIPT_DIR/${PACKAGE_NAME}${KVERREL}${SUBARCH}*.config + do + arch=$(head -1 $cfg | cut -b 3-) + cfgtmp="${cfg}.tmp" + cfgorig="${cfg}.orig" + cat $cfg > $cfgorig + + if [ "$arch" = "EMPTY" ] + then + # This arch is intentionally left blank + continue + fi + echo -n "Processing $cfg ... " + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig listnewconfig >& .listnewconfig + grep -E 'CONFIG_' .listnewconfig > .newoptions + if test -n "$NEWOPTIONS" && test -s .newoptions + then + echo "Found unset config items, please set them to an appropriate value" + cat .newoptions + rm .newoptions + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi + rm .newoptions + + grep -E 'config.*warning' .listnewconfig > .warnings + if test -n "$CHECKWARNINGS" && test -s .warnings + then + echo "Found misconfigured config items, please set them to an appropriate value" + cat .warnings + rm .warnings + RETURNCODE=1 + [ "$CONTINUEONERROR" ] || exit 1 + fi + rm .warnings + + rm .listnewconfig + + make ARCH=$arch KCONFIG_CONFIG=$cfgorig olddefconfig > /dev/null || exit 1 + echo "# $arch" > ${cfgtmp} + cat "${cfgorig}" >> ${cfgtmp} + if test -n "$CHECKOPTIONS" + then + checkoptions $cfg $cfgtmp + fi + # if test run, don't overwrite original + if test -n "$TESTRUN" + then + rm ${cfgtmp} + else + mv ${cfgtmp} ${cfg} + fi + rm ${cfgorig} + echo "done" + done + rm "$SCRIPT_DIR"/*.config*.old + popd > /dev/null + + echo "Processed config files are in $SCRIPT_DIR" +} + +CHECKOPTIONS="" +CONTINUEONERROR="" +NEWOPTIONS="" +TESTRUN="" +CHECKWARNINGS="" + +RETURNCODE=0 + +while [[ $# -gt 0 ]] +do + key="$1" + case $key in + -a) + CHECKOPTIONS="x" + CONTINUEONERROR="x" + NEWOPTIONS="x" + CHECKWARNINGS="x" + ;; + -c) + CHECKOPTIONS="x" + ;; + -h) + usage + ;; + -i) + CONTINUEONERROR="x" + ;; + -n) + NEWOPTIONS="x" + ;; + -t) + TESTRUN="x" + ;; + -w) + CHECKWARNINGS="x" + ;; + -z) + COMMITNEWCONFIGS="x" + ;; + *) + break;; + esac + shift +done + +PACKAGE_NAME="${1:-kernel}" # defines the package name used +KVERREL="$(test -n "$2" && echo "-$2" || echo "")" +SUBARCH="$(test -n "$3" && echo "-$3" || echo "")" +FLAVOR="$(test -n "$4" && echo "-$4" || echo "-common")" +SCRIPT="$(readlink -f $0)" +OUTPUT_DIR="$PWD" +SCRIPT_DIR="$(dirname $SCRIPT)" + +# Most RHEL options are options we want in Fedora so RHEL pending settings head +# to common/ +if [ "$FLAVOR" = "-rhel" ] +then + FLAVOR="-common" +fi + +# to handle this script being a symlink +cd $SCRIPT_DIR + +if test -n "$COMMITNEWCONFIGS"; then + commit_new_configs +else + process_configs +fi + +exit $RETURNCODE |