# 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
	default y
	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
