# C library

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

config REQUIRES_FULL_LIBC
	prompt "Require complete C library"
	bool
	help
	  Select a C library implementation that provides a complete C library
	  implementation, rather than the subset provided by MINIMAL_LIBC.

config REQUIRES_FLOAT_PRINTF
	bool "Requires floating point support in printf"
	select CBPRINTF_FP_SUPPORT if MINIMAL_LIBC
	select NEWLIB_LIBC_FLOAT_PRINTF if NEWLIB_LIBC
	help
	  Select a printf implementation that provides a complete
	  implementation including floating point support.

config FULL_LIBC_SUPPORTED
	bool
	help
	  Selected when the target has at least one C library that offers a
	  complete implementation and which would be selected when
	  REQUIRES_FULL_LIBC is set.

config MINIMAL_LIBC_SUPPORTED
	bool
	depends on !NATIVE_APPLICATION
	default y
	help
	  Selected when the target has support for the minimal C library

config NEWLIB_LIBC_SUPPORTED
	bool
	default y
	depends on "$(TOOLCHAIN_HAS_NEWLIB)" = "y"
	depends on !NATIVE_APPLICATION
	select FULL_LIBC_SUPPORTED
	help
	  Selected when the target has support for the newlib C library

# Picolibc with C++ support in Zephyr SDK is handled by Zephyr SDK's own Kconfig.
config PICOLIBC_SUPPORTED
	bool
	depends on !NATIVE_APPLICATION
	depends on ("$(TOOLCHAIN_HAS_PICOLIBC)" = "y") || (ZEPHYR_PICOLIBC_MODULE && !REQUIRES_FULL_LIBCPP)
	default y
	select FULL_LIBC_SUPPORTED
	help
	  Selected when the target has support for picolibc.

config IAR_LIBC_SUPPORTED
	bool
	default n
	select FULL_LIBC_SUPPORTED
	help
	  Selected if the target is an IAR Systems compiler

config NATIVE_LIBC_INCOMPATIBLE
	bool
	help
	  Other Kconfig options can select this, if they are not compatible with the
	  native/host libC, and should only be compiled with an embedded libC

menu "C Library"

choice LIBC_IMPLEMENTATION
	prompt "C Library Implementation"
	default EXTERNAL_LIBC if NATIVE_BUILD && !(NATIVE_LIBRARY && NATIVE_LIBC_INCOMPATIBLE)
	default PICOLIBC
	default NEWLIB_LIBC if REQUIRES_FULL_LIBC
	default MINIMAL_LIBC
	default IAR_LIBC

config MINIMAL_LIBC
	bool "Minimal C library"
	depends on !REQUIRES_FULL_LIBC
	depends on MINIMAL_LIBC_SUPPORTED
	imply COMPILER_FREESTANDING
	select COMMON_LIBC_ABORT
	select COMMON_LIBC_STRNLEN
	imply COMMON_LIBC_MALLOC
	imply COMMON_LIBC_CALLOC
	imply COMMON_LIBC_REALLOCARRAY
	help
	  Build with minimal C library.

config PICOLIBC
	bool "Picolibc library"
	select COMMON_LIBC_ABORT
	imply THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
	select LIBC_ERRNO if THREAD_LOCAL_STORAGE
	select NEED_LIBC_MEM_PARTITION
	select TC_PROVIDES_POSIX_C_LANG_SUPPORT_R
	imply COMMON_LIBC_MALLOC
	imply COMMON_LIBC_ABORT
	depends on PICOLIBC_SUPPORTED
	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"
	select COMMON_LIBC_ABORT
	depends on NEWLIB_LIBC_SUPPORTED
	select NEED_LIBC_MEM_PARTITION
	select TC_PROVIDES_POSIX_C_LANG_SUPPORT_R
	imply POSIX_DEVICE_IO_ALIAS_CLOSE
	imply POSIX_DEVICE_IO_ALIAS_OPEN
	imply POSIX_DEVICE_IO_ALIAS_READ
	imply POSIX_DEVICE_IO_ALIAS_WRITE
	imply POSIX_FD_MGMT_ALIAS_LSEEK
	imply POSIX_FILE_SYSTEM_ALIAS_FSTAT
	imply POSIX_MULTI_PROCESS_ALIAS_GETPID
	imply POSIX_SIGNALS_ALIAS_KILL
	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.

config IAR_LIBC
	bool "IAR C Runtime Library"
	depends on IAR_LIBC_SUPPORTED
	depends on "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "iar"
	select COMMON_LIBC_STRNLEN
	select COMMON_LIBC_TIME if POSIX_TIMERS
	help
	  Use the full IAR Compiler runtime libraries.
	  A reduced Zephyr minimal libc will be used for library functionality
	  not provided by the IAR C Runtime Library.

endchoice # LIBC_IMPLEMENTATION

config HAS_NEWLIB_LIBC_NANO
	bool

rsource "common/Kconfig"
rsource "minimal/Kconfig"
rsource "newlib/Kconfig"
rsource "picolibc/Kconfig"

config STDOUT_CONSOLE
	bool "Send stdout to console"
	depends on CONSOLE_HAS_DRIVER
	depends on !(NATIVE_APPLICATION || (NATIVE_LIBRARY && EXTERNAL_LIBC))
	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
