| #!/bin/bash |
| |
| |
| |
| |
| |
| usage() |
| { |
| |
| 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 |
| } |
| |
| |
| 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) |
| |
| |
| |
| |
| |
| /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 |
| |
| |
| |
| |
| |
| |
| |
| /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() |
| { |
| |
| 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 |
| |
| 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() |
| { |
| |
| 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 |
| |
| 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 -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}" |
| 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)" |
| |
| |
| |
| if [ "$FLAVOR" = "-rhel" ] |
| then |
| FLAVOR="-common" |
| fi |
| |
| |
| cd $SCRIPT_DIR |
| |
| if test -n "$COMMITNEWCONFIGS"; then |
| commit_new_configs |
| else |
| process_configs |
| fi |
| |
| exit $RETURNCODE |