if BR2_TOOLCHAIN_BUILDROOT_UCLIBC

# For legal-info
config BR2_PACKAGE_UCLIBC
	bool
	default y

comment "uClibc Options"

choice
	prompt "uClibc C library Version"
	default BR2_UCLIBC_VERSION_0_9_33
	help
	  Select the version of uClibc you wish to use.

	config BR2_UCLIBC_VERSION_0_9_31
		bool "uClibc 0.9.31.x"
		depends on BR2_avr32

	config BR2_UCLIBC_VERSION_0_9_33
		bool "uClibc 0.9.33.x"
		depends on !(BR2_arc || BR2_avr32 || BR2_xtensa)

	config BR2_UCLIBC_VERSION_XTENSA_GIT
		bool "uClibc Git Xtensa"
		depends on BR2_xtensa

	config BR2_UCLIBC_VERSION_SNAPSHOT
		bool "daily snapshot"
		depends on !(BR2_arc)

endchoice

config BR2_USE_UCLIBC_SNAPSHOT
	string "Date (yyyymmdd) of snapshot or 'snapshot' for latest"
	default "snapshot"
	depends on BR2_UCLIBC_VERSION_SNAPSHOT
	help
	  Use latest snapshot or one from a specific date?

config BR2_UCLIBC_VERSION_STRING
	string
	default 0.9.31.1	if BR2_UCLIBC_VERSION_0_9_31
	default 0.9.33.2	if BR2_UCLIBC_VERSION_0_9_33
	default "arc-2014.12" if BR2_arc
	default "7bf35c8b7d4a1f97174eb49f47f33946b282114c" if BR2_UCLIBC_VERSION_XTENSA_GIT
	default BR2_USE_UCLIBC_SNAPSHOT	if BR2_UCLIBC_VERSION_SNAPSHOT

config BR2_UCLIBC_CONFIG
	string "uClibc configuration file to use?"
	default "package/uclibc/uClibc-0.9.31.config" if BR2_UCLIBC_VERSION_0_9_31
	default "package/uclibc/uClibc-0.9.33.config" if BR2_UCLIBC_VERSION_0_9_33
	default "package/uclibc/uClibc-snapshot.config" if BR2_arc
	default "package/uclibc/uClibc-snapshot.config" if BR2_UCLIBC_VERSION_SNAPSHOT
	default "package/uclibc/uClibc-snapshot.config" if BR2_UCLIBC_VERSION_XTENSA_GIT
	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_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.

choice
	prompt "Thread library implementation"
	default BR2_PTHREADS_NATIVE if !(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_bfin
		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
		select BR2_TOOLCHAIN_HAS_THREADS_NPTL
		depends on !BR2_arc
		depends on !BR2_avr32
		depends on !BR2_bfin
		depends on !BR2_xtensa
		depends on !BR2_x86_i386
endchoice

config BR2_PTHREAD_DEBUG
	bool "Thread library debugging"
	depends on BR2_PTHREADS || BR2_PTHREADS_OLD || 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"
	depends on !BR2_bfin
	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.

config BR2_UCLIBC_INSTALL_TEST_SUITE
	bool "Compile and install uClibc tests"
	select BR2_PACKAGE_MAKE
	depends on BR2_USE_MMU # make
	help
	  Enabling this option will compile and install the uClibc test suite.
	  This is useful if you want to check if the uClibc library is working
	  for your architecture and/or help developing uClibc.

	  The test suite will be installed into /root/uClibc directory. To run
	  the test suite enter the /root/uClibc/test directory and type
	  "make UCLIBC_ONLY=1 CC=/bin/true check".

	  See the /root/uClibc/test/README for additional information.

	  This is not needed at all for normal builds, so you can safely say no
	  if you do not plan to dig into your C library.

# 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 avr32	   if BR2_avr32
	default bfin	   if BR2_bfin
	default m68k	   if BR2_m68k
	default mips	   if BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el
	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_ARM_BX
	bool
	depends on BR2_UCLIBC_TARGET_ARCH = "arm"
	default y if (BR2_ARM_CPU_HAS_THUMB || BR2_ARM_CPU_HAS_THUMB2)

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_ISA
	string
	depends on BR2_UCLIBC_TARGET_ARCH = "mips"
	default MIPS32 if BR2_mips_32
	default MIPS32R2 if BR2_mips_32r2
	default MIPS64 if BR2_mips_64

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 386     if BR2_x86_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
