The newlib nano variant is currently enabled by default when `CONFIG_NEWLIB_LIBC=y` and the selected toolchain-architecture combination includes the newlib nano variant support, even if `CONFIG_NEWLIB_LIBC_NANO` is not selected by the user. When `CONFIG_NEWLIB_LIBC=y`, this results in the newlib nano variant being selected for some architectures (e.g. ARC, ARM and RISC-V), while the full variant is selected for the rest of the architectures. The above behaviour is problematic because there exist functional differences between the newlib full and nano variants (e.g. C99 format modifiers such as `hh`, `ll`, `z`, `j` and `t` are not available in the newlib nano variant), and this effectively leads to different level of C standard support across different architectures when `CONFIG_NEWLIB_LIBC=y`. This commit fixes this problem by making the `CONFIG_NEWLIB_LIBC_NANO` not `default y` and requiring its user to explicitly set this symbol to `y` when they want to use the newlib nano variant. Signed-off-by: Stephanos Ioannidis <stephanos.ioannidis@nordicsemi.no>
251 lines
7.3 KiB
Plaintext
251 lines
7.3 KiB
Plaintext
# 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
|