# C library

# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menu "C Library"

config REQUIRES_FULL_LIBC
	bool
	help
	  Helper symbol to indicate some feature requires a C library implementation
	  with more functionality than what MINIMAL_LIBC provides

config SUPPORT_MINIMAL_LIBC
	bool
	default y

config PICOLIBC_SUPPORTED
	bool
	depends on ARC || ARM || ARM64 || MIPS || RISCV
	depends on "$(ZEPHYR_TOOLCHAIN_VARIANT)" != "arcmwdt"
	default y
	help
	  Selected when the target has support for picolibc.

choice LIBC_IMPLEMENTATION
	prompt "C Library Implementation"
	default EXTERNAL_LIBC if NATIVE_APPLICATION
	default NEWLIB_LIBC if REQUIRES_FULL_LIBC
	default MINIMAL_LIBC

config MINIMAL_LIBC
	bool "Minimal C library"
	depends on !NATIVE_APPLICATION
	depends on !REQUIRES_FULL_LIBC
	depends on SUPPORT_MINIMAL_LIBC
	help
	  Build with minimal C library.

config PICOLIBC
	bool "Picolibc library"
	select THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
	select LIBC_ERRNO if THREAD_LOCAL_STORAGE
	depends on !NATIVE_APPLICATION
	help
	  Build with picolibc library. The picolibc library is built as
	  a module if PICOLIBC_MODULE is set, otherwise picolibc is
	  expected to be provided by the toolchain.

config NEWLIB_LIBC
	bool "Newlib C library"
	depends on !NATIVE_APPLICATION
	help
	  Build with newlib library. The newlib library is expected to be
	  part of the SDK in this case.

config ARCMWDT_LIBC
	bool "ARC MWDT C library"
	depends on !NATIVE_APPLICATION
	depends on "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "arcmwdt"
	help
	  C library provided by ARC MWDT toolchain.

config EXTERNAL_LIBC
	bool "External C library"
	help
	  Build with external/user provided C library.

endchoice # LIBC_IMPLEMENTATION

config HAS_NEWLIB_LIBC_NANO
	bool

if PICOLIBC

source "lib/libc/picolibc/Kconfig"

endif # PICOLIBC

if NEWLIB_LIBC

config NEWLIB_LIBC_NANO
	bool "Build with newlib-nano C library"
	depends on HAS_NEWLIB_LIBC_NANO
	help
	  Build with newlib-nano library, for small embedded apps.
	  The newlib-nano library for ARM embedded processors is a part of the
	  GNU Tools for ARM Embedded Processors.

config NEWLIB_LIBC_MAX_MAPPED_REGION_SIZE
	int "Maximum memory mapped for newlib heap"
	depends on MMU
	default 1048576
	help
	  On MMU-based systems, indicates the maximum amount of memory which
	  will be used for the newlib malloc() heap. The actual amount of
	  memory used will be the minimum of this value and the amount of
	  free physical memory at kernel boot.

config NEWLIB_LIBC_MIN_REQUIRED_HEAP_SIZE
	int "Newlib minimum required heap size"
	default 2048 if NEWLIB_LIBC_NANO
	default 8192 if !NEWLIB_LIBC_NANO
	help
	  Specifies the amount of memory space that must be available for the
	  newlib heap. An assertion failure message will be displayed during
	  initialization if the memory space available for the newlib heap is
	  smaller than this value.

config NEWLIB_LIBC_ALIGNED_HEAP_SIZE
	int "Newlib aligned heap size"
	depends on MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
	depends on USERSPACE
	default 0
	help
	  If user mode is enabled, and MPU hardware has requirements that
	  regions be sized to a power of two and aligned to their size,
	  and user mode threads need to access this heap, then this is necessary
	  to properly define an MPU region for the heap.

	  If this is left at 0, then remaining system RAM will be used for this
	  area and it may not be possible to program it as an MPU region.

config NEWLIB_LIBC_FLOAT_PRINTF
	bool "Build with newlib float printf"
	help
	  Build with floating point printf enabled. This will increase the size of
	  the image.

config NEWLIB_LIBC_FLOAT_SCANF
	bool "Build with newlib float scanf"
	help
	  Build with floating point scanf enabled. This will increase the size of
	  the image.

config NEWLIB_LIBC_HEAP_LISTENER
	bool "Notify heap listeners of newlib libc heap events"
	select HEAP_LISTENER
	help
	  Notify registered heap listeners upon certain events related to the newlib
	  libc heap usage, such as the heap resize.

endif # NEWLIB_LIBC

if MINIMAL_LIBC

config MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS
	bool "Non-reentrant functions"
	default y if !USERSPACE
	select NEED_LIBC_MEM_PARTITION
	help
	  Enable non-reentrant functions that make use of the globals; e.g.
	  rand() and gmtime(). The globals must be put into a dedicated C
	  library memory partition when CONFIG_USERSPACE=y, and enabling this
	  option may require an additional memory protection region.

config MINIMAL_LIBC_MALLOC
	bool "Minimal libc malloc implementation"
	default y
	help
	  Enable the minimal libc's implementation of malloc, free, and realloc.
	  Disable if you wish to provide your own implementations of these functions.

config MINIMAL_LIBC_MALLOC_ARENA_SIZE
	int "Size of the minimal libc malloc arena"
	default 0
	depends on MINIMAL_LIBC_MALLOC
	help
	  Indicate the size in bytes of the memory arena used for
	  minimal libc's malloc() implementation.

config MINIMAL_LIBC_CALLOC
	bool "Minimal libc trivial calloc implementation"
	default y
	help
	  Enable the minimal libc's trivial implementation of calloc, which
	  forwards to malloc and memset.

config MINIMAL_LIBC_REALLOCARRAY
	bool "Minimal libc trivial reallocarray implementation"
	default y
	help
	  Enable the minimal libc's trivial implementation of reallocarray, which
	  forwards to realloc.

config MINIMAL_LIBC_LL_PRINTF
	bool "Build with minimal libc long long printf" if !64BIT
	default y if 64BIT
	help
	  Build with long long printf enabled. This will increase the size of
	  the image.

config MINIMAL_LIBC_OPTIMIZE_STRING_FOR_SIZE
	bool "Use size optimized string functions"
	default y if SIZE_OPTIMIZATIONS
	help
	  Enable smaller but potentially slower implementations of memcpy and
	  memset. On the Cortex-M0+ this reduces the total code size by 120 bytes.

config MINIMAL_LIBC_RAND
	bool "Rand and srand functions"
	help
	  Enable rand_r() for the minimal libc.

	  In order to make use of the non-reentrant rand() and srand(), it is
	  necessary to set CONFIG_MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS=y.

config MINIMAL_LIBC_TIME
	bool "Time functions"
	default y
	help
	  Enable time() and gmtime_r() for the minimal libc.

	  time() requires CONFIG_POSIX_CLOCK=y because it relies on the POSIX
	  clock_gettime() function.

	  In order to make use of the non-reentrant gmtime(), it is necessary
	  to set CONFIG_MINIMAL_LIBC_NON_REENTRANT_FUNCTIONS=y.

config MINIMAL_LIBC_STRING_ERROR_TABLE
	bool "String error table for strerror() and strerror_r()"
	help
	  Select this option to ensure that streror(), strerror_r()
	  produce strings corresponding to the descriptions in errno.h.

	  The string error table can add ~2kiB to ROM. As such, it is
	  disabled by default. In this case, strerror() and strerror_r()
	  symbols are still present, but the functions produce an empty
	  string.

endif # MINIMAL_LIBC

config STDOUT_CONSOLE
	bool "Send stdout to console"
	depends on CONSOLE_HAS_DRIVER
	depends on !NATIVE_APPLICATION
	default y
	help
	  This option directs standard output (e.g. printf) to the console
	  device, rather than suppressing it entirely. See also EARLY_CONSOLE
	  option.

config NEED_LIBC_MEM_PARTITION
	bool
	help
	  Hidden option to signal that a memory partition is needed for
	  the C library even though it would not have been enabled
	  otherwise.

endmenu
