#

mainmenu "Buildroot $BR2_VERSION Configuration"

config BR2_HAVE_DOT_CONFIG
	bool
	default y

config BR2_VERSION
	string
	option env="BR2_VERSION_FULL"

config BR2_HOSTARCH
	string
	option env="HOSTARCH"

config BR2_EXTERNAL
	string
	option env="BR2_EXTERNAL"

# Hidden config symbols for packages to check system gcc version
config BR2_HOST_GCC_VERSION
	string
	option env="HOST_GCC_VERSION"

config BR2_HOST_GCC_AT_LEAST_4_7
	bool
	default y if BR2_HOST_GCC_VERSION = "4 7"

config BR2_HOST_GCC_AT_LEAST_4_8
	bool
	default y if BR2_HOST_GCC_VERSION = "4 8"
	select BR2_HOST_GCC_AT_LEAST_4_7

config BR2_HOST_GCC_AT_LEAST_4_9
	bool
	default y if BR2_HOST_GCC_VERSION = "4 9"
	select BR2_HOST_GCC_AT_LEAST_4_8

config BR2_HOST_GCC_AT_LEAST_5
	bool
	default y if BR2_HOST_GCC_VERSION = "5"
	select BR2_HOST_GCC_AT_LEAST_4_9

# Hidden boolean selected by packages in need of Java in order to build
# (example: xbmc)
config BR2_NEEDS_HOST_JAVA
	bool

# Hidden boolean selected by packages in need of javac in order to build
# (example: classpath)
config BR2_NEEDS_HOST_JAVAC
	bool

# Hidden boolean selected by packages in need of jar in order to build
# (example: classpath)
config BR2_NEEDS_HOST_JAR
	bool

# Hidden boolean selected by pre-built packages for x86, when they
# need to run on x86-64 machines (example: pre-built external
# toolchains, binary tools like SAM-BA, etc.).
config BR2_HOSTARCH_NEEDS_IA32_LIBS
	bool

# Hidden boolean selected by packages that need to build 32 bits
# binaries with the host compiler, even on 64 bits build machines (e.g
# bootloaders).
config BR2_HOSTARCH_NEEDS_IA32_COMPILER
	bool

source "arch/Config.in"

menu "Build options"

menu "Commands"

config BR2_WGET
	string "Wget command"
	default "wget --passive-ftp -nd -t 3"

config BR2_SVN
	string "Subversion (svn) command"
	default "svn"

config BR2_BZR
	string "Bazaar (bzr) command"
	default "bzr"

config BR2_GIT
	string "Git command"
	default "git"

config BR2_CVS
	string "CVS command"
	default "cvs"

config BR2_LOCALFILES
	string "Local files retrieval command"
	default "cp"

config BR2_SCP
	string "Secure copy (scp) command"
	default "scp"

config BR2_SSH
	string "Secure shell (ssh) command"
	default "ssh"

config BR2_HG
	string "Mercurial (hg) command"
	default "hg"

config BR2_ZCAT
	string "zcat command"
	default "gzip -d -c"
	help
	  Command to be used to extract a gzip'ed file to stdout.
	  zcat is identical to gunzip -c except that the former may
	  not be available on your system.
	  Default is "gzip -d -c"
	  Other possible values include "gunzip -c" or "zcat".

config BR2_BZCAT
	string "bzcat command"
	default "bzcat"
	help
	  Command to be used to extract a bzip2'ed file to stdout.
	  bzcat is identical to bunzip2 -c except that the former may
	  not be available on your system.
	  Default is "bzcat"
	  Other possible values include "bunzip2 -c" or "bzip2 -d -c".

config BR2_XZCAT
	string "xzcat command"
	default "xzcat"
	help
	  Command to be used to extract a xz'ed file to stdout.
	  Default is "xzcat"

config BR2_TAR_OPTIONS
	string "Tar options"
	default ""
	help
	  Options to pass to tar when extracting the sources.
	  E.g. " -v --exclude='*.svn*'" to exclude all .svn internal files
	  and to be verbose.

endmenu

config BR2_DEFCONFIG_FROM_ENV
	string
	option env="BR2_DEFCONFIG"

config BR2_DEFCONFIG
	string "Location to save buildroot config"
	default BR2_DEFCONFIG_FROM_ENV if BR2_DEFCONFIG_FROM_ENV != ""
	default "$(CONFIG_DIR)/defconfig"
	help
	  When running 'make savedefconfig', the defconfig file will be saved
	  in this location.

config BR2_DL_DIR
	string "Download dir"
	default "$(TOPDIR)/dl"
	help
	  Directory to store all the source files that we need to fetch.
	  If the Linux shell environment has defined the BR2_DL_DIR
	  environment variable, then this overrides this configuration item.

	  The default is $(TOPDIR)/dl

config BR2_HOST_DIR
	string "Host dir"
	default "$(BASE_DIR)/host"
	help
	  Directory to store all the binary files that are built for the host.
	  This includes the cross compilation toolchain when building the
	  internal buildroot toolchain.

	  The default is $(BASE_DIR)/host

menu "Mirrors and Download locations"

config BR2_PRIMARY_SITE
	string "Primary download site"
	default ""
	help
	  Primary site to download from. If this option is set then buildroot
	  will try to download package source first from this site and try the
	  default if the file is not found.
	  Valid URIs are:
	    - URIs recognized by $(WGET)
	    - local URIs of the form file://absolutepath
	    - scp URIs of the form scp://[user@]host:path.

config BR2_PRIMARY_SITE_ONLY
	bool "Only allow downloads from primary download site"
	depends on BR2_PRIMARY_SITE != ""
	help
	  If this option is enabled, downloads will only be attempted
	  from the primary download site. Other locations, like the
	  package's official download location or the backup download
	  site, will not be considered. Therefore, if the package is
	  not present on the primary site, the download fails.

	  This is useful for project developers who want to ensure
	  that the project can be built even if the upstream tarball
	  locations disappear.

if !BR2_PRIMARY_SITE_ONLY

config BR2_BACKUP_SITE
	string "Backup download site"
	default "http://sources.buildroot.net"
	help
	  Backup site to download from. If this option is set then buildroot
	  will fall back to download package sources from here if the
	  normal location fails.

config BR2_KERNEL_MIRROR
	string "Kernel.org mirror"
	default "https://www.kernel.org/pub"
	help
	  kernel.org is mirrored on a number of servers around the world.
	  The following allows you to select your preferred mirror.

	  Have a look on the kernel.org site for a list of mirrors, then enter
	  the URL to the base directory.  Examples:

	     http://www.XX.kernel.org/pub (XX = country code)
	     http://mirror.aarnet.edu.au/pub/ftp.kernel.org

config BR2_GNU_MIRROR
	string "GNU Software mirror"
	default "http://ftp.gnu.org/pub/gnu"
	help
	  GNU has multiple software mirrors scattered around the world.
	  The following allows you to select your preferred mirror.

	  Have a look on the gnu.org site for a list of mirrors, then enter
	  the URL to the base directory.  Examples:

	     http://ftp.gnu.org/pub/gnu
	     http://mirror.aarnet.edu.au/pub/gnu

config BR2_LUAROCKS_MIRROR
	string "LuaRocks mirror"
	default "http://rocks.moonscript.org"
	help
	  LuaRocks repository.

	  See http://luarocks.org

config BR2_CPAN_MIRROR
	string "CPAN mirror (Perl packages)"
	default "http://cpan.metacpan.org"
	help
	  CPAN (Comprehensive Perl Archive Network) is a repository
	  of Perl packages. It has multiple software mirrors scattered
	  around the world. This option allows you to select a mirror.

	  The list of mirrors is available at:
	  http://search.cpan.org/mirror

endif

endmenu

config BR2_JLEVEL
	int "Number of jobs to run simultaneously (0 for auto)"
	default "0"
	help
	  Number of jobs to run simultaneously.  If 0, determine
	  automatically according to number of CPUs on the host
	  system.

config BR2_CCACHE
	bool "Enable compiler cache"
	help
	  This option will enable the use of ccache, a compiler
	  cache. It will cache the result of previous builds to speed
	  up future builds. By default, the cache is stored in
	  $HOME/.buildroot-ccache.

	  Note that Buildroot does not try to invalidate the cache
	  contents when the compiler changes in an incompatible
	  way. Therefore, if you make a change to the compiler version
	  and/or configuration, you are responsible for purging the
	  ccache cache by removing the $HOME/.buildroot-ccache
	  directory.

if BR2_CCACHE

config BR2_CCACHE_DIR
	string "Compiler cache location"
	default "$(HOME)/.buildroot-ccache"
	help
	  Where ccache should store cached files.

config BR2_CCACHE_INITIAL_SETUP
	string "Compiler cache initial setup"
	help
	  Initial ccache settings to apply, such as --max-files or --max-size.

	  For example, if your project is known to require more space than the
	  default max cache size, then you might want to increase the cache size
	  to a suitable amount using the -M (--max-size) option.

	  The string you specify here is passed verbatim to ccache.  Refer to
	  ccache documentation for more details.

	  These initial settings are applied after ccache has been compiled.

config BR2_CCACHE_USE_BASEDIR
	bool "Use relative paths"
	default y
	help
	  Allow ccache to convert absolute paths within the output
	  directory into relative paths.

	  During the build, many -I include directives are given with
	  an absolute path. These absolute paths end up in the hashes
	  that are computed by ccache. Therefore, when you build from a
	  different directory, the hash will be different and the
	  cached object will not be used.

	  To improve cache performance, set this option to y. This
	  allows ccache to rewrite absolute paths within the output
	  directory into relative paths. Note that only paths within
	  the output directory will be rewritten; therefore, if you
	  change BR2_HOST_DIR to point outside the output directory and
	  subsequently move it to a different location, this will lead
	  to cache misses.

	  This option has as a result that the debug information in the
	  object files also has only relative paths. Therefore, make
	  sure you cd to the build directory before starting gdb. See
	  the section "COMPILING IN DIFFERENT DIRECTORIES" in the
	  ccache manual for more information.

endif

config BR2_DEPRECATED
	bool "Show options and packages that are deprecated or obsolete"
	help
	  This option shows outdated/obsolete versions of packages and
	  options that are otherwise hidden.

if BR2_DEPRECATED

config BR2_DEPRECATED_SINCE_2015_05
	bool
	default y

config BR2_DEPRECATED_SINCE_2015_08
	bool
	default y

config BR2_DEPRECATED_SINCE_2015_11
	bool
	default y

config BR2_DEPRECATED_SINCE_2016_02
	bool
	default y

endif

config BR2_ENABLE_DEBUG
	bool "build packages with debugging symbols"
	help
	  Build packages with debugging symbols enabled. All libraries
	  and binaries in the 'staging' directory will have debugging
	  symbols, which allows remote debugging even if libraries and
	  binaries are stripped on the target. Whether libraries and
	  binaries are stripped on the target is controlled by the
	  BR2_STRIP_* options below.

if BR2_ENABLE_DEBUG
choice
	prompt "gcc debug level"
	default BR2_DEBUG_2
	help
	  Set the debug level for gcc

config BR2_DEBUG_1
	bool "debug level 1"
	help
	  Debug level 1 produces minimal information, enough
	  for making backtraces in parts of the program that
	  you don't plan to debug. This includes descriptions
	  of functions and external variables, but no information
	  about local variables and no line numbers.

config BR2_DEBUG_2
	bool "debug level 2"
	help
	  The default gcc debug level is 2

config BR2_DEBUG_3
	bool "debug level 3"
	help
	  Level 3 includes extra information, such as all the
	  macro definitions present in the program. Some debuggers
	  support macro expansion when you use -g3.
endchoice
endif

choice
	prompt "strip command for binaries on target"
	default BR2_STRIP_strip

config BR2_STRIP_strip
	bool "strip"
	depends on !BR2_PACKAGE_HOST_ELF2FLT
	help
	  Binaries and libraries in the target filesystem will be
	  stripped using the normal 'strip' command. This allows to
	  save space, mainly by removing debugging symbols. Debugging
	  symbols on the target are needed for native debugging, but
	  not when remote debugging is used.

config BR2_STRIP_none
	bool "none"
	help
	  Do not strip binaries and libraries in the target
	  filesystem.
endchoice

config BR2_STRIP_EXCLUDE_FILES
	string "executables that should not be stripped"
	depends on !BR2_STRIP_none
	default ""
	help
	  You may specify a space-separated list of binaries and libraries
	  here that should not be stripped on the target.

config BR2_STRIP_EXCLUDE_DIRS
	string "directories that should be skipped when stripping"
	depends on !BR2_STRIP_none
	default ""
	help
	  You may specify a space-separated list of directories that should
	  be skipped when stripping. Binaries and libraries in these
	  directories will not be touched.
	  The directories should be specified relative to the target directory,
	  without leading slash.

choice
	prompt "gcc optimization level"
	default BR2_OPTIMIZE_S
	help
	  Set the optimization level for gcc

config BR2_OPTIMIZE_0
	bool "optimization level 0"
	help
	  Do not optimize. This is the default.

config BR2_OPTIMIZE_1
	bool "optimization level 1"
	help
	  Optimize. Optimizing compilation takes somewhat more time,
	  and a lot more memory for a large function. With -O, the
	  compiler tries to reduce code size and execution time,
	  without performing any optimizations that take a great deal
	  of compilation time. -O turns on the following optimization
	  flags: -fdefer-pop -fdelayed-branch -fguess-branch-probability
	  -fcprop-registers -floop-optimize -fif-conversion
	  -fif-conversion2 -ftree-ccp -ftree-dce -ftree-dominator-opts
	  -ftree-dse -ftree-ter -ftree-lrs -ftree-sra -ftree-copyrename
	  -ftree-fre -ftree-ch -funit-at-a-time -fmerge-constants
	  -O also turns on -fomit-frame-pointer on machines where doing
	  so does not interfere with debugging.

config BR2_OPTIMIZE_2
	bool "optimization level 2"
	help
	  Optimize even more. GCC performs nearly all supported optimizations
	  that do not involve a space-speed tradeoff. The compiler does not
	  perform loop unrolling or function inlining when you specify -O2.
	  As compared to -O, this option increases both compilation time and
	  the performance of the generated code. -O2 turns on all optimization
	  flags specified by -O. It also turns on the following optimization
	  flags: -fthread-jumps -fcrossjumping -foptimize-sibling-calls
	  -fcse-follow-jumps -fcse-skip-blocks -fgcse  -fgcse-lm
	  -fexpensive-optimizations -fstrength-reduce -frerun-cse-after-loop
	  -frerun-loop-opt -fcaller-saves -fpeephole2 -fschedule-insns
	  -fschedule-insns2 -fsched-interblock -fsched-spec -fregmove
	  -fstrict-aliasing -fdelete-null-pointer-checks -freorder-blocks
	  -freorder-functions -falign-functions -falign-jumps -falign-loops
	  -falign-labels -ftree-vrp -ftree-pre
	  Please note the warning under -fgcse about invoking -O2 on programs
	  that use computed gotos.

config BR2_OPTIMIZE_3
	bool "optimization level 3"
	help
	  Optimize yet more. -O3 turns on all optimizations specified by -O2
	  and also turns on the -finline-functions, -funswitch-loops and
	  -fgcse-after-reload options.

config BR2_OPTIMIZE_S
	bool "optimize for size"
	help
	  Optimize for size. -Os enables all -O2 optimizations that do not
	  typically increase code size. It also performs further optimizations
	  designed to reduce code size. -Os disables the following optimization
	  flags: -falign-functions -falign-jumps -falign-loops -falign-labels
	  -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays
	  -ftree-vect-loop-version

endchoice

config BR2_GOOGLE_BREAKPAD_ENABLE
	bool "Enable google-breakpad support"
	select BR2_PACKAGE_GOOGLE_BREAKPAD
	depends on BR2_INSTALL_LIBSTDCPP
	depends on BR2_TOOLCHAIN_USES_GLIBC
	depends on BR2_PACKAGE_GOOGLE_BREAKPAD_ARCH_SUPPORTS
	help
	  This option will enable the use of google breakpad, a
	  library and tool suite that allows you to distribute an
	  application to users with compiler-provided debugging
	  information removed, record crashes in compact "minidump"
	  files, send them back to your server and produce C and C++
	  stack traces from these minidumps.  Breakpad can also write
	  minidumps on request for programs that have not crashed.

if BR2_GOOGLE_BREAKPAD_ENABLE

config BR2_GOOGLE_BREAKPAD_INCLUDE_FILES
	string "List of executables and libraries to extract symbols from"
	default ""
	help
	  You may specify a space-separated list of binaries and
	  libraries with full paths relative to $(TARGET_DIR) of which
	  debug symbols will be dumped for further use with google
	  breakpad.

	  A directory structure that can be used by minidump-stackwalk
	  will be created at:

	  $(STAGING_DIR)/usr/share/google-breakpad-symbols

endif

choice
	bool "build code with Stack Smashing Protection"
	default BR2_SSP_ALL if BR2_ENABLE_SSP # legacy
	depends on BR2_TOOLCHAIN_HAS_SSP
	help
	  Enable stack smashing protection support using GCC's
	  -fstack-protector option family.

	  See http://www.linuxfromscratch.org/hints/downloads/files/ssp.txt
	  for details.

	  Note that this requires the toolchain to have SSP
	  support. This is always the case for glibc and eglibc
	  toolchain, but is optional in uClibc toolchains.

config BR2_SSP_NONE
	bool "None"
	help
	  Disable stack-smashing protection.

config BR2_SSP_REGULAR
	bool "-fstack-protector"
	help
	  Emit extra code to check for buffer overflows, such as stack
	  smashing attacks. This is done by adding a guard variable to
	  functions with vulnerable objects. This includes functions
	  that call alloca, and functions with buffers larger than 8
	  bytes. The guards are initialized when a function is entered
	  and then checked when the function exits. If a guard check
	  fails, an error message is printed and the program exits.

config BR2_SSP_STRONG
	bool "-fstack-protector-strong"
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
	help
	  Like -fstack-protector but includes additional functions to be
	  protected - those that have local array definitions, or have
	  references to local frame addresses.

comment "Stack Smashing Protection strong needs a toolchain w/ gcc >= 4.9"
	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_4_9

config BR2_SSP_ALL
	bool "-fstack-protector-all"
	help
	  Like -fstack-protector except that all functions are
	  protected. This option might have a significant performance
	  impact on the compiled binaries.

endchoice

comment "Stack Smashing Protection needs a toolchain w/ SSP"
	depends on !BR2_TOOLCHAIN_HAS_SSP

choice
	bool "libraries"
	default BR2_SHARED_LIBS if BR2_BINFMT_SUPPORTS_SHARED
	default BR2_STATIC_LIBS if !BR2_BINFMT_SUPPORTS_SHARED
	help
	  Select the type of libraries you want to use on the target.

	  The default is to build dynamic libraries and use those on
	  the target filesystem, except when the architecture and/or
	  the selected binary format does not support shared
	  libraries.

config BR2_STATIC_LIBS
	bool "static only"
	help
	  Build and use only static libraries. No shared libraries
	  will be instaled on the target. This potentially increases
	  your code size and should only be used if you know what you
	  are doing. Note that some packages may not be available when
	  this option is enabled, due to their need for dynamic
	  library support.

config BR2_SHARED_LIBS
	bool "shared only"
	depends on BR2_BINFMT_SUPPORTS_SHARED
	help
	  Build and use only shared libraries. This is the recommended
	  solution as it saves space and build time.

config BR2_SHARED_STATIC_LIBS
	bool "both static and shared"
	depends on BR2_BINFMT_SUPPORTS_SHARED
	help
	  Build both shared and static libraries, but link executables
	  dynamically. While building both shared and static libraries
	  take more time and more disk space, having static libraries
	  may be useful to link some of the applications statically.

endchoice


config BR2_PACKAGE_OVERRIDE_FILE
	string "location of a package override file"
	default "$(CONFIG_DIR)/local.mk"
	help
	  A package override file is a short makefile that contains
	  variable definitions of the form <pkg>_OVERRIDE_SRCDIR,
	  which allows to tell Buildroot to use an existing directory
	  as the source directory for a particular package. See the
	  Buildroot documentation for more details on this feature.

config BR2_GLOBAL_PATCH_DIR
	string "global patch directories"
	help
	  You may specify a space separated list of one or more directories
	  containing global package patches. For a specific version
	  <packageversion> of a specific package <packagename>, patches are
	  applied as follows:

	  First, the default Buildroot patch set for the package is applied
	  from the package's directory in Buildroot.

	  Then for every directory - <global-patch-dir> - that exists in
	  BR2_GLOBAL_PATCH_DIR, if the directory
	  <global-patch-dir>/<packagename>/<packageversion>/ exists, then all
	  *.patch files in this directory will be applied.

	  Otherwise, if the directory <global-patch-dir>/<packagename> exists,
	  then all *.patch files in the directory will be applied.

menu "Advanced"

config BR2_COMPILER_PARANOID_UNSAFE_PATH
	bool "paranoid check of library/header paths"
	help
	  By default, when this option is disabled, when the Buildroot
	  cross-compiler will encounter an unsafe library or header
	  path (such as /usr/include, or /usr/lib), the compiler will
	  display a warning.

	  By enabling this option, this warning is turned into an
	  error, which will completely abort the build when such
	  unsafe paths are encountered.

	  Note that this mechanism is available for both the internal
	  toolchain (through gcc and binutils patches) and external
	  toolchain backends (through the external toolchain wrapper).

endmenu

endmenu

source "toolchain/Config.in"

source "system/Config.in"

source "linux/Config.in"

source "package/Config.in"

source "fs/Config.in"

source "boot/Config.in"

source "package/Config.in.host"

source "Config.in.legacy"

menu "User-provided options"
	depends on BR2_EXTERNAL != "support/dummy-external"

source "$BR2_EXTERNAL/Config.in"

endmenu
