# Buildroot backend specific options

if BR2_TOOLCHAIN_BUILDROOT

comment "Toolchain Options"

config BR2_TOOLCHAIN_BUILDROOT_LARGEFILE
	bool "Enable large file (files > 2 GB) support"
	select BR2_LARGEFILE
	help
	  Enable this option if you want your toolchain to support
	  files bigger than 2 GB.

config BR2_TOOLCHAIN_BUILDROOT_INET_IPV6
	bool "Enable IPv6 support"
	select BR2_INET_IPV6
	help
	  Enable this option if you want your toolchain to support
	  IPv6.

config BR2_TOOLCHAIN_BUILDROOT_INET_RPC
	bool "Enable RPC support"
	select BR2_TOOLCHAIN_HAS_NATIVE_RPC
	help
	  Enable this option if you want your toolchain to support
	  RPC (needed for NFS, for example).

config BR2_TOOLCHAIN_BUILDROOT_WCHAR
	bool "Enable WCHAR support"
	select BR2_USE_WCHAR
	help
	  Enable this option if you want your toolchain to support
	  wide characters (i.e characters longer than 8 bits, needed
	  for locale support).

config BR2_TOOLCHAIN_BUILDROOT_LOCALE
	bool "Enable toolchain locale/i18n support"
	select BR2_TOOLCHAIN_BUILDROOT_WCHAR
	select BR2_ENABLE_LOCALE
	help
	  Enable this option if you want your toolchain to support
	  localization and internationalization.

config BR2_TOOLCHAIN_BUILDROOT_CXX
	bool "Enable C++ support"
	select BR2_INSTALL_LIBSTDCPP
	depends on !(! BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE && \
		       BR2_TOOLCHAIN_BUILDROOT_LOCALE    && \
		       BR2_UCLIBC_VERSION_0_9_31)
	help
	  Enable this option if you want your toolchain to support the
	  C++ language and you want C++ libraries to be installed on
	  your target system.

comment "C++ support broken in uClibc 0.9.31 with locale enabled with gcc 4.2"
	depends on !BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE && \
		    BR2_TOOLCHAIN_BUILDROOT_LOCALE    && \
		    BR2_UCLIBC_VERSION_0_9_31

config BR2_TOOLCHAIN_BUILDROOT_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_NATIVE if (!BR2_UCLIBC_VERSION_0_9_31) && !BR2_ARM_OABI && !(BR2_avr32 || BR2_xtensa)
	default BR2_PTHREADS_OLD
	help
	  Use this option to select the thread library implementation
	  that should be used in your toolchain. 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.

	config BR2_PTHREADS_NONE
		bool "none"

	config BR2_PTHREADS
		bool "linuxthreads"
		depends on !BR2_xtensa
	        select BR2_TOOLCHAIN_HAS_THREADS

	config BR2_PTHREADS_OLD
		bool "linuxthreads (stable/old)"
	        select BR2_TOOLCHAIN_HAS_THREADS

	config BR2_PTHREADS_NATIVE
		bool "Native POSIX Threading (NPTL)"
	        select BR2_TOOLCHAIN_HAS_THREADS
		depends on !BR2_UCLIBC_VERSION_0_9_31
		depends on !BR2_ARM_OABI
		depends on !BR2_x86_i386
		depends on !BR2_avr32
		depends on !BR2_xtensa
endchoice

source "toolchain/elf2flt/Config.in"

config BR2_VFP_FLOAT
	bool "Use ARM Vector Floating Point unit"
	depends on !BR2_SOFT_FLOAT
	depends on BR2_arm || BR2_armeb
	help
	  Setting this option will enable the "-mfpu=vfp" option.
	  If your ARM CPU has a Vector Floating Point Unit (VFP)
	  and the toolchain supports the option, then the
	  code can be optimized.

	  Most people will answer N.

endif
