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

menu "General Configuration"

choice
	prompt "Buffer allocation policy"
	default CONFIG_FEATURE_BUFFERS_USE_MALLOC
	help
	  There are 3 ways BusyBox can handle buffer allocations:
	  - Use malloc. This costs code size for the call to xmalloc.
	  - Put them on stack. For some very small machines with limited stack
	    space, this can be deadly.  For most folks, this works just fine.
	  - Put them in BSS. This works beautifully for computers with a real
	    MMU (and OS support), but wastes runtime RAM for uCLinux. This
	    behavior was the only one available for BusyBox versions 0.48 and
	    earlier.

config CONFIG_FEATURE_BUFFERS_USE_MALLOC
	bool "Allocate with Malloc"

config CONFIG_FEATURE_BUFFERS_GO_ON_STACK
	bool "Allocate on the Stack"

config CONFIG_FEATURE_BUFFERS_GO_IN_BSS
	bool "Allocate in the .bss section"

endchoice

config CONFIG_SHOW_USAGE
	bool "Show terse applet usage messages"
	default y
	help
	  All BusyBox applets will show help messages when invoked with
	  wrong arguments. You can turn off printing these terse usage
	  messages if you say no here.
	  This will save you up to 7k.

config CONFIG_FEATURE_VERBOSE_USAGE
	bool "Show verbose applet usage messages"
	default n
	select CONFIG_SHOW_USAGE
	help
	  All BusyBox applets will show more 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 CONFIG_FEATURE_COMPRESS_USAGE
	bool "Store applet usage messages in compressed form"
	default y
	depends on CONFIG_SHOW_USAGE
	help
	  Store usage messages in compressed form, uncompress them on-the-fly
	  when <applet> --help is called.

config CONFIG_FEATURE_INSTALLER
	bool "Support --install [-s] to install applet links at runtime"
	default n
	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.  This feature requires the
	  /proc filesystem.

config CONFIG_LOCALE_SUPPORT
	bool "Enable locale support (system needs locale for this to work)"
	default n
	help
	  Enable this if your system has locale support and you would like
	  busybox to support locale settings.

config CONFIG_GETOPT_LONG
	bool "Enable getopt long (system needs struct option for this to work)"
	default n
	depends on !CONFIG_NO_GETOPT_LONG
	help
	  EXPERIMENTAL!
	  Enable this if your system support long options for getopt and
	  you want to use them in busybox.

# remove this comment to disable getopt_long per default.
#config CONFIG_NO_GETOPT_LONG
#	bool
#	default y
#	depends on !CONFIG_GETOPT_LONG

config CONFIG_FEATURE_DEVFS
	bool "Use devfs names for devices"
	default n
	help
	  This tells busybox to look for names like /dev/loop/0 instead of
          /dev/loop0.  If your /dev directory has normal names instead of
          devfs names, you don't want this.

config CONFIG_FEATURE_DEVPTS
	bool "Use the devpts filesystem for Unix98 PTYs"
	default y if CONFIG_FEATURE_DEVFS
	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 or devfs mounted.

config 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 CONFIG_FEATURE_SUID
	bool "Support for SUID/SGID handling"
	default n
	help
	  Support SUID and SGID binaries.

config CONFIG_FEATURE_SUID_CONFIG
	bool "Runtime SUID/SGID configuration via /etc/busybox.conf"
	default n if CONFIG_FEATURE_SUID
	depends on CONFIG_FEATURE_SUID
	help
	  Allow the SUID / SGID state of an applet to be determined runtime by
	  checking /etc/busybox.conf.  The format of this file is as follows:

	  <applet> = [Ssx-][Ssx-][x-] (<username>|<uid>).(<groupname>|<gid>)

	  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
	                        # and runs with euid=0

	  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 CONFIG_FEATURE_SUID_CONFIG_QUIET
	bool "Suppress warning message if /etc/busybox.conf is not readable"
	default n
	depends on CONFIG_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 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. Go visit
		http://www.nsa.gov/selinux/index.html
	  to download the necessary stuff to allow busybox to compile with
	  this option enabled. 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'.

endmenu

menu 'Build Options'

config 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 CONFIG_BUILD_LIBBUSYBOX
	bool "Build shared libbusybox"
	default y
	help
	  Build a shared library libbusybox.so which contains all
	  libraries used inside busybox.

config CONFIG_FEATURE_FULL_LIBBUSYBOX
	bool "Feature-complete libbusybox"
	default n if !CONFIG_FEATURE_SHARED_BUSYBOX
	depends on CONFIG_BUILD_LIBBUSYBOX
	help
	  Build a libbusybox with the complete feature-set, disregarding
	  the actually selected config.

	  Normally, libbusybox will only contain the features which are
	  used by busybox itself. If you plan to write a separate
	  standalone application which uses libbusybox say 'Y'.

	  Note: libbusybox is GPL, not LGPL, and exports no stable API that
	  might act as a copyright barrier.  We can and will modify the
	  exported function set between releases (even minor version number
	  changes), and happily break out-of-tree features.

	  Say 'N' if in doubt.

config CONFIG_FEATURE_SHARED_BUSYBOX
	bool "Use shared libbusybox for busybox"
	default y if CONFIG_BUILD_LIBBUSYBOX
	depends on !CONFIG_STATIC && CONFIG_BUILD_LIBBUSYBOX
	help
	  Use libbusybox.so also for busybox itself.
	  You need to have a working dynamic linker to use this variant.

config CONFIG_LFS
	bool "Build with Large File Support (for accessing files > 2 GB)"
	default n
	select FDISK_SUPPORT_LARGE_DISKS
	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.  Otherwise, leave it set to 'N'.

config USING_CROSS_COMPILER
	bool "Do you want to build BusyBox with a Cross Compiler?"
	default n
	help
	  Do you want to build BusyBox with a Cross Compiler?  If so,
	  then enable this option.  Otherwise leave it set to 'N'.

config CROSS_COMPILER_PREFIX
	string "Cross Compiler prefix"
	default "/usr/i386-linux-uclibc/bin/i386-uclibc-"
	depends on USING_CROSS_COMPILER
	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,
	  if my cross-compiler is /usr/i386-linux-uclibc/bin/i386-uclibc-gcc
	  then I would enter '/usr/i386-linux-uclibc/bin/i386-uclibc-' here,
	  which will ensure the correct compiler is used.

config EXTRA_CFLAGS_OPTIONS
	string "Any extra CFLAGS options for the compiler?"
	default ""
	help
	  Do you want to pass any extra CFLAGS options to the compiler as
	  you build BusyBox? If so, this is the option for you...  For example,
	  if you want to add some simple compiler switches (like -march=i686),
	  or check for warnings using -Werror, just those options here.

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

endmenu

menu 'Debugging Options'

config 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 CONFIG_DEBUG_PESSIMIZE
	bool "Disable compiler optimizations."
	default n
	depends on CONFIG_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.

choice
	prompt "Additional debugging library"
	default CONFIG_NO_DEBUG_LIB
	depends on CONFIG_DEBUG
	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 CONFIG_NO_DEBUG_LIB
	bool "None"

config CONFIG_DMALLOC
	bool "Dmalloc"

config CONFIG_EFENCE
	bool "Electric-fence"

endchoice

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

endmenu

menu 'Installation Options'

config CONFIG_INSTALL_NO_USR
	bool "Don't use /usr"
	default n
	help
	  Disable use of /usr. Don't activate this option if you don't know
	  that you really want this behaviour.

choice
       prompt "Applets links"
       default CONFIG_INSTALL_APPLET_SYMLINKS
       help
         Choose how you install applets links.

config 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 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 CONFIG_INSTALL_APPLET_DONT
       bool
       prompt "not installed"
       depends on CONFIG_FEATURE_INSTALLER || CONFIG_FEATURE_SH_STANDALONE_SHELL
       help
         Do not install applets links. Usefull when using the -install feature
         or a standalone shell for rescue pruposes.

endchoice

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

endmenu

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 procps/Config.in
source shell/Config.in
source sysklogd/Config.in
