#
# 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"
	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"
	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"
	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"
	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 ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_HUSH

config FEATURE_SH_MATH
	bool "POSIX math support"
	default y
	depends on ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_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 ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_HUSH
	help
	Remove the busybox introduction when starting a shell.

config FEATURE_SH_STANDALONE
	bool "Standalone shell"
	default n
	depends on ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_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 ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_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 ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_HUSH
	help
	Enable support for fractional second timeout in read builtin.

config FEATURE_SH_HISTFILESIZE
	bool "Use $HISTFILESIZE"
	default y
	depends on ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_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 ASH || HUSH || SH_IS_ASH || BASH_IS_ASH || SH_IS_HUSH || BASH_IS_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
