#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Another Bourne-like Shell"

choice
	prompt "Choose your default shell"
	default CONFIG_FEATURE_SH_IS_NONE
	help
	  Choose a shell. The ash shell is the most bash compatible
	  and full featured.

config CONFIG_FEATURE_SH_IS_ASH
	bool "ash"

config CONFIG_FEATURE_SH_IS_HUSH
	bool "hush"

config CONFIG_FEATURE_SH_IS_LASH
	bool "lash"

config CONFIG_FEATURE_SH_IS_MSH
	bool "msh"

config CONFIG_FEATURE_SH_IS_NONE
	bool "none"

endchoice

if CONFIG_FEATURE_SH_IS_ASH
	config CONFIG_ASH
	default y

	comment "ash (forced enabled as default shell)"
endif
	
if !CONFIG_FEATURE_SH_IS_ASH
config CONFIG_ASH
	bool "ash"
	default y
	help
	  Make sh a link to ash.
endif

comment "Ash Shell Options"
	depends on CONFIG_ASH

config CONFIG_ASH_JOB_CONTROL
	bool "  Enable Job control"
	default y
	depends on CONFIG_ASH
	help
	  Enable job control in the ash shell.

config CONFIG_ASH_ALIAS
	bool "  Enable alias support"
	default y
	depends on CONFIG_ASH
	help
	  Enable alias support in the ash shell.

config CONFIG_ASH_MATH_SUPPORT
	bool "  Enable Posix math support"
	default y
	depends on CONFIG_ASH
	help
	  Enable math support in the ash shell.

config CONFIG_ASH_GETOPTS
	bool "  Enable getopt builtin to parse positional parameters"
	default n
	depends on CONFIG_ASH
	help
	  Enable builtin getopt in the ash shell.

config CONFIG_ASH_CMDCMD
	bool "  Enable cmdcmd to override shell builtins"
	default n
	depends on CONFIG_ASH
	help
	  Enable support for the ash 'command' builtin, which allows
	  you to run the specified command with the specified arguments,
	  even when there is an ash builtin command with the same name.

config CONFIG_ASH_MAIL
	bool "  Check for new mail on interactive shells"
	default y
	depends on CONFIG_ASH
	help
	  Enable "check for new mail" in the ash shell.

config CONFIG_ASH_OPTIMIZE_FOR_SIZE
	bool "  Optimize for size instead of speed"
	default y
	depends on CONFIG_ASH
	help
	  Compile ash for reduced size at price of speed.

if CONFIG_FEATURE_SH_IS_HUSH
	config CONFIG_HUSH
	default y

	comment "hush (forced enabled as default shell)"
endif
	
if !CONFIG_FEATURE_SH_IS_HUSH
config CONFIG_HUSH
	bool "hush"
	default n
	help
	  Make sh a link to hush.
endif

if CONFIG_FEATURE_SH_IS_LASH
	config CONFIG_LASH
	default y

	comment "lash (forced enabled as default shell)"
endif

if !CONFIG_FEATURE_SH_IS_LASH
config CONFIG_LASH
	bool "lash"
	default n
	help
	  Make sh a link to lash.
endif

if CONFIG_FEATURE_SH_IS_MSH
	config CONFIG_MSH
	default y

	comment "msh (forced enabled as default shell)"
endif

if !CONFIG_FEATURE_SH_IS_MSH
config CONFIG_MSH
	bool "msh"
	default n
	help
	  Make sh a link to msh.
endif


comment "Bourne Shell Options"
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH

config CONFIG_FEATURE_COMMAND_EDITING
	bool "command line editing"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable command editing in shell.

config CONFIG_FEATURE_COMMAND_SAVEHISTORY
	bool "  history saving"
	default n
	depends on CONFIG_ASH
	help
	  Enable history saving in ash shell.

config CONFIG_FEATURE_COMMAND_TAB_COMPLETION
	bool "tab completion"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable tab completion in shell.

config CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
	bool "username completion"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Enable username completion in shell.

config CONFIG_FEATURE_COMMAND_HISTORY
	int "history size"
	default 15
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Specify command history size in shell.

config CONFIG_FEATURE_SH_STANDALONE_SHELL
	bool "Standalone shell"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Have all the busybox commands built into the shell, creating
	  a standalone shell.

config CONFIG_FEATURE_SH_APPLETS_ALWAYS_WIN
	bool "Standalone shell -- applets always win"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Use a command builtin to the shell over one with the same name,
	  that may be on the system.

config CONFIG_FEATURE_SH_FANCY_PROMPT
	bool "Fancy shell prompts"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Setting this option allows for prompts to use things like \w and
	  \$ and also using escape codes.

config CONFIG_FEATURE_SH_EXTRA_QUIET
	bool "Hide message on interactive shell startup"
	default n
	depends on CONFIG_MSH || CONFIG_LASH || CONFIG_HUSH || CONFIG_ASH
	help
	  Remove the busybox introduction when starting a shell.

endmenu

