From c41960f76806a516b0c4fd1953779fcd20bc7633 Mon Sep 17 00:00:00 2001 From: Laura Abbott Date: Mon, 5 Feb 2018 11:20:04 -0800 Subject: Linux v4.15 --- configs/build_configs.sh | 137 +++++++++++++++++++++++++++++++++++++++++++++ configs/config_generation | 41 ++++++++++++++ configs/process_configs.sh | 136 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100755 configs/build_configs.sh create mode 100644 configs/config_generation create mode 100755 configs/process_configs.sh (limited to 'configs') diff --git a/configs/build_configs.sh b/configs/build_configs.sh new file mode 100755 index 000000000..15ab6b380 --- /dev/null +++ b/configs/build_configs.sh @@ -0,0 +1,137 @@ +#!/bin/bash +# +# This script merges together the hierarchy of CONFIG_* files under generic +# and debug to form the necessary $PACKAGE_NAME--.config +# files for building RHEL kernels, based on the contents of a control file + +PACKAGE_NAME="${1:-kernel}" # defines the package name used +KVERREL="${2:-}" +SUBARCH="${3:-}" # defines a specific arch +SCRIPT="$(readlink -f $0)" +OUTPUT_DIR="$PWD" +SCRIPT_DIR="$(dirname $SCRIPT)" + +# to handle this script being a symlink +cd $SCRIPT_DIR + +set errexit +set nounset + +control_file="config_generation" + +cleanup() +{ + rm -f config-* +} + +die() +{ + echo "$1" + cleanup + exit 1 +} + +function combine_config_layer() +{ + dir=$1 + file="config-$(echo $dir | sed -e 's|/|-|g')" + + if [ $(ls $dir/ | grep -c "^CONFIG_") -eq 0 ]; then + touch $file + return + fi + + cat $dir/CONFIG_* > $file +} + +function merge_configs() +{ + archvar=$1 + arch=$(echo "$archvar" | cut -f1 -d"-") + configs=$2 + order=$3 + name=$OUTPUT_DIR/$PACKAGE_NAME-$archvar.config + echo -n "Building $name ... " + touch config-merging config-merged + + # apply based on order + skip_if_missing="" + for o in $order + do + for config in $(echo $configs | sed -e 's/:/ /g') + do + cfile="config-$o-$config" + + test -n "$skip_if_missing" && test ! -e $cfile && continue + + perl merge.pl $cfile config-merging > config-merged + if [ ! $? -eq 0 ]; then + die "Failed to merge $cfile" + fi + mv config-merged config-merging + done + + # first configs in $order is baseline, all files should be + # there. second pass is overrides and can be missing. + skip_if_missing="1" + done + if [ "x$arch" == "xaarch64" ]; then + echo "# arm64" > $name + elif [ "x$arch" == "xppc64" ]; then + echo "# powerpc" > $name + elif [ "x$arch" == "xppc64le" ]; then + echo "# powerpc" > $name + elif [ "x$arch" == "xs390x" ]; then + echo "# s390" > $name + elif [ "x$arch" == "xarmv7hl" ]; then + echo "# arm" > $name + elif [ "x$arch" == "xi686" ]; then + echo "# i386" > $name + else + echo "# $arch" > $name + fi + sort config-merging >> $name + rm -f config-merged config-merging + echo "done" +} + +while read line +do + if [ $(echo "$line" | grep -c "^#") -ne 0 ]; then + continue + elif [ $(echo "$line" | grep -c "^$") -ne 0 ]; then + continue + elif [ $(echo "$line" | grep -c "^ORDER") -ne 0 ]; then + order=$(echo "$line" | cut -f2 -d"=") + for o in $order + do + glist=$(find $o -type d) + for d in $glist + do + combine_config_layer $d + done + done + else + arch=$(echo "$line" | cut -f1 -d"=") + configs=$(echo "$line" | cut -f2 -d"=") + + if [ -n "$SUBARCH" -a "$SUBARCH" != "$arch" ]; then + continue + fi + + merge_configs $arch $configs "$order" + fi +done < $control_file + +# A passed in kernel version implies copy to final location +# otherwise defer to another script +if test -n "$KVERREL" +then + for i in kernel-*.config + do + NEW="$(echo $i | sed "s/$PACKAGE_NAME-$SUBARCH/$PACKAGE_NAME-$KVERREL-$SUBARCH/")" + mv $i $NEW + done +fi + +cleanup diff --git a/configs/config_generation b/configs/config_generation new file mode 100644 index 000000000..e8614c43f --- /dev/null +++ b/configs/config_generation @@ -0,0 +1,41 @@ +# config-variant=config:config:config +# kernel.config files are build on the fly based on this config, +# the first arg is arch and variant, the second is a hierarchy of +# config options, lowest priority to highest + +# tells the build_configs.sh which order to build the configs. +# this is useful when providing a separate overrides directory. +# do not use quotes and space separate the directories. +ORDER=fedora + +# x86_64 +x86_64=generic:generic-x86:generic-x86-x86_64 +x86_64-debug=generic:generic-x86:generic-x86-x86_64:debug:debug-x86:debug-x86-x86_64 + +# i686 +i686=generic:generic-x86:generic-x86-i686 +i686-debug=generic:generic-x86:generic-x86-i686:debug:debug-x86 +i686-PAE=generic:generic-x86:generic-x86-i686PAE +i686-PAEdebug=generic:generic-x86:generic-x86-i686PAE:debug:debug-x86 + +# ppc64 +ppc64=generic:generic-powerpc:generic-powerpc-powerpc64 +ppc64-debug=generic:generic-powerpc:generic-powerpc-powerpc64:debug + +# ppc64le +ppc64le=generic:generic-powerpc:generic-powerpc-powerpc64le +ppc64le-debug=generic:generic-powerpc:generic-powerpc-powerpc64le:debug + +# s390x +s390x=generic:generic-s390x +s390x-debug=generic:generic-s390x:debug + +# aarch64 +aarch64=generic:generic-arm:generic-arm-aarch64 +aarch64-debug=generic:generic-arm:generic-arm-aarch64:debug:debug-arm + +# arm +armv7hl=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-armv7 +armv7hl-debug=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-armv7:debug:debug-arm +armv7hl-lpae=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-lpae +armv7hl-lpae-debug=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-lpae:debug:debug-arm diff --git a/configs/process_configs.sh b/configs/process_configs.sh new file mode 100755 index 000000000..4de45d65a --- /dev/null +++ b/configs/process_configs.sh @@ -0,0 +1,136 @@ +#!/bin/bash +# +# This script takes the merged config files and processes them through oldconfig +# and listnewconfig + + +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 -d $path/firmware && \ + 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]"="configs[a[1]]" after generation, had " a[1]"="a[2]" in Source tree"; + } + } + ' $1 $2 > .mismatches + + if test -s .mismatches + then + echo "Error: Mismatches found in configuration files" + cat .mismatches + exit 1 + fi +} + +function process_configs() +{ + # assume we are in $source_tree/configs, need to get to top level + pushd $(switch_to_toplevel) + + 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 + + echo -n "Processing $cfg ... " + + # an empty grep is good but leaves a return value, so use # 'true' to bypass + make ARCH=$arch KCONFIG_CONFIG=$cfg listnewconfig | grep -E 'CONFIG_' > .newoptions || true + if test -n "$NEWOPTIONS" && test -s .newoptions + then + echo "Found unset config items, please set them to an appropriate value" + cat .newoptions + rm .newoptions + exit 1 + fi + rm .newoptions + + make ARCH=$arch KCONFIG_CONFIG=$cfg oldnoconfig > /dev/null || exit 1 + echo "# $arch" > ${cfgtmp} + cat "${cfg}" >> ${cfgtmp} + if test -n "$CHECKOPTIONS" + then + checkoptions $cfgtmp $cfgorig + fi + mv ${cfgtmp} ${cfg} + rm ${cfgorig} + echo "done" + done + rm "$SCRIPT_DIR"/*.config.old + popd > /dev/null + + echo "Processed config files are in $SCRIPT_DIR" +} + +NEWOPTIONS="" +CHECKOPTIONS="" + +while [[ $# -gt 0 ]] +do + key="$1" + case $key in + -n) + NEWOPTIONS="x" + ;; + -c) + CHECKOPTIONS="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 "")" +SCRIPT="$(readlink -f $0)" +OUTPUT_DIR="$PWD" +SCRIPT_DIR="$(dirname $SCRIPT)" + +# to handle this script being a symlink +cd $SCRIPT_DIR + +process_configs -- cgit