Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 |
Jeroen Hofstee | 16c429c | 2014-10-01 17:22:58 +0200 | [diff] [blame] | 72 | sed -n -e 's/^CONFIG_SPL=y$/spl/p' -e 's/^CONFIG_TPL=y$/tpl/p' \ |
| 73 | $KCONFIG_CONFIG |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 | |
Masahiro Yamada | 8caaec6 | 2014-09-04 22:16:15 +0900 | [diff] [blame] | 121 | if [ ! -r $defconfig_path ]; then |
| 122 | echo >&2 "***" |
York Sun | 703a08f | 2014-10-01 08:44:55 -0700 | [diff] [blame] | 123 | echo >&2 "*** Can't find default configuration \"configs/$1\"!" |
Masahiro Yamada | 8caaec6 | 2014-09-04 22:16:15 +0900 | [diff] [blame] | 124 | echo >&2 "***" |
| 125 | exit 1 |
| 126 | fi |
| 127 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 | |
Ian Campbell | cbdd9a9 | 2014-10-24 21:20:50 +0100 | [diff] [blame] | 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 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 190 | output_lines="$output_lines%$line" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 | |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 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=% |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 210 | # coalesce common lines together |
| 211 | for i in $output_lines |
| 212 | do |
| 213 | case "$i" in |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 214 | [+A-Z]*:$line) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 215 | tmp="$tmp%$unmatched" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 216 | i=$(echo "$i" | \ |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 217 | sed -e "s/^\([^:]*\)/\1$symbol/") |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 218 | tmp="$tmp%$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 219 | match=1 |
| 220 | ;; |
Masahiro Yamada | dee745b | 2014-09-04 05:41:33 +0900 | [diff] [blame] | 221 | $line) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 222 | tmp="$tmp%$unmatched" |
| 223 | tmp="$tmp%+$symbol:$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 224 | match=1 |
| 225 | ;; |
| 226 | *) |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 227 | tmp="$tmp%$i" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 228 | ;; |
| 229 | esac |
| 230 | done |
| 231 | |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 232 | # Restore the default separator for the outer for loop. |
| 233 | IFS=$save_IFS |
| 234 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 235 | if [ "$match" ]; then |
| 236 | output_lines="$tmp" |
| 237 | unmatched= |
| 238 | else |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 239 | unmatched="$unmatched%$symbol:$line" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 240 | fi |
| 241 | done < defconfig |
Masahiro Yamada | 717a23b | 2014-09-26 18:42:36 +0900 | [diff] [blame] | 242 | |
| 243 | output_lines="$output_lines%$unmatched" |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 244 | done |
| 245 | |
| 246 | rm -f defconfig |
Masahiro Yamada | 93481b9 | 2014-09-04 05:41:31 +0900 | [diff] [blame] | 247 | touch defconfig |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 248 | |
| 249 | save_IFS=$IFS |
| 250 | IFS=% |
| 251 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 252 | for line in $output_lines |
| 253 | do |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 254 | case "$line" in |
| 255 | "") |
| 256 | # do not output blank lines |
| 257 | ;; |
| 258 | *) |
| 259 | echo $line >> defconfig |
| 260 | ;; |
| 261 | esac |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 262 | done |
Masahiro Yamada | 8dffe66 | 2014-09-04 05:41:32 +0900 | [diff] [blame] | 263 | |
| 264 | IFS=$save_IFS |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 265 | } |
| 266 | |
Masahiro Yamada | 11b5db6 | 2014-09-10 18:13:10 +0900 | [diff] [blame] | 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 | |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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%/*} |
Masahiro Yamada | 11b5db6 | 2014-09-10 18:13:10 +0900 | [diff] [blame] | 309 | check_enabled_subimage $1 $objdir |
Masahiro Yamada | 0732b2f | 2014-10-24 01:30:45 +0900 | [diff] [blame] | 310 | |
| 311 | if [ -f "$objdir/$KCONFIG_CONFIG" ]; then |
| 312 | timestamp_before=$(stat --printf="%Y" \ |
| 313 | $objdir/$KCONFIG_CONFIG) |
| 314 | fi |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 315 | fi |
| 316 | |
| 317 | run_make_config $target $objdir |
Masahiro Yamada | 0732b2f | 2014-10-24 01:30:45 +0900 | [diff] [blame] | 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 |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 328 | } |
| 329 | |
| 330 | progname=$(basename $0) |
| 331 | target=$1 |
| 332 | |
| 333 | case $target in |
| 334 | *_defconfig) |
| 335 | do_board_defconfig $target;; |
Ian Campbell | cbdd9a9 | 2014-10-24 21:20:50 +0100 | [diff] [blame] | 336 | *_felconfig) |
| 337 | do_board_felconfig $target;; |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 338 | *_config) |
Masahiro Yamada | d1b60d3 | 2014-08-28 10:56:55 +0900 | [diff] [blame] | 339 | # backward compatibility |
Masahiro Yamada | 3ff291f | 2014-08-21 11:44:34 +0900 | [diff] [blame] | 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 |