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_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)"
	depends on BR2_USE_MMU
	select BR2_TOOLCHAIN_HAS_THREADS
	select BR2_TOOLCHAIN_HAS_THREADS_NPTL

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

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"
	depends on BR2_PACKAGE_HOST_BINUTILS_SUPPORTS_CFI
	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 "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
	default "riscv64"  if BR2_RISCV_64

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

config BR2_UCLIBC_MIPS_NAN
	string
	default "LEGACY" if BR2_MIPS_NAN_LEGACY
	default "2008" if BR2_MIPS_NAN_2008
	depends on BR2_UCLIBC_TARGET_ARCH = "mips"

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

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

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

config BR2_UCLIBC_X86_TYPE
	string
	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
	depends on BR2_UCLIBC_TARGET_ARCH = "i386"

endif # BR2_TOOLCHAIN_BUILDROOT_UCLIBC
