#
# For a description of the syntax of this configuration file,
# see docs/Kconfig-language.txt.
#

menu "Shells"


choice
	prompt "Choose which shell is aliased to 'sh' name"
	default SH_IS_ASH
	help
	Choose which shell you want to be executed by 'sh' alias.
	The ash shell is the most bash compatible and full featured one.

# note: cannot use "select ASH" here, it breaks "make allnoconfig"
config SH_IS_ASH
	depends on !NOMMU
	bool "ash"
	select SHELL_ASH
	help
	Choose ash to be the shell executed by 'sh' name.
	The ash code will be built into busybox. If you don't select
	"ash" choice (CONFIG_ASH), this shell may only be invoked by
	the name 'sh' (and not 'ash').

config SH_IS_HUSH
	bool "hush"
	select SHELL_HUSH
	help
	Choose hush to be the shell executed by 'sh' name.
	The hush code will be built into busybox. If you don't select
	"hush" choice (CONFIG_HUSH), this shell may only be invoked by
	the name 'sh' (and not 'hush').

config SH_IS_NONE
	bool "none"

endchoice

choice
	prompt "Choose which shell is aliased to 'bash' name"
	default BASH_IS_NONE
	help
	Choose which shell you want to be executed by 'bash' alias.
	The ash shell is the most bash compatible and full featured one,
	although compatibility is far from being complete.

	Note that selecting this option does not switch on any bash
	compatibility code. It merely makes it possible to install
	/bin/bash (sym)link and run scripts which start with
	#!/bin/bash line.

	Many systems use it in scripts which use bash-specific features,
	even simple ones like $RANDOM. Without this option, busybox
	can't be used for running them because it won't recongnize
	"bash" as a supported applet name.

config BASH_IS_ASH
	depends on !NOMMU
	bool "ash"
	select SHELL_ASH
	help
	Choose ash to be the shell executed by 'bash' name.
	The ash code will be built into busybox. If you don't select
	"ash" choice (CONFIG_ASH), this shell may only be invoked by
	the name 'bash' (and not 'ash').

config BASH_IS_HUSH
	bool "hush"
	select SHELL_HUSH
	help
	Choose hush to be the shell executed by 'bash' name.
	The hush code will be built into busybox. If you don't select
	"hush" choice (CONFIG_HUSH), this shell may only be invoked by
	the name 'bash' (and not 'hush').

config BASH_IS_NONE
	bool "none"

endchoice


INSERT


comment "Options common to all shells"
if SHELL_ASH || SHELL_HUSH

config FEATURE_SH_MATH
	bool "POSIX math support"
	default y
	depends on SHELL_ASH || SHELL_HUSH
	help
	Enable math support in the shell via $((...)) syntax.

config FEATURE_SH_MATH_64
	bool "Extend POSIX math support to 64 bit"
	default y
	depends on FEATURE_SH_MATH
	help
	Enable 64-bit math support in the shell. This will make the shell
	slightly larger, but will allow computation with very large numbers.
	This is not in POSIX, so do not rely on this in portable code.

config FEATURE_SH_MATH_BASE
	bool "Support BASE#nnnn literals"
	default y
	depends on FEATURE_SH_MATH

config FEATURE_SH_EXTRA_QUIET
	bool "Hide message on interactive shell startup"
	default y
	depends on SHELL_ASH || SHELL_HUSH
	help
	Remove the busybox introduction when starting a shell.

config FEATURE_SH_STANDALONE
	bool "Standalone shell"
	default n
	depends on SHELL_ASH || SHELL_HUSH
	help
	This option causes busybox shells to use busybox applets
	in preference to executables in the PATH whenever possible. For
	example, entering the command 'ifconfig' into the shell would cause
	busybox to use the ifconfig busybox applet. Specifying the fully
	qualified executable name, such as '/sbin/ifconfig' will still
	execute the /sbin/ifconfig executable on the filesystem. This option
	is generally used when creating a statically linked version of busybox
	for use as a rescue shell, in the event that you screw up your system.

	This is implemented by re-execing /proc/self/exe (typically)
	with right parameters.

	However, there are drawbacks: it is problematic in chroot jails
	without mounted /proc, and ps/top may show command name as 'exe'
	for applets started this way.

config FEATURE_SH_NOFORK
	bool "Run 'nofork' applets directly"
	default n
	depends on SHELL_ASH || SHELL_HUSH
	help
	This option causes busybox shells to not execute typical
	fork/exec/wait sequence, but call <applet>_main directly,
	if possible. (Sometimes it is not possible: for example,
	this is not possible in pipes).

	This will be done only for some applets (those which are marked
	NOFORK in include/applets.h).

	This may significantly speed up some shell scripts.

	This feature is relatively new. Use with care. Report bugs
	to project mailing list.

config FEATURE_SH_READ_FRAC
	bool "read -t N.NNN support (+110 bytes)"
	default y
	depends on SHELL_ASH || SHELL_HUSH
	help
	Enable support for fractional second timeout in read builtin.

config FEATURE_SH_HISTFILESIZE
	bool "Use $HISTFILESIZE"
	default y
	depends on SHELL_ASH || SHELL_HUSH
	help
	This option makes busybox shells to use $HISTFILESIZE variable
	to set shell history size. Note that its max value is capped
	by "History size" setting in library tuning section.

config FEATURE_SH_EMBEDDED_SCRIPTS
	bool "Embed scripts in the binary"
	default y
	depends on SHELL_ASH || SHELL_HUSH
	help
	Allow scripts to be compressed and embedded in the busybox
	binary. The scripts should be placed in the 'embed' directory
	at build time. Like applets, scripts can be run as
	'busybox SCRIPT ...' or by linking their name to the binary.

	This also allows applets to be implemented as scripts: place
	the script in 'applets_sh' and a stub C file containing
	configuration in the appropriate subsystem directory.

endif # Options common to all shells

endmenu
