mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	 60bef52c7a
			
		
	
	
		60bef52c7a
		
	
	
	
	
		
			
			The merge_config.sh script verifies that all the config options have
their expected value in the resulting file and prints any issues as
warnings.  These checks aren't intended to be treated as errors given
the current implementation.  However, since "set -e" was added, if the
grep command to look for a config option does not find it the script
will then abort prematurely.
Handle the case where the grep exit status is non-zero by setting
ACTUAL_VAL to an empty string to restore previous functionality.
Fixes: cdfca82157 ("merge_config.sh: Check error codes from make")
Signed-off-by: Guillaume Tucker <guillaume.tucker@collabora.com>
Acked-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
		
	
			
		
			
				
	
	
		
			189 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| # SPDX-License-Identifier: GPL-2.0
 | |
| #
 | |
| #  merge_config.sh - Takes a list of config fragment values, and merges
 | |
| #  them one by one. Provides warnings on overridden values, and specified
 | |
| #  values that did not make it to the resulting .config file (due to missed
 | |
| #  dependencies or config symbol removal).
 | |
| #
 | |
| #  Portions reused from kconf_check and generate_cfg:
 | |
| #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
 | |
| #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
 | |
| #
 | |
| #  Copyright (c) 2009-2010 Wind River Systems, Inc.
 | |
| #  Copyright 2011 Linaro
 | |
| 
 | |
| set -e
 | |
| 
 | |
| clean_up() {
 | |
| 	rm -f $TMP_FILE
 | |
| 	rm -f $MERGE_FILE
 | |
| }
 | |
| 
 | |
| usage() {
 | |
| 	echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
 | |
| 	echo "  -h    display this help text"
 | |
| 	echo "  -m    only merge the fragments, do not execute the make command"
 | |
| 	echo "  -n    use allnoconfig instead of alldefconfig"
 | |
| 	echo "  -r    list redundant entries when merging fragments"
 | |
| 	echo "  -y    make builtin have precedence over modules"
 | |
| 	echo "  -O    dir to put generated output files.  Consider setting \$KCONFIG_CONFIG instead."
 | |
| 	echo
 | |
| 	echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
 | |
| }
 | |
| 
 | |
| RUNMAKE=true
 | |
| ALLTARGET=alldefconfig
 | |
| WARNREDUN=false
 | |
| BUILTIN=false
 | |
| OUTPUT=.
 | |
| CONFIG_PREFIX=${CONFIG_-CONFIG_}
 | |
| 
 | |
| while true; do
 | |
| 	case $1 in
 | |
| 	"-n")
 | |
| 		ALLTARGET=allnoconfig
 | |
| 		shift
 | |
| 		continue
 | |
| 		;;
 | |
| 	"-m")
 | |
| 		RUNMAKE=false
 | |
| 		shift
 | |
| 		continue
 | |
| 		;;
 | |
| 	"-h")
 | |
| 		usage
 | |
| 		exit
 | |
| 		;;
 | |
| 	"-r")
 | |
| 		WARNREDUN=true
 | |
| 		shift
 | |
| 		continue
 | |
| 		;;
 | |
| 	"-y")
 | |
| 		BUILTIN=true
 | |
| 		shift
 | |
| 		continue
 | |
| 		;;
 | |
| 	"-O")
 | |
| 		if [ -d $2 ];then
 | |
| 			OUTPUT=$(echo $2 | sed 's/\/*$//')
 | |
| 		else
 | |
| 			echo "output directory $2 does not exist" 1>&2
 | |
| 			exit 1
 | |
| 		fi
 | |
| 		shift 2
 | |
| 		continue
 | |
| 		;;
 | |
| 	*)
 | |
| 		break
 | |
| 		;;
 | |
| 	esac
 | |
| done
 | |
| 
 | |
| if [ "$#" -lt 1 ] ; then
 | |
| 	usage
 | |
| 	exit
 | |
| fi
 | |
| 
 | |
| if [ -z "$KCONFIG_CONFIG" ]; then
 | |
| 	if [ "$OUTPUT" != . ]; then
 | |
| 		KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
 | |
| 	else
 | |
| 		KCONFIG_CONFIG=.config
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| INITFILE=$1
 | |
| shift;
 | |
| 
 | |
| if [ ! -r "$INITFILE" ]; then
 | |
| 	echo "The base file '$INITFILE' does not exist.  Exit." >&2
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| MERGE_LIST=$*
 | |
| SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
 | |
| SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
 | |
| 
 | |
| TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
 | |
| MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
 | |
| 
 | |
| echo "Using $INITFILE as base"
 | |
| 
 | |
| trap clean_up EXIT
 | |
| 
 | |
| cat $INITFILE > $TMP_FILE
 | |
| 
 | |
| # Merge files, printing warnings on overridden values
 | |
| for ORIG_MERGE_FILE in $MERGE_LIST ; do
 | |
| 	echo "Merging $ORIG_MERGE_FILE"
 | |
| 	if [ ! -r "$ORIG_MERGE_FILE" ]; then
 | |
| 		echo "The merge file '$ORIG_MERGE_FILE' does not exist.  Exit." >&2
 | |
| 		exit 1
 | |
| 	fi
 | |
| 	cat $ORIG_MERGE_FILE > $MERGE_FILE
 | |
| 	CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
 | |
| 
 | |
| 	for CFG in $CFG_LIST ; do
 | |
| 		grep -q -w $CFG $TMP_FILE || continue
 | |
| 		PREV_VAL=$(grep -w $CFG $TMP_FILE)
 | |
| 		NEW_VAL=$(grep -w $CFG $MERGE_FILE)
 | |
| 		BUILTIN_FLAG=false
 | |
| 		if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then
 | |
| 			echo Previous  value: $PREV_VAL
 | |
| 			echo New value:       $NEW_VAL
 | |
| 			echo -y passed, will not demote y to m
 | |
| 			echo
 | |
| 			BUILTIN_FLAG=true
 | |
| 		elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
 | |
| 			echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE:
 | |
| 			echo Previous  value: $PREV_VAL
 | |
| 			echo New value:       $NEW_VAL
 | |
| 			echo
 | |
| 		elif [ "$WARNREDUN" = "true" ]; then
 | |
| 			echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
 | |
| 		fi
 | |
| 		if [ "$BUILTIN_FLAG" = "false" ]; then
 | |
| 			sed -i "/$CFG[ =]/d" $TMP_FILE
 | |
| 		else
 | |
| 			sed -i "/$CFG[ =]/d" $MERGE_FILE
 | |
| 		fi
 | |
| 	done
 | |
| 	cat $MERGE_FILE >> $TMP_FILE
 | |
| done
 | |
| 
 | |
| if [ "$RUNMAKE" = "false" ]; then
 | |
| 	cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
 | |
| 	echo "#"
 | |
| 	echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
 | |
| 	echo "#"
 | |
| 	exit
 | |
| fi
 | |
| 
 | |
| # If we have an output dir, setup the O= argument, otherwise leave
 | |
| # it blank, since O=. will create an unnecessary ./source softlink
 | |
| OUTPUT_ARG=""
 | |
| if [ "$OUTPUT" != "." ] ; then
 | |
| 	OUTPUT_ARG="O=$OUTPUT"
 | |
| fi
 | |
| 
 | |
| 
 | |
| # Use the merged file as the starting point for:
 | |
| # alldefconfig: Fills in any missing symbols with Kconfig default
 | |
| # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
 | |
| make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
 | |
| 
 | |
| 
 | |
| # Check all specified config values took (might have missed-dependency issues)
 | |
| for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
 | |
| 
 | |
| 	REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
 | |
| 	ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
 | |
| 	if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
 | |
| 		echo "Value requested for $CFG not in final .config"
 | |
| 		echo "Requested value:  $REQUESTED_VAL"
 | |
| 		echo "Actual value:     $ACTUAL_VAL"
 | |
| 		echo ""
 | |
| 	fi
 | |
| done
 |