#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "U-Boot $UBOOTVERSION Configuration"

config UBOOTVERSION
	string
	option env="UBOOTVERSION"

config KCONFIG_OBJDIR
	string
	option env="KCONFIG_OBJDIR"

menu "General setup"

config LOCALVERSION
	string "Local version - append to U-Boot release"
	depends on !SPL_BUILD
	help
	  Append an extra string to the end of your U-Boot version.
	  This will show up on your boot log, for example.
	  The string you set here will be appended after the contents of
	  any files with a filename matching localversion* in your
	  object and source tree, in that order.  Your total string can
	  be a maximum of 64 characters.

config LOCALVERSION_AUTO
	bool "Automatically append version information to the version string"
	depends on !SPL_BUILD
	default y
	help
	  This will try to automatically determine if the current tree is a
	  release tree by looking for git tags that belong to the current
	  top of tree revision.

	  A string of the format -gxxxxxxxx will be added to the localversion
	  if a git-based tree is found.  The string generated by this will be
	  appended after any matching localversion* files, and after the value
	  set in CONFIG_LOCALVERSION.

	  (The actual string used here is the first eight characters produced
	  by running the command:

	    $ git rev-parse --verify HEAD

	  which is done within the script "scripts/setlocalversion".)

config CC_OPTIMIZE_FOR_SIZE
	bool "Optimize for size"
	depends on !SPL_BUILD
	default y
	help
	  Enabling this option will pass "-Os" instead of "-O2" to gcc
	  resulting in a smaller U-Boot image.

	  This option is enabled by default for U-Boot.

endmenu		# General setup

menu "Boot images"

config SPL_BUILD
	bool
	depends on $KCONFIG_OBJDIR="spl" || $KCONFIG_OBJDIR="tpl"
	default y

config TPL_BUILD
	bool
	depends on $KCONFIG_OBJDIR="tpl"
	default y

config SUPPORT_SPL
	bool

config SUPPORT_TPL
	bool

config SPL
	bool
	depends on SUPPORT_SPL
	prompt "Enable SPL" if !SPL_BUILD
	default y if SPL_BUILD
	help
	  If you want to build SPL as well as the normal image, say Y.

config TPL
	bool
	depends on SPL && SUPPORT_TPL
	prompt "Enable TPL" if !SPL_BUILD
	default y if TPL_BUILD
	default n
	help
	  If you want to build TPL as well as the normal image and SPL, say Y.

config SYS_EXTRA_OPTIONS
	string "Extra Options (DEPRECATED)"
	depends on !SPL_BUILD
	help
	  The old configuration infrastructure (= mkconfig + boards.cfg)
	  provided the extra options field. If you have something like
	  "HAS_BAR,BAZ=64", the optional options
	    #define CONFIG_HAS
	    #define CONFIG_BAZ	64
	  will be defined in include/config.h.
	  This option was prepared for the smooth migration from the old
	  configuration to Kconfig. Since this option will be removed sometime,
	  new boards should not use this option.

config SYS_TEXT_BASE
	depends on SPARC
	hex "Text Base"
	help
	  TODO: Move CONFIG_SYS_TEXT_BASE for all the architecture

endmenu		# Boot images

source "arch/Kconfig"

source "common/Kconfig"

source "dts/Kconfig"

source "net/Kconfig"

source "drivers/Kconfig"

source "fs/Kconfig"

source "lib/Kconfig"
