# Copyright © 2021 Amazon.com, Inc. or its affiliates.
# SPDX-License-Identifier: Apache-2.0

if PICOLIBC

choice PICOLIBC_SOURCE
	prompt "Source of Picolibc"
	default PICOLIBC_USE_TOOLCHAIN if REQUIRES_FULL_LIBCPP || "$(TOOLCHAIN_HAS_PICOLIBC)" = "y"
	default PICOLIBC_USE_MODULE

config PICOLIBC_USE_MODULE
	bool "Picolibc from module"
	depends on ZEPHYR_PICOLIBC_MODULE
	depends on !GLIBCXX_LIBCPP
	help
	  Use picolibc module instead of picolibc included with toolchain.
	  This is enabled by default for toolchains other than the Zephyr
	  SDK.

# force TLS when using toolchain with TLS support
config PICOLIBC_USE_TOOLCHAIN
	bool "Picolibc from toolchain"
	depends on "$(TOOLCHAIN_HAS_PICOLIBC)" = "y"
	select THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
	help
	  Use picolibc included with the toolchain.
	  This is required when using a full C++ standard library (`REQUIRES_FULL_LIBCPP=y`).

endchoice # PICOLIBC_SOURCE

choice PICOLIBC_IO_LEVEL
	prompt "Picolibc printf/scanf level"
	default PICOLIBC_IO_MINIMAL if CBPRINTF_NANO
	default PICOLIBC_IO_LONG_LONG if CBPRINTF_FULL_INTEGRAL
	default PICOLIBC_IO_INTEGER
	help
	  Selects the level of printf and scanf support

config PICOLIBC_IO_FLOAT
	bool "full support for integer/floating point values in printf/scanf"
	help
	  Include full floating point and integer support in printf/scanf
	  functions.

config PICOLIBC_IO_LONG_LONG
	bool "full support for integer values, including long long, in printf/scanf"
	depends on !REQUIRES_FLOAT_PRINTF && (!CBPRINTF_FP_SUPPORT || CBPRINTF_NANO)
	help
	  Includes full integer with long long, but no floating
	  point in printf/scanf.

config PICOLIBC_IO_INTEGER
	bool "full support for integer values, other than long long, in printf/scanf"
	depends on !REQUIRES_FLOAT_PRINTF && ((!CBPRINTF_FP_SUPPORT && !CBPRINTF_FULL_INTEGRAL) || CBPRINTF_NANO)
	help
	  Include full integer other than long long, but no floating point
	  in printf/scanf.

config PICOLIBC_IO_MINIMAL
	bool "limited support for integer values in printf/scanf"
	depends on !REQUIRES_FLOAT_PRINTF && CBPRINTF_NANO
	help
	  Include limited integer and no floating point support in
	  printf/scanf.

endchoice

if PICOLIBC_USE_MODULE

choice PICOLIBC_OPTIMIZATIONS
	prompt "Optimization level"
	default PICOLIBC_SIZE_OPTIMIZATIONS if SIZE_OPTIMIZATIONS
	default PICOLIBC_SPEED_OPTIMIZATIONS if SPEED_OPTIMIZATIONS
	default PICOLIBC_DEBUG_OPTIMIZATIONS if DEBUG_OPTIMIZATIONS
	default PICOLIBC_NO_OPTIMIZATIONS if NO_OPTIMIZATIONS
	help
	  Note that these flags shall only control the compiler
	  optimization level for picolibc, not the level for the
	  rest of Zephyr

config PICOLIBC_SIZE_OPTIMIZATIONS
	bool "Optimize for size"
	help
	  Compiler optimizations will be set to -Os independently of other
	  options.

config PICOLIBC_SPEED_OPTIMIZATIONS
	bool "Optimize for speed"
	help
	  Compiler optimizations will be set to -O2 independently of other
	  options.

config PICOLIBC_DEBUG_OPTIMIZATIONS
	bool "Optimize debugging experience"
	help
	  Compiler optimizations will be set to -Og independently of other
	  options.

config PICOLIBC_NO_OPTIMIZATIONS
	bool "Optimize nothing"
	help
	  Compiler optimizations will be set to -O0 independently of other
	  options.

endchoice

config PICOLIBC_FAST_STRCMP
	bool "always use fast strcmp paths"
	default y
	help
	  This provides a faster strcmp version even when libc is
	  built in space-optimized mode

config PICOLIBC_ASSERT_VERBOSE
	bool "assert provides verbose information"
	help
	  The usual picolibc assert helper, __assert_func, takes file, line,
	  function and expression information to make the presented message
	  more helpful. These all require storage in the image. Unselecting
	  this option eliminates all of that information, making the results
	  less helpful but also making them consume less memory.

config PICOLIBC_IO_C99_FORMATS
	bool "support C99 format additions in printf/scanf"
	default y
	help
	  Includes C99 printf and scanf support for j, z, t size
	  modifiers. C99 support is always included in the floating-point
	  variant

config PICOLIBC_IO_POS_ARGS
	bool "Support POSIX positional args (e.g. %$1d) in printf/scanf"
	default y
	depends on !PICOLIBC_IO_MINIMAL
	help
	  Includes support for positional args (e.g. $1) in integer-only
	  printf and scanf. Positional args are always supported in the
	  floating-point variant.

config PICOLIBC_IO_FLOAT_EXACT
	bool "support for exact float/string conversion"
	default y
	help
	  Uses Ryu algorithm for exact binary/decimal float conversions.
	  This ensures that printf values with enough digits can be
	  fed to scanf and generate exactly the same binary value.

config PICOLIBC_IO_SMALL_ULTOA
	bool "avoid soft division in printf"
	default y
	help
	  Replaces division and modulus by 10 with shifts and adds when
	  doing binary to decimal conversion in printf for 64-bit
	  values on 32-bit targets.

config PICOLIBC_IO_MINIMAL_LONG_LONG
	bool "Include long long support in minimal printf"
	depends on PICOLIBC_IO_MINIMAL
	default y if CBPRINTF_FULL_INTEGRAL
	help
	  Include long long support in the minimal picolibc printf code

config PICOLIBC_LOCALE_INFO
	bool "support locales in libc functions"
	help
	  Includes code for basic locale support

config PICOLIBC_LOCALE_EXTENDED_INFO
	bool "support extended locales in libc functions"
	help
	  Includes code for extended locale support

config PICOLIBC_MULTIBYTE
	bool "support multibyte functions in libc"
	help
	  Includes code for multi-byte characters

config PICOLIBC_PICOEXIT
	bool "use smaller atexit/onexit implementation"
	default y
	help
	  Provides a simpler atexit/onexit implementation that doesn't use
	  malloc, but only supports a small number (32) of exit handlers.

config PICOLIBC_MULTITHREAD
	bool "support multiple threads using retargetable locking API"
	default y
	help
	  Protects shared data structures in libc with mutexes that use
	  an API which can be retargeted to OS provided routines.

config PICOLIBC_GLOBAL_ERRNO
	bool "use a single global variable for errno"
	help
	  Picolibc usually uses a TLS variable for errno, ensuring that
	  multiple threads have a reliable mechanism for detecting libc
	  exceptions. This option switches to a single global errno variable,
	  which can be used to avoid TLS variable usage by the library if
	  necessary.

endif # PICOLIBC_USE_MODULE

endif # PICOLIBC
