hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/scripts/kconfig/merge_config.sh
....@@ -1,4 +1,6 @@
11 #!/bin/sh
2
+# SPDX-License-Identifier: GPL-2.0
3
+#
24 # merge_config.sh - Takes a list of config fragment values, and merges
35 # them one by one. Provides warnings on overridden values, and specified
46 # values that did not make it to the resulting .config file (due to missed
....@@ -10,21 +12,13 @@
1012 #
1113 # Copyright (c) 2009-2010 Wind River Systems, Inc.
1214 # Copyright 2011 Linaro
13
-#
14
-# This program is free software; you can redistribute it and/or modify
15
-# it under the terms of the GNU General Public License version 2 as
16
-# published by the Free Software Foundation.
17
-#
18
-# This program is distributed in the hope that it will be useful,
19
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
20
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21
-# See the GNU General Public License for more details.
15
+
16
+set -e
2217
2318 clean_up() {
2419 rm -f $TMP_FILE
25
- exit
20
+ rm -f $MERGE_FILE
2621 }
27
-trap clean_up HUP INT TERM
2822
2923 usage() {
3024 echo "Usage: $0 [OPTIONS] [CONFIG [...]]"
....@@ -32,13 +26,20 @@
3226 echo " -m only merge the fragments, do not execute the make command"
3327 echo " -n use allnoconfig instead of alldefconfig"
3428 echo " -r list redundant entries when merging fragments"
29
+ echo " -y make builtin have precedence over modules"
3530 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."
3634 }
3735
3836 RUNMAKE=true
3937 ALLTARGET=alldefconfig
4038 WARNREDUN=false
39
+BUILTIN=false
4140 OUTPUT=.
41
+STRICT=false
42
+CONFIG_PREFIX=${CONFIG_-CONFIG_}
4243
4344 while true; do
4445 case $1 in
....@@ -61,6 +62,11 @@
6162 shift
6263 continue
6364 ;;
65
+ "-y")
66
+ BUILTIN=true
67
+ shift
68
+ continue
69
+ ;;
6470 "-O")
6571 if [ -d $2 ];then
6672 OUTPUT=$(echo $2 | sed 's/\/*$//')
....@@ -69,6 +75,11 @@
6975 exit 1
7076 fi
7177 shift 2
78
+ continue
79
+ ;;
80
+ "-s")
81
+ STRICT=true
82
+ shift
7283 continue
7384 ;;
7485 *)
....@@ -99,44 +110,69 @@
99110 fi
100111
101112 MERGE_LIST=$*
102
-SED_CONFIG_EXP="s/^\(# \)\{0,1\}\(CONFIG_[a-zA-Z0-9_]*\)[= ].*/\2/p"
113
+SED_CONFIG_EXP1="s/^\(${CONFIG_PREFIX}[a-zA-Z0-9_]*\)=.*/\1/p"
114
+SED_CONFIG_EXP2="s/^# \(${CONFIG_PREFIX}[a-zA-Z0-9_]*\) is not set$/\1/p"
115
+
103116 TMP_FILE=$(mktemp ./.tmp.config.XXXXXXXXXX)
117
+MERGE_FILE=$(mktemp ./.merge_tmp.config.XXXXXXXXXX)
104118
105119 echo "Using $INITFILE as base"
120
+
121
+trap clean_up EXIT
122
+
106123 cat $INITFILE > $TMP_FILE
107124
108125 # Merge files, printing warnings on overridden values
109
-for MERGE_FILE in $MERGE_LIST ; do
110
- echo "Merging $MERGE_FILE"
111
- if [ ! -r "$MERGE_FILE" ]; then
112
- echo "The merge file '$MERGE_FILE' does not exist. Exit." >&2
126
+for 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
113130 exit 1
114131 fi
115
- CFG_LIST=$(sed -n "$SED_CONFIG_EXP" $MERGE_FILE)
132
+ cat $ORIG_MERGE_FILE > $MERGE_FILE
133
+ CFG_LIST=$(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $MERGE_FILE)
116134
117135 for CFG in $CFG_LIST ; do
118136 grep -q -w $CFG $TMP_FILE || continue
119137 PREV_VAL=$(grep -w $CFG $TMP_FILE)
120138 NEW_VAL=$(grep -w $CFG $MERGE_FILE)
121
- if [ "x$PREV_VAL" != "x$NEW_VAL" ] ; then
122
- echo Value of $CFG is redefined by fragment $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:
123148 echo Previous value: $PREV_VAL
124149 echo New value: $NEW_VAL
125150 echo
151
+ if [ "$STRICT" = "true" ]; then
152
+ STRICT_MODE_VIOLATED=true
153
+ fi
126154 elif [ "$WARNREDUN" = "true" ]; then
127
- echo Value of $CFG is redundant by fragment $MERGE_FILE:
155
+ echo Value of $CFG is redundant by fragment $ORIG_MERGE_FILE:
128156 fi
129
- sed -i "/$CFG[ =]/d" $TMP_FILE
157
+ if [ "$BUILTIN_FLAG" = "false" ]; then
158
+ sed -i "/$CFG[ =]/d" $TMP_FILE
159
+ else
160
+ sed -i "/$CFG[ =]/d" $MERGE_FILE
161
+ fi
130162 done
131163 cat $MERGE_FILE >> $TMP_FILE
132164 done
165
+
166
+if [ "$STRICT_MODE_VIOLATED" = "true" ]; then
167
+ echo "The fragment redefined a value and strict mode had been passed."
168
+ exit 1
169
+fi
133170
134171 if [ "$RUNMAKE" = "false" ]; then
135172 cp -T -- "$TMP_FILE" "$KCONFIG_CONFIG"
136173 echo "#"
137174 echo "# merged configuration written to $KCONFIG_CONFIG (needs make)"
138175 echo "#"
139
- clean_up
140176 exit
141177 fi
142178
....@@ -155,10 +191,10 @@
155191
156192
157193 # Check all specified config values took (might have missed-dependency issues)
158
-for CFG in $(sed -n "$SED_CONFIG_EXP" $TMP_FILE); do
194
+for CFG in $(sed -n -e "$SED_CONFIG_EXP1" -e "$SED_CONFIG_EXP2" $TMP_FILE); do
159195
160196 REQUESTED_VAL=$(grep -w -e "$CFG" $TMP_FILE)
161
- ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG")
197
+ ACTUAL_VAL=$(grep -w -e "$CFG" "$KCONFIG_CONFIG" || true)
162198 if [ "x$REQUESTED_VAL" != "x$ACTUAL_VAL" ] ; then
163199 echo "Value requested for $CFG not in final .config"
164200 echo "Requested value: $REQUESTED_VAL"
....@@ -166,5 +202,3 @@
166202 echo ""
167203 fi
168204 done
169
-
170
-clean_up