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

mainmenu "BusyBox Configuration"

config HAVE_DOT_CONFIG
	bool
	default y

menu "Busybox Settings"

config DESKTOP
	bool "Enable compatibility for full-blown desktop systems"
	default y
	help
	Enable applet options and features which are not essential.
	Many applet options have dedicated config options to (de)select them
	under that applet; this options enables those options which have no
	individual config item for them.

	Select this if you plan to use busybox on full-blown desktop machine
	with common Linux distro, which needs higher level of command-line
	compatibility.

	If you are preparing your build to be used on an embedded box
	where you have tighter control over the entire set of userspace
	tools, you can unselect this option for smaller code size.

config EXTRA_COMPAT
	bool "Provide compatible behavior for rare corner cases (bigger code)"
	default n
	help
	This option makes grep, sed etc handle rare corner cases
	(embedded NUL bytes and such). This makes code bigger and uses
	some GNU extensions in libc. You probably only need this option
	if you plan to run busybox on desktop.

config INCLUDE_SUSv2
	bool "Enable obsolete features removed before SUSv3"
	default y
	help
	This option will enable backwards compatibility with SuSv2,
	specifically, old-style numeric options ('command -1 <file>')
	will be supported in head, tail, and fold. (Note: should
	affect renice too.)

config LONG_OPTS
	bool "Support --long-options"
	default y
	help
	Enable this if you want busybox applets to use the gnu --long-option
	style, in addition to single character -a -b -c style options.

config SHOW_USAGE
	bool "Show applet usage messages"
	default y
	help
	Enabling this option, BusyBox applets will show terse help messages
	when invoked with wrong arguments.
	If you do not want to show any (helpful) usage message when
	issuing wrong command syntax, you can say 'N' here,
	saving approximately 7k.

config FEATURE_VERBOSE_USAGE
	bool "Show verbose applet usage messages"
	default y
	depends on SHOW_USAGE
	help
	All BusyBox applets will show verbose help messages when
	busybox is invoked with --help. This will add a lot of text to the
	busybox binary. In the default configuration, this will add about
	13k, but it can add much more depending on your configuration.

config FEATURE_COMPRESS_USAGE
	bool "Store applet usage messages in compressed form"
	default y
	depends on SHOW_USAGE
	help
	Store usage messages in .bz compressed form, uncompress them
	on-the-fly when <applet> --help is called.

	If you have a really tiny busybox with few applets enabled (and
	bunzip2 isn't one of them), the overhead of the decompressor might
	be noticeable. Also, if you run executables directly from ROM
	and have very little memory, this might not be a win. Otherwise,
	you probably want this.

config LFS
	bool "Support files > 2 GB"
	default y
	help
	If you want to build BusyBox with large file support, then enable
	this option. This will have no effect if your kernel or your C
	library lacks large file support for large files. Some of the
	programs that can benefit from large file support include dd, gzip,
	cp, mount, tar, and many others. If you want to access files larger
	than 2 Gigabytes, enable this option.

config PAM
	bool "Support PAM (Pluggable Authentication Modules)"
	default n
	help
	Use PAM in some busybox applets (currently login and httpd) instead
	of direct access to password database.

config FEATURE_DEVPTS
	bool "Use the devpts filesystem for Unix98 PTYs"
	default y
	help
	Enable if you want BusyBox to use Unix98 PTY support. If enabled,
	busybox will use /dev/ptmx for the master side of the pseudoterminal
	and /dev/pts/<number> for the slave side. Otherwise, BSD style
	/dev/ttyp<number> will be used. To use this option, you should have
	devpts mounted.

config FEATURE_UTMP
	bool "Support utmp file"
	default y
	help
	The file /var/run/utmp is used to track who is currently logged in.
	With this option on, certain applets (getty, login, telnetd etc)
	will create and delete entries there.
	"who" applet requires this option.

config FEATURE_WTMP
	bool "Support wtmp file"
	default y
	depends on FEATURE_UTMP
	help
	The file /var/run/wtmp is used to track when users have logged into
	and logged out of the system.
	With this option on, certain applets (getty, login, telnetd etc)
	will append new entries there.
	"last" applet requires this option.

config FEATURE_PIDFILE
	bool "Support writing pidfiles"
	default y
	help
	This option makes some applets (e.g. crond, syslogd, inetd) write
	a pidfile at the configured PID_FILE_PATH.  It has no effect
	on applets which require pidfiles to run.

config PID_FILE_PATH
	string "Directory for pidfiles"
	default "/var/run"
	depends on FEATURE_PIDFILE
	help
	This is the default path where pidfiles are created.  Applets which
	allow you to set the pidfile path on the command line will override
	this value.  The option has no effect on applets that require you to
	specify a pidfile path.

config BUSYBOX
	bool "Include busybox applet"
	default y
	help
	The busybox applet provides general help regarding busybox and
	allows the included applets to be listed.  It's also required
	if applet links are to be installed at runtime. If you unselect
	this option, running busybox without any arguments will give
	just a cryptic error message:

	$ busybox
	busybox: applet not found

	Running "busybox APPLET [ARGS...]" will still work, of course.

config FEATURE_INSTALLER
	bool "Support --install [-s] to install applet links at runtime"
	default y
	depends on BUSYBOX
	help
	Enable 'busybox --install [-s]' support. This will allow you to use
	busybox at runtime to create hard links or symlinks for all the
	applets that are compiled into busybox.

config INSTALL_NO_USR
	bool "Don't use /usr"
	default n
	help
	Disable use of /usr. busybox --install and "make install"
	will install applets only to /bin and /sbin,
	never to /usr/bin or /usr/sbin.

config FEATURE_SUID
	bool "Drop SUID state for most applets"
	default y
	help
	With this option you can install the busybox binary belonging
	to root with the suid bit set, enabling some applets to perform
	root-level operations even when run by ordinary users
	(for example, mounting of user mounts in fstab needs this).

	With this option enabled, Busybox drops privileges for applets
	that don't need root access, before entering their main() function.

	If you are really paranoid and don't want even initial busybox code
	to run under root for evey applet, build two busybox binaries with
	different applets in them (and the appropriate symlinks pointing
	to each binary), and only set the suid bit on the one that needs it.

	Some applets which require root rights (need suid bit on the binary
	or to be run by root) and will refuse to execute otherwise:
	crontab, login, passwd, su, vlock, wall.

	The applets which will use root rights if they have them
	(via suid bit, or because run by root), but would try to work
	without root right nevertheless:
	findfs, ping[6], traceroute[6], mount.

	Note that if you DO NOT select this option, but DO make busybox
	suid root, ALL applets will run under root, which is a huge
	security hole (think "cp /some/file /etc/passwd").

config FEATURE_SUID_CONFIG
	bool "Enable SUID configuration via /etc/busybox.conf"
	default y
	depends on FEATURE_SUID
	help
	Allow the SUID/SGID state of an applet to be determined at runtime
	by checking /etc/busybox.conf. (This is sort of a poor man's sudo.)
	The format of this file is as follows:

	APPLET = [Ssx-][Ssx-][x-] [USER.GROUP]

	s: USER or GROUP is allowed to execute APPLET.
	   APPLET will run under USER or GROUP
	   (regardless of who's running it).
	S: USER or GROUP is NOT allowed to execute APPLET.
	   APPLET will run under USER or GROUP.
	   This option is not very sensical.
	x: USER/GROUP/others are allowed to execute APPLET.
	   No UID/GID change will be done when it is run.
	-: USER/GROUP/others are not allowed to execute APPLET.

	An example might help:

	|[SUID]
	|su = ssx root.0 # applet su can be run by anyone and runs with
	|                # euid=0,egid=0
	|su = ssx        # exactly the same
	|
	|mount = sx- root.disk # applet mount can be run by root and members
	|                      # of group disk (but not anyone else)
	|                      # and runs with euid=0 (egid is not changed)
	|
	|cp = --- # disable applet cp for everyone

	The file has to be owned by user root, group root and has to be
	writeable only by root:
		(chown 0.0 /etc/busybox.conf; chmod 600 /etc/busybox.conf)
	The busybox executable has to be owned by user root, group
	root and has to be setuid root for this to work:
		(chown 0.0 /bin/busybox; chmod 4755 /bin/busybox)

	Robert 'sandman' Griebl has more information here:
	<url: http://www.softforge.de/bb/suid.html >.

config FEATURE_SUID_CONFIG_QUIET
	bool "Suppress warning message if /etc/busybox.conf is not readable"
	default y
	depends on FEATURE_SUID_CONFIG
	help
	/etc/busybox.conf should be readable by the user needing the SUID,
	check this option to avoid users to be notified about missing
	permissions.

config FEATURE_PREFER_APPLETS
	bool "exec prefers applets"
	default n
	help
	This is an experimental option which directs applets about to
	call 'exec' to try and find an applicable busybox applet before
	searching the PATH. This is typically done by exec'ing
	/proc/self/exe.

	This may affect shell, find -exec, xargs and similar applets.
	They will use applets even if /bin/APPLET -> busybox link
	is missing (or is not a link to busybox). However, this causes
	problems in chroot jails without mounted /proc and with ps/top
	(command name can be shown as 'exe' for applets started this way).

config BUSYBOX_EXEC_PATH
	string "Path to BusyBox executable"
	default "/proc/self/exe"
	help
	When Busybox applets need to run other busybox applets, BusyBox
	sometimes needs to exec() itself. When the /proc filesystem is
	mounted, /proc/self/exe always points to the currently running
	executable. If you haven't got /proc, set this to wherever you
	want to run BusyBox from.

config SELINUX
	bool "Support NSA Security Enhanced Linux"
	default n
	select PLATFORM_LINUX
	help
	Enable support for SELinux in applets ls, ps, and id. Also provide
	the option of compiling in SELinux applets.

	If you do not have a complete SELinux userland installed, this stuff
	will not compile.  Specifially, libselinux 1.28 or better is
	directly required by busybox. If the installation is located in a
	non-standard directory, provide it by invoking make as follows:

		CFLAGS=-I<libselinux-include-path> \
		LDFLAGS=-L<libselinux-lib-path> \
		make

	Most people will leave this set to 'N'.

config FEATURE_CLEAN_UP
	bool "Clean up all memory before exiting (usually not needed)"
	default n
	help
	As a size optimization, busybox normally exits without explicitly
	freeing dynamically allocated memory or closing files. This saves
	space since the OS will clean up for us, but it can confuse debuggers
	like valgrind, which report tons of memory and resource leaks.

	Don't enable this unless you have a really good reason to clean
	things up manually.

# These are auto-selected by other options

config FEATURE_SYSLOG
	bool #No description makes it a hidden option
	default n
	#help
	#This option is auto-selected when you select any applet which may
	#send its output to syslog. You do not need to select it manually.

config FEATURE_HAVE_RPC
	bool #No description makes it a hidden option
	default n
	#help
	#This is automatically selected if any of enabled applets need it.
	#You do not need to select it manually.

config PLATFORM_LINUX
	bool #No description makes it a hidden option
	default n
	#help
	#For the most part, busybox requires only POSIX compatibility
	#from the target system, but some applets and features use
	#Linux-specific interfaces.
	#
	#This is automatically selected if any applet or feature requires
	#Linux-specific interfaces. You do not need to select it manually.

comment 'Build Options'

config STATIC
	bool "Build BusyBox as a static binary (no shared libs)"
	default n
	help
	If you want to build a static BusyBox binary, which does not
	use or require any shared libraries, then enable this option.
	This can cause BusyBox to be considerably larger, so you should
	leave this option false unless you have a good reason (i.e.
	your target platform does not support shared libraries, or
	you are building an initrd which doesn't need anything but
	BusyBox, etc).

	Most people will leave this set to 'N'.

config PIE
	bool "Build BusyBox as a position independent executable"
	default n
	depends on !STATIC
	help
	Hardened code option. PIE binaries are loaded at a different
	address at each invocation. This has some overhead,
	particularly on x86-32 which is short on registers.

	Most people will leave this set to 'N'.

config NOMMU
	bool "Force NOMMU build"
	default n
	help
	Busybox tries to detect whether architecture it is being
	built against supports MMU or not. If this detection fails,
	or if you want to build NOMMU version of busybox for testing,
	you may force NOMMU build here.

	Most people will leave this set to 'N'.

# PIE can be made to work with BUILD_LIBBUSYBOX, but currently
# build system does not support that
config BUILD_LIBBUSYBOX
	bool "Build shared libbusybox"
	default n
	depends on !FEATURE_PREFER_APPLETS && !PIE && !STATIC
	help
	Build a shared library libbusybox.so.N.N.N which contains all
	busybox code.

	This feature allows every applet to be built as a really tiny
	separate executable linked against the library:
	|$ size 0_lib/l*
	|    text  data   bss     dec    hex filename
	|     939   212    28    1179    49b 0_lib/last
	|     939   212    28    1179    49b 0_lib/less
	|  919138  8328  1556  929022  e2cfe 0_lib/libbusybox.so.1.N.M

	This is useful on NOMMU systems which are not capable
	of sharing executables, but are capable of sharing code
	in dynamic libraries.

config FEATURE_LIBBUSYBOX_STATIC
	bool "Pull in all external references into libbusybox"
	default n
	depends on BUILD_LIBBUSYBOX
	help
	Make libbusybox library independent, not using or requiring
	any other shared libraries.

config FEATURE_INDIVIDUAL
	bool "Produce a binary for each applet, linked against libbusybox"
	default y
	depends on BUILD_LIBBUSYBOX
	help
	If your CPU architecture doesn't allow for sharing text/rodata
	sections of running binaries, but allows for runtime dynamic
	libraries, this option will allow you to reduce memory footprint
	when you have many different applets running at once.

	If your CPU architecture allows for sharing text/rodata,
	having single binary is more optimal.

	Each applet will be a tiny program, dynamically linked
	against libbusybox.so.N.N.N.

	You need to have a working dynamic linker.

config FEATURE_SHARED_BUSYBOX
	bool "Produce additional busybox binary linked against libbusybox"
	default y
	depends on BUILD_LIBBUSYBOX
	help
	Build busybox, dynamically linked against libbusybox.so.N.N.N.

	You need to have a working dynamic linker.

### config BUILD_AT_ONCE
###	bool "Compile all sources at once"
###	default n
###	help
###	Normally each source-file is compiled with one invocation of
###	the compiler.
###	If you set this option, all sources are compiled at once.
###	This gives the compiler more opportunities to optimize which can
###	result in smaller and/or faster binaries.
###
###	Setting this option will consume alot of memory, e.g. if you
###	enable all applets with all features, gcc uses more than 300MB
###	RAM during compilation of busybox.
###
###	This option is most likely only beneficial for newer compilers
###	such as gcc-4.1 and above.
###
###	Say 'N' unless you know what you are doing.

config CROSS_COMPILER_PREFIX
	string "Cross Compiler prefix"
	default ""
	help
	If you want to build BusyBox with a cross compiler, then you
	will need to set this to the cross-compiler prefix, for example,
	"i386-uclibc-".

	Note that CROSS_COMPILE environment variable or
	"make CROSS_COMPILE=xxx ..." will override this selection.

	Native builds leave this empty.

config SYSROOT
	string "Path to sysroot"
	default ""
	help
	If you want to build BusyBox with a cross compiler, then you
	might also need to specify where /usr/include and /usr/lib
	will be found.

	For example, BusyBox can be built against an installed
	Android NDK, platform version 9, for ARM ABI with

	CONFIG_SYSROOT=/opt/android-ndk/platforms/android-9/arch-arm

	Native builds leave this empty.

config EXTRA_CFLAGS
	string "Additional CFLAGS"
	default ""
	help
	Additional CFLAGS to pass to the compiler verbatim.

config EXTRA_LDFLAGS
	string "Additional LDFLAGS"
	default ""
	help
	Additional LDFLAGS to pass to the linker verbatim.

config EXTRA_LDLIBS
	string "Additional LDLIBS"
	default ""
	help
	Additional LDLIBS to pass to the linker with -l.

config USE_PORTABLE_CODE
	bool "Avoid using GCC-specific code constructs"
	default n
	help
	Use this option if you are trying to compile busybox with
	compiler other than gcc.
	If you do use gcc, this option may needlessly increase code size.

comment 'Installation Options ("make install" behavior)'

choice
	prompt "What kind of applet links to install"
	default INSTALL_APPLET_SYMLINKS
	help
	Choose what kind of links to applets are created by "make install".

config INSTALL_APPLET_SYMLINKS
	bool "as soft-links"
	help
	Install applets as soft-links to the busybox binary. This needs some
	free inodes on the filesystem, but might help with filesystem
	generators that can't cope with hard-links.

config INSTALL_APPLET_HARDLINKS
	bool "as hard-links"
	help
	Install applets as hard-links to the busybox binary. This might
	count on a filesystem with few inodes.

config INSTALL_APPLET_SCRIPT_WRAPPERS
	bool "as script wrappers"
	help
	Install applets as script wrappers that call the busybox binary.

config INSTALL_APPLET_DONT
	bool "not installed"
	help
	Do not install applet links. Useful when you plan to use
	busybox --install for installing links, or plan to use
	a standalone shell and thus don't need applet links.

endchoice

choice
	prompt "/bin/sh applet link"
	default INSTALL_SH_APPLET_SYMLINK
	depends on INSTALL_APPLET_SCRIPT_WRAPPERS
	help
	Choose how you install /bin/sh applet link.

config INSTALL_SH_APPLET_SYMLINK
	bool "as soft-link"
	help
	Install /bin/sh applet as soft-link to the busybox binary.

config INSTALL_SH_APPLET_HARDLINK
	bool "as hard-link"
	help
	Install /bin/sh applet as hard-link to the busybox binary.

config INSTALL_SH_APPLET_SCRIPT_WRAPPER
	bool "as script wrapper"
	help
	Install /bin/sh applet as script wrapper that calls
	the busybox binary.

endchoice

config PREFIX
	string "BusyBox installation prefix"
	default "./_install"
	help
	Define your directory to install BusyBox files/subdirs in.

comment 'Debugging Options'

config DEBUG
	bool "Build BusyBox with extra Debugging symbols"
	default n
	help
	Say Y here if you wish to examine BusyBox internals while applets are
	running. This increases the size of the binary considerably, and
	should only be used when doing development. If you are doing
	development and want to debug BusyBox, answer Y.

	Most people should answer N.

config DEBUG_PESSIMIZE
	bool "Disable compiler optimizations"
	default n
	depends on DEBUG
	help
	The compiler's optimization of source code can eliminate and reorder
	code, resulting in an executable that's hard to understand when
	stepping through it with a debugger. This switches it off, resulting
	in a much bigger executable that more closely matches the source
	code.

config DEBUG_SANITIZE
	bool "Enable runtime sanitizers (ASAN/LSAN/USAN/etc...)"
	default n
	help
	Say Y here if you want to enable runtime sanitizers. These help
	catch bad memory accesses (e.g. buffer overflows), but will make
	the executable larger and slow down runtime a bit.

	This adds -fsanitize=foo options to gcc command line.

	If you aren't developing/testing busybox, say N here.

config UNIT_TEST
	bool "Build unit tests"
	default n
	help
	Say Y here if you want to build unit tests (both the framework and
	test cases) as a Busybox applet. This results in bigger code, so you
	probably don't want this option in production builds.

config WERROR
	bool "Abort compilation on any warning"
	default n
	help
	This adds -Werror to gcc command line.

	Most people should answer N.

choice
	prompt "Additional debugging library"
	default NO_DEBUG_LIB
	help
	Using an additional debugging library will make BusyBox become
	considerable larger and will cause it to run more slowly. You
	should always leave this option disabled for production use.

	dmalloc support:
	----------------
	This enables compiling with dmalloc ( http://dmalloc.com/ )
	which is an excellent public domain mem leak and malloc problem
	detector. To enable dmalloc, before running busybox you will
	want to properly set your environment, for example:
		export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile
	The 'debug=' value is generated using the following command
	dmalloc -p log-stats -p log-non-free -p log-bad-space \
		-p log-elapsed-time -p check-fence -p check-heap \
		-p check-lists -p check-blank -p check-funcs -p realloc-copy \
		-p allow-free-null

	Electric-fence support:
	-----------------------
	This enables compiling with Electric-fence support. Electric
	fence is another very useful malloc debugging library which uses
	your computer's virtual memory hardware to detect illegal memory
	accesses. This support will make BusyBox be considerable larger
	and run slower, so you should leave this option disabled unless
	you are hunting a hard to find memory problem.


config NO_DEBUG_LIB
	bool "None"

config DMALLOC
	bool "Dmalloc"

config EFENCE
	bool "Electric-fence"

endchoice

source libbb/Config.in

endmenu

comment "Applets"

source archival/Config.in
source coreutils/Config.in
source console-tools/Config.in
source debianutils/Config.in
source editors/Config.in
source findutils/Config.in
source init/Config.in
source loginutils/Config.in
source e2fsprogs/Config.in
source modutils/Config.in
source util-linux/Config.in
source miscutils/Config.in
source networking/Config.in
source printutils/Config.in
source mailutils/Config.in
source procps/Config.in
source runit/Config.in
source selinux/Config.in
source shell/Config.in
source sysklogd/Config.in
