lib/libc: picolibc: select its source with Kconfig choice

Implement the selection of the picolibc source in a Kconfig
choice as they are mutually exclusive.

The following table represents the possible choices, where 'X'
means that `PICOLIBC_SUPPORTED=n` and is guarded in the parent
level as `PICOLIBC=n`, so we do not need to care.

Module  Toolchain    C++   |       Choice
  0         0         0    |          X
  0         0         1    |          X
  0         1         0    |    Toolchain only
  0         1         1    |    Toolchain only
  1         0         0    |      Module only
  1         0         1    |          X
  1         1         0    |   Toolchain/Module
  1         1         1    |    Toolchain only

The current implementation favors `PICOLIBC_USE_TOOLCHAIN` over
`PICOLIBC_USE_MODULE` whenever possible, that preference is
maintained in this implementation as well - the TOOLCHAIN
source will be the default choice when the toolchain supports
it or when the C++ is enabled. Otherwise, fallback to MODULE.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
This commit is contained in:
Yong Cong Sin 2024-07-02 16:05:11 +08:00 committed by Anas Nashif
parent 38753852c8
commit f87539081d
1 changed files with 13 additions and 4 deletions

View File

@ -3,9 +3,13 @@
if PICOLIBC if PICOLIBC
choice PICOLIBC_SOURCE
prompt "Source of Picolibc"
default PICOLIBC_USE_TOOLCHAIN if REQUIRES_FULL_LIBCPP || "$(TOOLCHAIN_HAS_PICOLIBC)" = "y"
default PICOLIBC_USE_MODULE
config PICOLIBC_USE_MODULE config PICOLIBC_USE_MODULE
bool "Picolibc as module" if "$(TOOLCHAIN_HAS_PICOLIBC)" = "y" bool "Picolibc from module"
default y if "$(TOOLCHAIN_HAS_PICOLIBC)" != "y"
depends on ZEPHYR_PICOLIBC_MODULE depends on ZEPHYR_PICOLIBC_MODULE
depends on !GLIBCXX_LIBCPP depends on !GLIBCXX_LIBCPP
help help
@ -15,9 +19,14 @@ config PICOLIBC_USE_MODULE
# force TLS when using toolchain with TLS support # force TLS when using toolchain with TLS support
config PICOLIBC_USE_TOOLCHAIN config PICOLIBC_USE_TOOLCHAIN
bool bool "Picolibc from toolchain"
default y if !PICOLIBC_USE_MODULE depends on "$(TOOLCHAIN_HAS_PICOLIBC)" = "y"
select THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE select THREAD_LOCAL_STORAGE if ARCH_HAS_THREAD_LOCAL_STORAGE && TOOLCHAIN_SUPPORTS_THREAD_LOCAL_STORAGE
help
Use picolibc included with the toolchain.
This is required when using a full C++ standard library (`REQUIRES_FULL_LIBCPP=y`).
endchoice # PICOLIBC_SOURCE
choice PICOLIBC_IO_LEVEL choice PICOLIBC_IO_LEVEL
prompt "Picolibc printf/scanf level" prompt "Picolibc printf/scanf level"