]>
Commit | Line | Data |
---|---|---|
3ff291f3 MY |
1 | #!/bin/sh |
2 | # | |
3 | # A wrapper script to adjust Kconfig for U-Boot | |
4 | # | |
5 | # Instead of touching various parts under the scripts/kconfig/ directory, | |
6 | # pushing necessary adjustments into this single script would be better | |
7 | # for code maintainance. All the make targets related to the configuration | |
8 | # (make %config) should be invoked via this script. | |
9 | # See doc/README.kconfig for further information of Kconfig. | |
10 | # | |
11 | # Copyright (C) 2014, Masahiro Yamada <yamada.m@jp.panasonic.com> | |
12 | # | |
13 | # SPDX-License-Identifier: GPL-2.0+ | |
14 | # | |
15 | ||
16 | set -e | |
17 | ||
18 | # Set "DEBUG" enavironment variable to show debug messages | |
19 | debug () { | |
20 | if [ $DEBUG ]; then | |
21 | echo "$@" | |
22 | fi | |
23 | } | |
24 | ||
25 | # Useful shorthands | |
26 | build () { | |
27 | debug $progname: $MAKE -f $srctree/scripts/Makefile.build obj="$@" | |
28 | $MAKE -f $srctree/scripts/Makefile.build obj="$@" | |
29 | } | |
30 | ||
31 | autoconf () { | |
32 | debug $progname: $MAKE -f $srctree/scripts/Makefile.autoconf obj="$@" | |
33 | $MAKE -f $srctree/scripts/Makefile.autoconf obj="$@" | |
34 | } | |
35 | ||
36 | # Make a configuration target | |
37 | # Usage: | |
38 | # run_make_config <target> <objdir> | |
39 | # <target>: Make target such as "config", "menuconfig", "defconfig", etc. | |
40 | # <objdir>: Target directory where the make command is run. | |
41 | # Typically "", "spl", "tpl" for Normal, SPL, TPL, respectively. | |
42 | run_make_config () { | |
43 | target=$1 | |
44 | objdir=$2 | |
45 | ||
46 | # Linux expects defconfig files in arch/$(SRCARCH)/configs/ directory, | |
47 | # but U-Boot has them in configs/ directory. | |
48 | # Give SRCARCH=.. to fake scripts/kconfig/Makefile. | |
49 | options="SRCARCH=.. KCONFIG_OBJDIR=$objdir" | |
50 | if [ "$objdir" ]; then | |
51 | options="$options KCONFIG_CONFIG=$objdir/$KCONFIG_CONFIG" | |
52 | mkdir -p $objdir | |
53 | fi | |
54 | ||
55 | build scripts/kconfig $options $target | |
56 | } | |
57 | ||
58 | # Parse .config file to detect if CONFIG_SPL, CONFIG_TPL is enabled | |
59 | # and returns: | |
60 | # "" if neither CONFIG_SPL nor CONFIG_TPL is defined | |
61 | # "spl" if CONFIG_SPL is defined but CONFIG_TPL is not | |
62 | # "spl tpl" if both CONFIG_SPL and CONFIG_TPL are defined | |
63 | get_enabled_subimages() { | |
64 | if [ ! -r "$KCONFIG_CONFIG" ]; then | |
65 | # This should never happen | |
66 | echo "$progname: $KCONFIG_CONFIG not found" >&2 | |
67 | exit 1 | |
68 | fi | |
69 | ||
70 | # CONFIG_SPL=y -> spl | |
71 | # CONFIG_TPL=y -> tpl | |
16c429c9 JH |
72 | sed -n -e 's/^CONFIG_SPL=y$/spl/p' -e 's/^CONFIG_TPL=y$/tpl/p' \ |
73 | $KCONFIG_CONFIG | |
3ff291f3 MY |
74 | } |
75 | ||
76 | do_silentoldconfig () { | |
77 | run_make_config silentoldconfig | |
78 | subimages=$(get_enabled_subimages) | |
79 | ||
80 | for obj in $subimages | |
81 | do | |
82 | mkdir -p $obj/include/config $obj/include/generated | |
83 | run_make_config silentoldconfig $obj | |
84 | done | |
85 | ||
86 | # If the following part fails, include/config/auto.conf should be | |
87 | # deleted so "make silentoldconfig" will be re-run on the next build. | |
88 | autoconf include include/autoconf.mk include/autoconf.mk.dep || { | |
89 | rm -f include/config/auto.conf | |
90 | exit 1 | |
91 | } | |
92 | ||
93 | # include/config.h has been updated after "make silentoldconfig". | |
94 | # We need to touch include/config/auto.conf so it gets newer | |
95 | # than include/config.h. | |
96 | # Otherwise, 'make silentoldconfig' would be invoked twice. | |
97 | touch include/config/auto.conf | |
98 | ||
99 | for obj in $subimages | |
100 | do | |
101 | autoconf $obj/include $obj/include/autoconf.mk || { | |
102 | rm -f include/config/auto.conf | |
103 | exit 1 | |
104 | } | |
105 | done | |
106 | } | |
107 | ||
108 | cleanup_after_defconfig () { | |
109 | rm -f configs/.tmp_defconfig | |
110 | # ignore 'Directory not empty' error | |
111 | # without using non-POSIX option '--ignore-fail-on-non-empty' | |
112 | rmdir arch configs 2>/dev/null || true | |
113 | } | |
114 | ||
115 | # Usage: | |
116 | # do_board_defconfig <board>_defconfig | |
117 | do_board_defconfig () { | |
118 | defconfig_path=$srctree/configs/$1 | |
119 | tmp_defconfig_path=configs/.tmp_defconfig | |
120 | ||
8caaec62 MY |
121 | if [ ! -r $defconfig_path ]; then |
122 | echo >&2 "***" | |
703a08f2 | 123 | echo >&2 "*** Can't find default configuration \"configs/$1\"!" |
8caaec62 MY |
124 | echo >&2 "***" |
125 | exit 1 | |
126 | fi | |
127 | ||
3ff291f3 MY |
128 | mkdir -p arch configs |
129 | # defconfig for Normal: | |
130 | # pick lines without prefixes and lines starting '+' prefix | |
131 | # and rip the prefixes off. | |
132 | sed -n -e '/^[+A-Z]*:/!p' -e 's/^+[A-Z]*://p' $defconfig_path \ | |
133 | > configs/.tmp_defconfig | |
134 | ||
135 | run_make_config .tmp_defconfig || { | |
136 | cleanup_after_defconfig | |
137 | exit 1 | |
138 | } | |
139 | ||
140 | for img in $(get_enabled_subimages) | |
141 | do | |
142 | symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]') | |
143 | # defconfig for SPL, TPL: | |
144 | # pick lines with 'S', 'T' prefix and rip the prefixes off | |
145 | sed -n -e 's/^[+A-Z]*'$symbol'[A-Z]*://p' $defconfig_path \ | |
146 | > configs/.tmp_defconfig | |
147 | run_make_config .tmp_defconfig $img || { | |
148 | cleanup_after_defconfig | |
149 | exit 1 | |
150 | } | |
151 | done | |
152 | ||
153 | cleanup_after_defconfig | |
154 | } | |
155 | ||
156 | do_defconfig () { | |
157 | if [ "$KBUILD_DEFCONFIG" ]; then | |
158 | do_board_defconfig $KBUILD_DEFCONFIG | |
159 | echo "*** Default configuration is based on '$KBUILD_DEFCONFIG'" | |
160 | else | |
161 | run_make_config defconfig | |
162 | fi | |
163 | } | |
164 | ||
cbdd9a97 IC |
165 | do_board_felconfig () { |
166 | do_board_defconfig ${1%%_felconfig}_defconfig | |
167 | if ! grep -q CONFIG_ARCH_SUNXI=y .config || ! grep -q CONFIG_SPL=y .config ; then | |
168 | echo "$progname: Cannot felconfig a non-sunxi or non-SPL platform" >&2 | |
169 | exit 1 | |
170 | fi | |
171 | sed -i -e 's/\# CONFIG_SPL_FEL is not set/CONFIG_SPL_FEL=y/g' \ | |
172 | .config spl/.config | |
173 | } | |
174 | ||
3ff291f3 MY |
175 | do_savedefconfig () { |
176 | if [ -r "$KCONFIG_CONFIG" ]; then | |
177 | subimages=$(get_enabled_subimages) | |
178 | else | |
179 | subimages= | |
180 | fi | |
181 | ||
182 | run_make_config savedefconfig | |
183 | ||
184 | output_lines= | |
185 | ||
186 | # -r option is necessay because some string-type configs may include | |
187 | # backslashes as an escape character | |
188 | while read -r line | |
189 | do | |
8dffe663 | 190 | output_lines="$output_lines%$line" |
3ff291f3 MY |
191 | done < defconfig |
192 | ||
193 | for img in $subimages | |
194 | do | |
195 | run_make_config savedefconfig $img | |
196 | ||
197 | symbol=$(echo $img | cut -c 1 | tr '[a-z]' '[A-Z]') | |
198 | unmatched= | |
199 | ||
200 | while read -r line | |
201 | do | |
202 | tmp= | |
203 | match= | |
204 | ||
8dffe663 MY |
205 | # "# CONFIG_FOO is not set" should not be divided. |
206 | # Use "%" as a separator, instead of a whitespace. | |
207 | # "%" is unlikely to appear in defconfig context. | |
208 | save_IFS=$IFS | |
209 | IFS=% | |
3ff291f3 MY |
210 | # coalesce common lines together |
211 | for i in $output_lines | |
212 | do | |
213 | case "$i" in | |
dee745bf | 214 | [+A-Z]*:$line) |
8dffe663 | 215 | tmp="$tmp%$unmatched" |
3ff291f3 | 216 | i=$(echo "$i" | \ |
dee745bf | 217 | sed -e "s/^\([^:]*\)/\1$symbol/") |
8dffe663 | 218 | tmp="$tmp%$i" |
3ff291f3 MY |
219 | match=1 |
220 | ;; | |
dee745bf | 221 | $line) |
8dffe663 MY |
222 | tmp="$tmp%$unmatched" |
223 | tmp="$tmp%+$symbol:$i" | |
3ff291f3 MY |
224 | match=1 |
225 | ;; | |
226 | *) | |
8dffe663 | 227 | tmp="$tmp%$i" |
3ff291f3 MY |
228 | ;; |
229 | esac | |
230 | done | |
231 | ||
8dffe663 MY |
232 | # Restore the default separator for the outer for loop. |
233 | IFS=$save_IFS | |
234 | ||
3ff291f3 MY |
235 | if [ "$match" ]; then |
236 | output_lines="$tmp" | |
237 | unmatched= | |
238 | else | |
8dffe663 | 239 | unmatched="$unmatched%$symbol:$line" |
3ff291f3 MY |
240 | fi |
241 | done < defconfig | |
717a23b8 MY |
242 | |
243 | output_lines="$output_lines%$unmatched" | |
3ff291f3 MY |
244 | done |
245 | ||
246 | rm -f defconfig | |
93481b9f | 247 | touch defconfig |
8dffe663 MY |
248 | |
249 | save_IFS=$IFS | |
250 | IFS=% | |
251 | ||
3ff291f3 MY |
252 | for line in $output_lines |
253 | do | |
8dffe663 MY |
254 | case "$line" in |
255 | "") | |
256 | # do not output blank lines | |
257 | ;; | |
258 | *) | |
259 | echo $line >> defconfig | |
260 | ;; | |
261 | esac | |
3ff291f3 | 262 | done |
8dffe663 MY |
263 | |
264 | IFS=$save_IFS | |
3ff291f3 MY |
265 | } |
266 | ||
11b5db67 MY |
267 | # Some sanity checks before running "make <objdir>/<target>", |
268 | # where <objdir> should be either "spl" or "tpl". | |
269 | # Doing "make spl/menuconfig" etc. on a non-SPL board makes no sense. | |
270 | # It should be allowed only when ".config" exists and "CONFIG_SPL" is enabled. | |
271 | # | |
272 | # Usage: | |
273 | # check_enabled_sumbimage <objdir>/<target> <objdir> | |
274 | check_enabled_subimage () { | |
275 | ||
276 | case $2 in | |
277 | spl|tpl) ;; | |
278 | *) | |
279 | echo >&2 "***" | |
280 | echo >&2 "*** \"make $1\" is not supported." | |
281 | echo >&2 "***" | |
282 | exit 1 | |
283 | ;; | |
284 | esac | |
285 | test -r "$KCONFIG_CONFIG" && get_enabled_subimages | grep -q $2 || { | |
286 | config=CONFIG_$(echo $2 | tr '[a-z]' '[A-Z]') | |
287 | ||
288 | echo >&2 "***" | |
289 | echo >&2 "*** Create \"$KCONFIG_CONFIG\" with \"$config\" enabled" | |
290 | echo >&2 "*** before \"make $1\"." | |
291 | echo >&2 "***" | |
292 | exit 1 | |
293 | } | |
294 | } | |
295 | ||
3ff291f3 MY |
296 | # Usage: |
297 | # do_others <objdir>/<target> | |
298 | # The field "<objdir>/" is typically empy, "spl/", "tpl/" for Normal, SPL, TPL, | |
299 | # respectively. | |
300 | # The field "<target>" is a configuration target such as "config", | |
301 | # "menuconfig", etc. | |
302 | do_others () { | |
303 | target=${1##*/} | |
304 | ||
305 | if [ "$target" = "$1" ]; then | |
306 | objdir= | |
307 | else | |
308 | objdir=${1%/*} | |
11b5db67 | 309 | check_enabled_subimage $1 $objdir |
0732b2f9 MY |
310 | |
311 | if [ -f "$objdir/$KCONFIG_CONFIG" ]; then | |
312 | timestamp_before=$(stat --printf="%Y" \ | |
313 | $objdir/$KCONFIG_CONFIG) | |
314 | fi | |
3ff291f3 MY |
315 | fi |
316 | ||
317 | run_make_config $target $objdir | |
0732b2f9 MY |
318 | |
319 | if [ "$timestamp_before" -a -f "$objdir/$KCONFIG_CONFIG" ]; then | |
320 | timestamp_after=$(stat --printf="%Y" $objdir/$KCONFIG_CONFIG) | |
321 | ||
322 | if [ "$timestamp_after" -gt "$timestamp_before" ]; then | |
323 | # $objdir/.config has been updated. | |
324 | # touch .config to invoke "make silentoldconfig" | |
325 | touch $KCONFIG_CONFIG | |
326 | fi | |
327 | fi | |
3ff291f3 MY |
328 | } |
329 | ||
330 | progname=$(basename $0) | |
331 | target=$1 | |
332 | ||
333 | case $target in | |
334 | *_defconfig) | |
335 | do_board_defconfig $target;; | |
cbdd9a97 IC |
336 | *_felconfig) |
337 | do_board_felconfig $target;; | |
3ff291f3 | 338 | *_config) |
d1b60d34 | 339 | # backward compatibility |
3ff291f3 MY |
340 | do_board_defconfig ${target%_config}_defconfig;; |
341 | silentoldconfig) | |
342 | do_silentoldconfig;; | |
343 | defconfig) | |
344 | do_defconfig;; | |
345 | savedefconfig) | |
346 | do_savedefconfig;; | |
347 | *) | |
348 | do_others $target;; | |
349 | esac |