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

mainmenu "Configuration"

config HAVE_DOT_CONFIG
	bool
	default y

menu "Settings"

config DESKTOP
	bool "Enable compatibility for full-blown desktop systems (8kb)"
	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 FEDORA_COMPAT
	bool "Building for Fedora distribution"
	default n
	help
	This option makes some tools behave like they do on Fedora.

	At the time of this writing (2017-08) this only affects uname:
	normally, uname -p (processor) and uname -i (platform)
	are shown as "unknown", but with this option uname -p
	shows the same string as uname -m (machine type),
	and so does uname -i unless machine type is i486/i586/i686 -
	then uname -i shows "i386".

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, 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 applets will show verbose help messages when invoked with --help.
	This will add a lot of text to the binary.

config FEATURE_COMPRESS_USAGE
	bool "Store applet usage messages in compressed form"
	default y
	depends on SHOW_USAGE
	help
	Store usage messages in .bz2 compressed form, uncompress them
	on-the-fly when "APPLET --help" is run.

	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 need to work with large files, 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.

config PAM
	bool "Support PAM (Pluggable Authentication Modules)"
	default n
	help
	Use PAM in some 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 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 || FEATURE_CROND_SPECIAL_TIMES
	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.  When crond has the 'Support special times'
	option enabled, the 'crond.reboot' file is also stored here.

config BUSYBOX
	bool "Include busybox applet"
	default y
	help
	The busybox applet provides general help message and allows
	the included applets to be listed.  It also provides
	optional --install command to create applet links. 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_SHOW_SCRIPT
	bool "Support --show SCRIPT"
	default y
	depends on BUSYBOX

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 every 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 applets need to run other 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
	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.

config FEATURE_SYSLOG_INFO
	bool "Support LOG_INFO level syslog messages"
	default y
	depends on FEATURE_SYSLOG
	help
	Applets which send their output to syslog use either LOG_INFO or
	LOG_ERR log levels, but by disabling this option all messages will
	be logged at the LOG_ERR level, saving just under 200 bytes.

# 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.

comment 'Build Options'

config STATIC
	bool "Build static binary (no shared libs)"
	default n
	help
	If you want to build a static binary, which does not use
	or require any shared libraries, enable this option.
	Static binaries are larger, but do not require functioning
	dynamic libraries to be present, which is important if used
	as a system rescue tool.

config PIE
	bool "Build 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.

config STACK_OPTIMIZATION_386
	bool "Use -mpreferred-stack-boundary=2 on i386 arch"
	default y
	help
	This option makes for smaller code, but some libc versions
	do not work with it (they use SSE instructions without
	ensuring stack alignment).

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 "Destination path for 'make install'"
	default "./_install"
	help
	Where "make install" should install busybox binary and links.

comment 'Debugging Options'

config DEBUG
	bool "Build with debug information"
	default n
	help
	Say Y here to compile with debug information.
	This increases the size of the binary considerably, and
	should only be used when doing development.

	This adds -g option to gcc command line.

	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.

	This replaces -Os/-O2 with -O0 in gcc command line.

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 an 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.

config WARN_SIMPLE_MSG
	bool "Warn about single parameter bb_xx_msg calls"
	default n
	help
	This will cause warnings to be shown for any instances of
	bb_error_msg(), bb_error_msg_and_die(), bb_perror_msg(),
	bb_perror_msg_and_die(), bb_herror_msg() or bb_herror_msg_and_die()
	being called with a single parameter. In these cases the equivalent
	bb_simple_xx_msg function should be used instead.
	Note that use of STRERROR_FMT may give false positives.

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

choice
	prompt "Additional debugging library"
	default NO_DEBUG_LIB
	help
	Using an additional debugging library will make busybox become
	considerably 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 considerably 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 klibc-utils/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
