# Generic toolchain options

# we want gdb config in the middle of both source and external
# toolchains, but mconf won't let us source the same file twice,
# so put it here instead
source "toolchain/gdb/Config.in"

comment "Common Toolchain Options"

config BR2_LARGEFILE
	bool "Enable large file (files > 2 GB) support?"
	depends on !BR2_cris
	help
	  If you are building your own toolchain and you want to 
	  support files larger than 2GB then enable this option.
	  If you have an external binary toolchain that has been 
	  built with large file support (files > 2GB) then enable 
	  this option.

config BR2_INET_IPV6
	bool "Enable IPv6"
	help
	  If you are building your own toolchain and you want to 
	  enable IPV6 support then enable this option.
	  If you have an external binary toolchain that has been 
	  built with IPV6 support then enable this option.

config BR2_INET_RPC
	bool "Enable RPC"
	help
	  Enable RPC. RPC support is needed for nfs.
	  If you are building your own toolchain and you want to 
	  enable RPC support then enable this option.
	  If you have an external binary toolchain that has been 
	  built with RPC support then enable this option.

config BR2_ENABLE_LOCALE
	bool "Enable toolchain locale/i18n support?"
	select BR2_USE_WCHAR
	help
	  If you are building your own toolchain and you want to 
	  enable locale/i18n support then enable this option.
	  If you have an external binary toolchain that has been 
	  built with locale/i18n support then enable this option.

config BR2_ENABLE_LOCALE_PURGE
	bool "Purge unwanted locales"
	help
	  Explicitly specify what locales to install on target. If N
	  then all locales supported by packages are installed.

config BR2_ENABLE_LOCALE_WHITELIST
	string "Locales to keep"
	default "C en_US de fr"
	depends on BR2_ENABLE_LOCALE_PURGE
	help
	  Whitespace seperated list of locales to allow on target.
	  Locales not listed here will be removed from the target.
	  See 'locale -a' on your host for a list of locales available
	  on your build host, or have a look in /usr/share/locale in
	  the target file system for available locales.

	  Notice that listing a locale here doesn't guarantee that it
	  will be available on the target - That purely depends on the
	  support for that locale in the selected packages.

# glibc and eglibc directly include gettext, so a separatly compiled
# gettext isn't needed and shouldn't be built to avoid conflicts. Some
# packages always need gettext, other packages only need gettext when
# locale support is enabled. See the documentation for how packages
# should rely on the following two options.

config BR2_NEEDS_GETTEXT
	bool
	default y if BR2_TOOLCHAIN_BUILDROOT
	default y if BR2_TOOLCHAIN_EXTERNAL_UCLIBC

config BR2_NEEDS_GETTEXT_IF_LOCALE
	bool
	default y if (BR2_NEEDS_GETTEXT && BR2_ENABLE_LOCALE)

config BR2_USE_WCHAR
	bool "Enable WCHAR support"
	help
	  If you are building your own toolchain and you want to 
	  enable WCHAR support then enable this option.
	  If you have an external binary toolchain that has been built 
	  with WCHAR support then enable this option.

config BR2_PREFER_SOFT_FLOAT
	bool
	default y if BR2_arm || BR2_armeb || BR2_avr32 || BR2_mips || BR2_mipsel

config BR2_SOFT_FLOAT
	bool "Use software floating point by default"
	depends on BR2_arm || BR2_armeb || BR2_avr32 || BR2_mips || BR2_mipsel || BR2_powerpc
	default $(BR2_PREFER_SOFT_FLOAT)
	help
	  If your target CPU does not have a Floating Point Unit (FPU) or a
	  kernel FPU emulator, but you still wish to support floating point
	  functions, then everything will need to be compiled with soft
	  floating point support (-msoft-float).

config BR2_USE_SSP
	bool "Enable stack protection support"
	help
	  Enable stack smashing protection support using GCCs
	  -fstack-protector[-all] option.

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

choice
	prompt "Thread library implementation"
	default BR2_PTHREADS_OLD
	help
	  If you are building your own toolchain then select the type of 
	  libpthreads you want to use.
	  Not all thread variants work with all versions of uClibc,
	  the "linuxthreads (stable/old)" may be a working fallback
	  if you need threading at all.
	  If you have an external binary toolchain then select the type 
	  of libpthreads it was built with.

	config BR2_PTHREADS_NONE
		bool "none"

	config BR2_PTHREADS
		bool "linuxthreads"

	config BR2_PTHREADS_OLD
		bool "linuxthreads (stable/old)"

	config BR2_PTHREADS_NATIVE
		bool "Native POSIX Threading (NPTL)"
		depends on BR2_UCLIBC_VERSION_SNAPSHOT
endchoice

config BR2_PROGRAM_INVOCATION
	bool "Enable 'program invocation name'"
	help
	  Support for the GNU-specific program_invocation_name and
	  program_invocation_short_name strings.  Some GNU packages
	  (like tar and coreutils) utilize these for extra useful
	  output, but in general are not required.
	  If you have an external binary toolchain that has been built
	  with program invocation support then enable this option.

config BR2_GCC_CROSS_CXX
	bool
	help
	  If you are building your own toolchain and want to build 
	  a C++ cross-compiler this needs to be enabled.
	  If you have an external binary toolchain that has a C++ compiler
	  and you want to use it then you need to enable this option.

config BR2_INSTALL_LIBSTDCPP
	bool "Build/install c++ compiler and libstdc++?"
	select BR2_GCC_CROSS_CXX
	depends on !(BR2_avr32 && BR2_ENABLE_LOCALE && BR2_UCLIBC_VERSION_0_9_31)
	help
	  If you are building your own toolchain and want to build and install
	  the C++ compiler and library then you need to enable this option.
	  If you have an external toolchain that has been built with C++ 
	  support and you want to use the compiler / library then you need 
	  to select this option.

comment "C++ support broken in uClibc 0.9.31 with locale enabled"
	depends on BR2_avr32 && BR2_ENABLE_LOCALE && BR2_UCLIBC_VERSION_0_9_31

config BR2_TARGET_OPTIMIZATION
	string "Target Optimizations"
	default "-pipe"
	help
	  Optimizations to use when building for the target host.
	  NOTE: gcc optimization level is defined in build options.
