merge_config.sh: Check error codes from make
[linux-2.6-block.git] / scripts / kconfig / merge_config.sh
index 0ef906499646b57293bb85dea54234c601bfcafa..bec246719aeaf2f1c681f200a3c0d933611a162b 100755 (executable)
@@ -1,4 +1,6 @@
 #!/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
 #
 #  Copyright (c) 2009-2010 Wind River Systems, Inc.
 #  Copyright 2011 Linaro
-#
-#  This program is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License version 2 as
-#  published by the Free Software Foundation.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#  See the GNU General Public License for more details.
+
+set -e
 
 clean_up() {
        rm -f $TMP_FILE
-       exit
+       rm -f $MERGE_FILE
 }
-trap clean_up HUP INT TERM
 
 usage() {
        echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
@@ -32,6 +26,7 @@ usage() {
        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."
@@ -40,6 +35,7 @@ usage() {
 RUNMAKE=true
 ALLTARGET=alldefconfig
 WARNREDUN=false
+BUILTIN=false
 OUTPUT=.
 CONFIG_PREFIX=${CONFIG_-CONFIG_}
 
@@ -64,6 +60,11 @@ while true; do
                shift
                continue
                ;;
+       "-y")
+               BUILTIN=true
+               shift
+               continue
+               ;;
        "-O")
                if [ -d $2 ];then
                        OUTPUT=$(echo $2 | sed 's/\/*$//')
@@ -106,32 +107,48 @@ 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 MERGE_FILE in $MERGE_LIST ; do
-       echo "Merging $MERGE_FILE"
-       if [ ! -r "$MERGE_FILE" ]; then
-               echo "The merge file '$MERGE_FILE' does not exist.  Exit." >&2
+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)
-               if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
-                       echo Value of $CFG is redefined by fragment $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 $MERGE_FILE:
+                       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
-               sed -i "/$CFG[ =]/d" $TMP_FILE
        done
        cat $MERGE_FILE >> $TMP_FILE
 done
@@ -141,7 +158,6 @@ if [ "$RUNMAKE" = "false" ]; then
        echo "#"
        echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
        echo "#"
-       clean_up
        exit
 fi
 
@@ -171,5 +187,3 @@ for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
                echo ""
        fi
 done
-
-clean_up