cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

merge_config.sh (5085B)


      1#!/bin/sh
      2# SPDX-License-Identifier: GPL-2.0
      3#
      4#  merge_config.sh - Takes a list of config fragment values, and merges
      5#  them one by one. Provides warnings on overridden values, and specified
      6#  values that did not make it to the resulting .config file (due to missed
      7#  dependencies or config symbol removal).
      8#
      9#  Portions reused from kconf_check and generate_cfg:
     10#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
     11#  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
     12#
     13#  Copyright (c) 2009-2010 Wind River Systems, Inc.
     14#  Copyright 2011 Linaro
     15
     16set -e
     17
     18clean_up() {
     19	rm -f $TMP_FILE
     20	rm -f $MERGE_FILE
     21}
     22
     23usage() {
     24	echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
     25	echo "  -h    display this help text"
     26	echo "  -m    only merge the fragments, do not execute the make command"
     27	echo "  -n    use allnoconfig instead of alldefconfig"
     28	echo "  -r    list redundant entries when merging fragments"
     29	echo "  -y    make builtin have precedence over modules"
     30	echo "  -O    dir to put generated output files.  Consider setting \$KCONFIG_CONFIG instead."
     31	echo "  -s    strict mode. Fail if the fragment redefines any value."
     32	echo
     33	echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
     34}
     35
     36RUNMAKE=true
     37ALLTARGET=alldefconfig
     38WARNREDUN=false
     39BUILTIN=false
     40OUTPUT=.
     41STRICT=false
     42CONFIG_PREFIX=${CONFIG_-CONFIG_}
     43
     44while true; do
     45	case $1 in
     46	"-n")
     47		ALLTARGET=allnoconfig
     48		shift
     49		continue
     50		;;
     51	"-m")
     52		RUNMAKE=false
     53		shift
     54		continue
     55		;;
     56	"-h")
     57		usage
     58		exit
     59		;;
     60	"-r")
     61		WARNREDUN=true
     62		shift
     63		continue
     64		;;
     65	"-y")
     66		BUILTIN=true
     67		shift
     68		continue
     69		;;
     70	"-O")
     71		if [ -d $2 ];then
     72			OUTPUT=$(echo $2 | sed 's/\/*$//')
     73		else
     74			echo "output directory $2 does not exist" 1>&2
     75			exit 1
     76		fi
     77		shift 2
     78		continue
     79		;;
     80	"-s")
     81		STRICT=true
     82		shift
     83		continue
     84		;;
     85	*)
     86		break
     87		;;
     88	esac
     89done
     90
     91if [ "$#" -lt 1 ] ; then
     92	usage
     93	exit
     94fi
     95
     96if [ -z "$KCONFIG_CONFIG" ]; then
     97	if [ "$OUTPUT" != . ]; then
     98		KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
     99	else
    100		KCONFIG_CONFIG=.config
    101	fi
    102fi
    103
    104INITFILE=$1
    105shift;
    106
    107if [ ! -r "$INITFILE" ]; then
    108	echo "The base file '$INITFILE' does not exist.  Exit." >&2
    109	exit 1
    110fi
    111
    112MERGE_LIST=$*
    113SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
    114SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
    115
    116TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
    117MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
    118
    119echo "Using $INITFILE as base"
    120
    121trap clean_up EXIT
    122
    123cat $INITFILE > $TMP_FILE
    124
    125# Merge files, printing warnings on overridden values
    126for ORIG_MERGE_FILE in $MERGE_LIST ; do
    127	echo "Merging $ORIG_MERGE_FILE"
    128	if [ ! -r "$ORIG_MERGE_FILE" ]; then
    129		echo "The merge file '$ORIG_MERGE_FILE' does not exist.  Exit." >&2
    130		exit 1
    131	fi
    132	cat $ORIG_MERGE_FILE > $MERGE_FILE
    133	CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
    134
    135	for CFG in $CFG_LIST ; do
    136		grep -q -w $CFG $TMP_FILE || continue
    137		PREV_VAL=$(grep -w $CFG $TMP_FILE)
    138		NEW_VAL=$(grep -w $CFG $MERGE_FILE)
    139		BUILTIN_FLAG=false
    140		if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then
    141			echo Previous  value: $PREV_VAL
    142			echo New value:       $NEW_VAL
    143			echo -y passed, will not demote y to m
    144			echo
    145			BUILTIN_FLAG=true
    146		elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
    147			echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE:
    148			echo Previous  value: $PREV_VAL
    149			echo New value:       $NEW_VAL
    150			echo
    151			if [ "$STRICT" = "true" ]; then
    152				STRICT_MODE_VIOLATED=true
    153			fi
    154		elif [ "$WARNREDUN" = "true" ]; then
    155			echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
    156		fi
    157		if [ "$BUILTIN_FLAG" = "false" ]; then
    158			sed -i "/$CFG[ =]/d" $TMP_FILE
    159		else
    160			sed -i "/$CFG[ =]/d" $MERGE_FILE
    161		fi
    162	done
    163	cat $MERGE_FILE >> $TMP_FILE
    164done
    165
    166if [ "$STRICT_MODE_VIOLATED" = "true" ]; then
    167	echo "The fragment redefined a value and strict mode had been passed."
    168	exit 1
    169fi
    170
    171if [ "$RUNMAKE" = "false" ]; then
    172	cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
    173	echo "#"
    174	echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
    175	echo "#"
    176	exit
    177fi
    178
    179# If we have an output dir, setup the O= argument, otherwise leave
    180# it blank, since O=. will create an unnecessary ./source softlink
    181OUTPUT_ARG=""
    182if [ "$OUTPUT" != "." ] ; then
    183	OUTPUT_ARG="O=$OUTPUT"
    184fi
    185
    186
    187# Use the merged file as the starting point for:
    188# alldefconfig: Fills in any missing symbols with Kconfig default
    189# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
    190make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
    191
    192
    193# Check all specified config values took (might have missed-dependency issues)
    194for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
    195
    196	REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
    197	ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
    198	if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
    199		echo "Value requested for $CFG not in final .config"
    200		echo "Requested value:  $REQUESTED_VAL"
    201		echo "Actual value:     $ACTUAL_VAL"
    202		echo ""
    203	fi
    204done