Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 #  merge_config.sh - Takes a list of config fragment values, and merges
0005 #  them one by one. Provides warnings on overridden values, and specified
0006 #  values that did not make it to the resulting .config file (due to missed
0007 #  dependencies or config symbol removal).
0008 #
0009 #  Portions reused from kconf_check and generate_cfg:
0010 #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
0011 #  http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
0012 #
0013 #  Copyright (c) 2009-2010 Wind River Systems, Inc.
0014 #  Copyright 2011 Linaro
0015 
0016 set -e
0017 
0018 clean_up() {
0019         rm -f $TMP_FILE
0020         rm -f $MERGE_FILE
0021 }
0022 
0023 usage() {
0024         echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
0025         echo "  -h    display this help text"
0026         echo "  -m    only merge the fragments, do not execute the make command"
0027         echo "  -n    use allnoconfig instead of alldefconfig"
0028         echo "  -r    list redundant entries when merging fragments"
0029         echo "  -y    make builtin have precedence over modules"
0030         echo "  -O    dir to put generated output files.  Consider setting \$KCONFIG_CONFIG instead."
0031         echo "  -s    strict mode. Fail if the fragment redefines any value."
0032         echo
0033         echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
0034 }
0035 
0036 RUNMAKE=true
0037 ALLTARGET=alldefconfig
0038 WARNREDUN=false
0039 BUILTIN=false
0040 OUTPUT=.
0041 STRICT=false
0042 CONFIG_PREFIX=${CONFIG_-CONFIG_}
0043 
0044 while true; do
0045         case $1 in
0046         "-n")
0047                 ALLTARGET=allnoconfig
0048                 shift
0049                 continue
0050                 ;;
0051         "-m")
0052                 RUNMAKE=false
0053                 shift
0054                 continue
0055                 ;;
0056         "-h")
0057                 usage
0058                 exit
0059                 ;;
0060         "-r")
0061                 WARNREDUN=true
0062                 shift
0063                 continue
0064                 ;;
0065         "-y")
0066                 BUILTIN=true
0067                 shift
0068                 continue
0069                 ;;
0070         "-O")
0071                 if [ -d $2 ];then
0072                         OUTPUT=$(echo $2 | sed 's/\/*$//')
0073                 else
0074                         echo "output directory $2 does not exist" 1>&2
0075                         exit 1
0076                 fi
0077                 shift 2
0078                 continue
0079                 ;;
0080         "-s")
0081                 STRICT=true
0082                 shift
0083                 continue
0084                 ;;
0085         *)
0086                 break
0087                 ;;
0088         esac
0089 done
0090 
0091 if [ "$#" -lt 1 ] ; then
0092         usage
0093         exit
0094 fi
0095 
0096 if [ -z "$KCONFIG_CONFIG" ]; then
0097         if [ "$OUTPUT" != . ]; then
0098                 KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
0099         else
0100                 KCONFIG_CONFIG=.config
0101         fi
0102 fi
0103 
0104 INITFILE=$1
0105 shift;
0106 
0107 if [ ! -r "$INITFILE" ]; then
0108         echo "The base file '$INITFILE' does not exist.  Exit." >&2
0109         exit 1
0110 fi
0111 
0112 MERGE_LIST=$*
0113 SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
0114 SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
0115 
0116 TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
0117 MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
0118 
0119 echo "Using $INITFILE as base"
0120 
0121 trap clean_up EXIT
0122 
0123 cat $INITFILE > $TMP_FILE
0124 
0125 # Merge files, printing warnings on overridden values
0126 for ORIG_MERGE_FILE in $MERGE_LIST ; do
0127         echo "Merging $ORIG_MERGE_FILE"
0128         if [ ! -r "$ORIG_MERGE_FILE" ]; then
0129                 echo "The merge file '$ORIG_MERGE_FILE' does not exist.  Exit." >&2
0130                 exit 1
0131         fi
0132         cat $ORIG_MERGE_FILE > $MERGE_FILE
0133         CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
0134 
0135         for CFG in $CFG_LIST ; do
0136                 grep -q -w $CFG $TMP_FILE || continue
0137                 PREV_VAL=$(grep -w $CFG $TMP_FILE)
0138                 NEW_VAL=$(grep -w $CFG $MERGE_FILE)
0139                 BUILTIN_FLAG=false
0140                 if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then
0141                         echo Previous  value: $PREV_VAL
0142                         echo New value:       $NEW_VAL
0143                         echo -y passed, will not demote y to m
0144                         echo
0145                         BUILTIN_FLAG=true
0146                 elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
0147                         echo Value of $CFG is redefined by fragment $ORIG_MERGE_FILE:
0148                         echo Previous  value: $PREV_VAL
0149                         echo New value:       $NEW_VAL
0150                         echo
0151                         if [ "$STRICT" = "true" ]; then
0152                                 STRICT_MODE_VIOLATED=true
0153                         fi
0154                 elif [ "$WARNREDUN" = "true" ]; then
0155                         echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
0156                 fi
0157                 if [ "$BUILTIN_FLAG" = "false" ]; then
0158                         sed -i "/$CFG[ =]/d" $TMP_FILE
0159                 else
0160                         sed -i "/$CFG[ =]/d" $MERGE_FILE
0161                 fi
0162         done
0163         cat $MERGE_FILE >> $TMP_FILE
0164 done
0165 
0166 if [ "$STRICT_MODE_VIOLATED" = "true" ]; then
0167         echo "The fragment redefined a value and strict mode had been passed."
0168         exit 1
0169 fi
0170 
0171 if [ "$RUNMAKE" = "false" ]; then
0172         cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
0173         echo "#"
0174         echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
0175         echo "#"
0176         exit
0177 fi
0178 
0179 # If we have an output dir, setup the O= argument, otherwise leave
0180 # it blank, since O=. will create an unnecessary ./source softlink
0181 OUTPUT_ARG=""
0182 if [ "$OUTPUT" != "." ] ; then
0183         OUTPUT_ARG="O=$OUTPUT"
0184 fi
0185 
0186 
0187 # Use the merged file as the starting point for:
0188 # alldefconfig: Fills in any missing symbols with Kconfig default
0189 # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
0190 make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
0191 
0192 
0193 # Check all specified config values took (might have missed-dependency issues)
0194 for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
0195 
0196         REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
0197         ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
0198         if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
0199                 echo "Value requested for $CFG not in final .config"
0200                 echo "Requested value:  $REQUESTED_VAL"
0201                 echo "Actual value:     $ACTUAL_VAL"
0202                 echo ""
0203         fi
0204 done