# 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 LIBC_ALLOW_LESS_THAN_64BIT_TIME
	bool "Don't require that time_t be at least 64-bits"
	default y if NATIVE_LIBC
	help
	  When selected, time_t will not be required to be at least 64
	  bits. Background: To avoid Y2038 issues time_t needs to be
	  bigger than 32bits. But some C libraries do not provide or
	  default to a type for time_t which is at least
	  64bits. Enable this option if your C library defined time_t
	  is more than 32bits (e.g. 48 bits) or are sure your project
	  is not subject to Y2038 issues.

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
	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"
	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 ("$(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_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
	imply COMMON_LIBC_TIME
	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
	imply COMMON_LIBC_TIME
	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
	imply COMMON_LIBC_TIME
	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 "$(ZEPHYR_TOOLCHAIN_VARIANT)" = "arcmwdt"
	select STATIC_INIT_GNU
	select LIBC_ALLOW_LESS_THAN_64BIT_TIME
	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
	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_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
