~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/kconfig/merge_config.sh

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
 16 set -e
 17 
 18 clean_up() {
 19         rm -f $TMP_FILE
 20         rm -f $MERGE_FILE
 21 }
 22 
 23 usage() {
 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 "  -Q    disable warning messages for overridden options."
 33         echo
 34         echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
 35 }
 36 
 37 RUNMAKE=true
 38 ALLTARGET=alldefconfig
 39 WARNREDUN=false
 40 BUILTIN=false
 41 OUTPUT=.
 42 STRICT=false
 43 CONFIG_PREFIX=${CONFIG_-CONFIG_}
 44 WARNOVERRIDE=echo
 45 
 46 while true; do
 47         case $1 in
 48         "-n")
 49                 ALLTARGET=allnoconfig
 50                 shift
 51                 continue
 52                 ;;
 53         "-m")
 54                 RUNMAKE=false
 55                 shift
 56                 continue
 57                 ;;
 58         "-h")
 59                 usage
 60                 exit
 61                 ;;
 62         "-r")
 63                 WARNREDUN=true
 64                 shift
 65                 continue
 66                 ;;
 67         "-y")
 68                 BUILTIN=true
 69                 shift
 70                 continue
 71                 ;;
 72         "-O")
 73                 if [ -d $2 ];then
 74                         OUTPUT=$(echo $2 | sed 's/\/*$//')
 75                 else
 76                         echo "output directory $2 does not exist" 1>&2
 77                         exit 1
 78                 fi
 79                 shift 2
 80                 continue
 81                 ;;
 82         "-s")
 83                 STRICT=true
 84                 shift
 85                 continue
 86                 ;;
 87         "-Q")
 88                 WARNOVERRIDE=true
 89                 shift
 90                 continue
 91                 ;;
 92         *)
 93                 break
 94                 ;;
 95         esac
 96 done
 97 
 98 if [ "$#" -lt 1 ] ; then
 99         usage
100         exit
101 fi
102 
103 if [ -z "$KCONFIG_CONFIG" ]; then
104         if [ "$OUTPUT" != . ]; then
105                 KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
106         else
107                 KCONFIG_CONFIG=.config
108         fi
109 fi
110 
111 INITFILE=$1
112 shift;
113 
114 if [ ! -r "$INITFILE" ]; then
115         echo "The base file '$INITFILE' does not exist.  Exit." >&2
116         exit 1
117 fi
118 
119 MERGE_LIST=$*
120 SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
121 SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
122 
123 TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
124 MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
125 
126 echo "Using $INITFILE as base"
127 
128 trap clean_up EXIT
129 
130 cat $INITFILE > $TMP_FILE
131 
132 # Merge files, printing warnings on overridden values
133 for ORIG_MERGE_FILE in $MERGE_LIST ; do
134         echo "Merging $ORIG_MERGE_FILE"
135         if [ ! -r "$ORIG_MERGE_FILE" ]; then
136                 echo "The merge file '$ORIG_MERGE_FILE' does not exist.  Exit." >&2
137                 exit 1
138         fi
139         cat $ORIG_MERGE_FILE > $MERGE_FILE
140         CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
141 
142         for CFG in $CFG_LIST ; do
143                 grep -q -w $CFG $TMP_FILE || continue
144                 PREV_VAL=$(grep -w $CFG $TMP_FILE)
145                 NEW_VAL=$(grep -w $CFG $MERGE_FILE)
146                 BUILTIN_FLAG=false
147                 if [ "$BUILTIN" = "true" ] && [ "${NEW_VAL#CONFIG_*=}" = "m" ] && [ "${PREV_VAL#CONFIG_*=}" = "y" ]; then
148                         ${WARNOVERRIDE} Previous  value: $PREV_VAL
149                         ${WARNOVERRIDE} New value:       $NEW_VAL
150                         ${WARNOVERRIDE} -y passed, will not demote y to m
151                         ${WARNOVERRIDE}
152                         BUILTIN_FLAG=true
153                 elif [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
154                         ${WARNOVERRIDE} Value of $CFG is redefined by fragment $ORIG_MERGE_FILE:
155                         ${WARNOVERRIDE} Previous  value: $PREV_VAL
156                         ${WARNOVERRIDE} New value:       $NEW_VAL
157                         ${WARNOVERRIDE}
158                         if [ "$STRICT" = "true" ]; then
159                                 STRICT_MODE_VIOLATED=true
160                         fi
161                 elif [ "$WARNREDUN" = "true" ]; then
162                         ${WARNOVERRIDE} Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
163                 fi
164                 if [ "$BUILTIN_FLAG" = "false" ]; then
165                         sed -i "/$CFG[ =]/d" $TMP_FILE
166                 else
167                         sed -i "/$CFG[ =]/d" $MERGE_FILE
168                 fi
169         done
170         # In case the previous file lacks a new line at the end
171         echo >> $TMP_FILE
172         cat $MERGE_FILE >> $TMP_FILE
173 done
174 
175 if [ "$STRICT_MODE_VIOLATED" = "true" ]; then
176         echo "The fragment redefined a value and strict mode had been passed."
177         exit 1
178 fi
179 
180 if [ "$RUNMAKE" = "false" ]; then
181         cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
182         echo "#"
183         echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
184         echo "#"
185         exit
186 fi
187 
188 # If we have an output dir, setup the O= argument, otherwise leave
189 # it blank, since O=. will create an unnecessary ./source softlink
190 OUTPUT_ARG=""
191 if [ "$OUTPUT" != "." ] ; then
192         OUTPUT_ARG="O=$OUTPUT"
193 fi
194 
195 
196 # Use the merged file as the starting point for:
197 # alldefconfig: Fills in any missing symbols with Kconfig default
198 # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
199 make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
200 
201 
202 # Check all specified config values took (might have missed-dependency issues)
203 for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
204 
205         REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
206         ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
207         if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
208                 echo "Value requested for $CFG not in final .config"
209                 echo "Requested value:  $REQUESTED_VAL"
210                 echo "Actual value:     $ACTUAL_VAL"
211                 echo ""
212         fi
213 done

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php