if BR2_TOOLCHAIN_BUILDROOT_UCLIBC

comment "uClibc Options"

config BR2_PACKAGE_UCLIBC
	bool
	default y
	select BR2_PACKAGE_LINUX_HEADERS

config BR2_UCLIBC_CONFIG
	string "uClibc configuration file to use?"
	default "package/uclibc/uClibc-ng.config"
	help
	  Some people may wish to use their own modified uClibc configuration
	  file and will specify their config file location with this option.
	  See also docs/README in this package.
	  If unsure, use the default.

config BR2_UCLIBC_CONFIG_FRAGMENT_FILES
	string "Additional uClibc configuration fragment files"
	help
	  A space-separated list of configuration fragment files,
	  that will be merged to the main uClibc configuration file.

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
	select BR2_NEEDS_HOST_UTF8_LOCALE
	help
	  Enable this option if you want your toolchain to support
	  localization and internationalization.

choice
	prompt "Thread library implementation"
	help
	  Use this option to select the thread library implementation
	  that should be used in your toolchain.

	config BR2_PTHREADS_NATIVE
		bool "Native POSIX Threading (NPTL)"
		select BR2_TOOLCHAIN_HAS_THREADS
		select BR2_TOOLCHAIN_HAS_THREADS_NPTL
		depends on BR2_USE_MMU
		depends on !BR2_m68k && !BR2_microblaze && !BR2_or1k

	config BR2_PTHREADS
		bool "linuxthreads"
		select BR2_TOOLCHAIN_HAS_THREADS
		depends on BR2_bfin || BR2_m68k || BR2_microblaze || BR2_or1k || BR2_arm || BR2_armeb || BR2_xtensa

	config BR2_PTHREADS_NONE
		bool "none"

endchoice

config BR2_PTHREAD_DEBUG
	bool "Thread library debugging"
	depends on BR2_PTHREADS || BR2_PTHREADS_NATIVE
	select BR2_TOOLCHAIN_HAS_THREADS_DEBUG
	help
	  Build the thread library with debugging enabled.

config BR2_TOOLCHAIN_BUILDROOT_USE_SSP
	bool "Enable stack protection support"
	select BR2_TOOLCHAIN_HAS_SSP
	help
	  Enable stack smashing protection support using GCCs
	  -fstack-protector-all option in uClibc.

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

config BR2_UCLIBC_INSTALL_UTILS
	bool "Compile and install uClibc utilities"
	default y
	help
	  Enabling this option will compile and install the getconf,
	  ldconfig and ldd uClibc utilities for the target.

	  You can save ~32 KiB in target space by disabling them since
	  they're normally not needed.

# Mapping from the Buildroot architecture configuration options to the
# uClibc architecture names.
config BR2_UCLIBC_TARGET_ARCH
	string
	default "arc"	   if BR2_arcle || BR2_arceb
	default "arm"	   if BR2_arm	|| BR2_armeb
	default "bfin"	   if BR2_bfin
	default "m68k"	   if BR2_m68k
	default "microblaze"   if BR2_microblaze
	default "mips"	   if BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el
	default "or1k"     if BR2_or1k
	default "powerpc"  if BR2_powerpc
	default "sh"	   if BR2_sh
	default "sparc"	   if BR2_sparc
	default "xtensa"   if BR2_xtensa
	default "i386"	   if BR2_i386
	default "x86_64"   if BR2_x86_64

config BR2_UCLIBC_ARC_TYPE
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "arc"
	default "ARC_CPU_700"	if BR2_arc750d
	default "ARC_CPU_700"	if BR2_arc770d
	default "ARC_CPU_HS"	if BR2_archs38

config BR2_UCLIBC_MIPS_ABI
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "mips"
	default "O32" if BR2_MIPS_OABI32
	default "N32" if BR2_MIPS_NABI32
	default "N64" if BR2_MIPS_NABI64

config BR2_UCLIBC_MIPS_NAN
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "mips"
	default "LEGACY" if BR2_MIPS_CPU_MIPS32 || BR2_MIPS_CPU_MIPS64
	default "2008" if BR2_MIPS_CPU_MIPS32R6 || BR2_MIPS_CPU_MIPS64R6

config BR2_UCLIBC_SH_TYPE
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "sh"
	default "SH2A" if BR2_sh2a
	default "SH4"  if BR2_sh4 || BR2_sh4eb

config BR2_UCLIBC_SPARC_TYPE
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "sparc"
	default "V7"	if BR2_sparc_v7 || BR2_sparc_sparchfleon || BR2_sparc_sparcsfleon
	default "V8"	if BR2_sparc_v8 || BR2_sparc_sparchfleonv8 || BR2_sparc_sparcsfleonv8

config BR2_UCLIBC_POWERPC_TYPE
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "powerpc"
	default "CLASSIC" if !BR2_powerpc_8540 && !BR2_powerpc_8548
	default "E500"    if BR2_powerpc_8540 || BR2_powerpc_8548

config BR2_UCLIBC_X86_TYPE
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "i386"
	default "486"        if BR2_x86_i486
	default "586"        if BR2_x86_i586
	default "586MMX"     if BR2_x86_pentium_mmx
	default "686"	     if BR2_x86_i686 || BR2_x86_pentiumpro
	default "PENTIUMII"  if BR2_x86_pentium2
	default "PENTIUMIII" if BR2_x86_pentium3
	default "PENTIUM4"   if BR2_x86_pentium4 || BR2_x86_pentium_m || \
	                        BR2_x86_nocona || BR2_x86_core2 || BR2_x86_corei7

endif # BR2_TOOLCHAIN_BUILDROOT_UCLIBC
