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

config CONFIG_NITPICK
	bool "See lots more (probably unnecessary) configuration options."
	default n
	help
	  Some BusyBox applets have more configuration options than anyone
	  will ever care about.  To avoid drowining people in complexity, most
	  of the applet features that can be set to a sane default value are
	  hidden, unless you hit the above switch.

	  This is better than to telling people to edit the busybox source
	  code, but not by much.

	  See http://en.wikipedia.org/wiki/Fibber_McGee_and_Molly#The_Closet

	  You have been warned.

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 support for --long-options"
	default n
	depends on !CONFIG_NO_GETOPT_LONG
	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 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.

	  This is obsolete and will be going away someday.  Consider it
	  deprecated.

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 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
	  With this option you can install the busybox binary belonging
	  to root with the suid bit set, and it'll and it'll automatically drop
	  priviledges for applets that don't need root access.

	  If you're really paranoid and don't want to do this, 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.  The applets currently marked to need the suid bit
	  are login, passwd, su, ping, traceroute, crontab, dnsd, ipcrm, ipcs,
	  and vlock.

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 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-] (<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 y
	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
