hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#!/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 "  -s    strict mode. Fail if the fragment redefines any value."
   echo
   echo "Used prefix: '$CONFIG_PREFIX'. You can redefine it with \$CONFIG_ environment variable."
}
 
RUNMAKE=true
ALLTARGET=alldefconfig
WARNREDUN=false
BUILTIN=false
OUTPUT=.
STRICT=false
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
       ;;
   "-s")
       STRICT=true
       shift
       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
           if [ "$STRICT" = "true" ]; then
               STRICT_MODE_VIOLATED=true
           fi
       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 [ "$STRICT_MODE_VIOLATED" = "true" ]; then
   echo "The fragment redefined a value and strict mode had been passed."
   exit 1
fi
 
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