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

if PICOLIBC

config PICOLIBC_USE_MODULE
	bool "Picolibc as module" if "$(TOOLCHAIN_HAS_PICOLIBC)" = "y"
	default y if "$(TOOLCHAIN_HAS_PICOLIBC)" != "y"
	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
	default y if PICOLIBC && !PICOLIBC_USE_MODULE
	select THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE

config PICOLIBC_HEAP_SIZE
	int "[DEPRECATED] Picolibc heap size (bytes)"
	default -2
	help
	  [DEPRECATED] Use COMMON_LIBC_MALLOC_ARENA_SIZE

	  Indicate the size in bytes of the memory arena used for common C
	  library malloc() implementation when using Picolibc.

	  If set to -2, then the value of COMMON_LIBC_MALLOC_ARENA_SIZE
	  will be used.

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
