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

config PICOLIBC_USE_MODULE
	bool "Use picolibc module"
	default y
	select PICOLIBC_MODULE
	help
	  Use picolibc module instead of picolibc included with toolchain

config PICOLIBC_HEAP_SIZE
	int "Picolibc heap size (bytes)"
	default 1048576 if MMU
	default 65536 if USERSPACE && MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
	default -1
	help
	  Indicates the amount of memory which will be used by the picolibc
	  malloc() heap.

	  If user mode is enabled, and MPU hardware has requirements that
	  regions be sized to a power of two and aligned to their size,
	  then this must be defined as a power of two or a compile error
	  will result.

	  If set to zero, then no malloc() heap will be available.

	  If set to -1, then all remaining system RAM will be used for this
	  area.

config PICOLIBC_IO_LONG_LONG
	bool "support for long long in integer-only printf/scanf"
	default n
	help
	  Includes support for long long in integer-only printf/scanf. long long
	  types are always supported in the floating-point versions.

config PICOLIBC_IO_FLOAT
	bool "support for floating point values in printf/scanf"
	default n
	help
	  Include floating point support in printf/scanf functions.

if PICOLIBC_USE_MODULE

if PICOLIBC
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_IO_C99_FORMATS
	bool "support C99 format additions in printf/scanf"
	default y
	help
	  Includes support for hex floats (in floating-point version) and j, z,
	  t size modifiers.

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

config PICOLIBC_IO_FLOAT_EXACT
	bool "support for exact float/string conversion"
	default y
	depends on PICOLIBC_USE_MODULE
	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_LOCALE_INFO
	bool "support locales in libc functions"
	default n
	depends on PICOLIBC_USE_MODULE
	help
	  Includes code for basic locale support

config PICOLIBC_LOCALE_EXTENDED_INFO
	bool "support extended locales in libc functions"
	default n
	depends on PICOLIBC_USE_MODULE
	help
	  Includes code for extended locale support

config PICOLIBC_MULTIBYTE
	bool "support multibyte functions in libc"
	default n
	depends on PICOLIBC_USE_MODULE
	help
	  Includes code for multi-byte characters

config PICOLIBC_PICOEXIT
	bool "use smaller atexit/onexit implementation"
	default y
	depends on PICOLIBC_USE_MODULE
	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
	depends on PICOLIBC_USE_MODULE
	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"
	depends on PICOLIBC_USE_MODULE
	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

endif
