# 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

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
	help
	  Build with minimal C library.

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 EXTERNAL_LIBC
	bool "External C library"
	help
	  Build with external/user provided C library.

endchoice #LIBC_IMPLEMENTATION

if NEWLIB_LIBC

if "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "gnuarmemb"
config NEWLIB_LIBC_NANO
	bool "Build with newlib-nano C library"
	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.
endif

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.

endif #NEWLIB_LIBC

if MINIMAL_LIBC

config MINIMAL_LIBC_MALLOC_ARENA_SIZE
	int "Size of the minimal libc malloc arena"
	default 0
	help
	  Indicate the size of the memory arena used for minimal libc's
	  malloc() implementation. This size value must be compatible with
	  a sys_mem_pool definition with nmax of 1 and minsz of 16.

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.

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.

endmenu
