aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoakim Nohlgård <joakim@nohlgard.se>2022-11-30 01:09:14 +0100
committerChris Packham <judge.packham@gmail.com>2023-03-08 16:54:12 +1300
commit1a362b560768453ac2745abf7a889e7fc423f3da (patch)
tree19f7c3fb7f3130f5214cbd03252087f3b0f47b66
parent9e13e83068afbc3b93728fa4512d8c199617be03 (diff)
downloadcrosstool-ng-1a362b560768453ac2745abf7a889e7fc423f3da.tar.gz
crosstool-ng-1a362b560768453ac2745abf7a889e7fc423f3da.tar.bz2
crosstool-ng-1a362b560768453ac2745abf7a889e7fc423f3da.zip
picolibc: Add configuration to select picolibc as the system libc
This moves the picolibc configuration values under C-library -> picolibc so that they will be more easily discovered. Signed-off-by: Joakim Nohlgård <joakim@nohlgard.se>
-rw-r--r--config/comp_libs/picolibc.in128
-rw-r--r--config/libc/picolibc.in125
-rw-r--r--scripts/build/companion_libs/340-picolibc.sh152
-rw-r--r--scripts/build/libc/picolibc.sh29
4 files changed, 251 insertions, 183 deletions
diff --git a/config/comp_libs/picolibc.in b/config/comp_libs/picolibc.in
index 99f0e452..4b283aec 100644
--- a/config/comp_libs/picolibc.in
+++ b/config/comp_libs/picolibc.in
@@ -1,6 +1,9 @@
-# picolibc options
+# picolibc companion library options
+## no-package
## depends on BARE_METAL && CONFIGURE_has_meson && CONFIGURE_has_ninja
+## depends on !LIBC_PICOLIBC
+## select LIBC_PICOLIBC_SHOW
## help This option adds Picolibc to an existing configuration which may have
## help a C library, allowing you to install both and select between them
@@ -9,124 +12,21 @@
## help Picolibc is a C library intended for use on embedded systems. It is a
## help conglomeration of several library parts, all under BSD-compatible software
## help licenses that make them easily usable on embedded products.
+## help
+## help Configuration for picolibc can be found under:
+## help -> C-library
+## help -> picolibc
config LIBC_PICOLIBC_GCC_LIBSTDCXX
bool
- prompt "Compile libstdc++ picolibc variant"
+ prompt "Compile companion libstdc++ picolibc variant"
default y
depends on CC_LANG_CXX
help
This option compiles an additional target libstdc++ for use with
- picolibc. This version is linked when "--specs=picolibcpp.specs"
- is specified.
+ the picolibc companion library. This version is linked when
+ "--specs=picolibcpp.specs" is specified.
-config LIBC_PICOLIBC_CXA_ATEXIT
- def_bool y
- select LIBC_PROVIDES_CXA_ATEXIT
-
-config LIBC_PICOLIBC_TARGET_CFLAGS
- string
- prompt "Target CFLAGS for picolibc"
- default ""
- help
- Used to add specific options when compiling the target libraries
- (eg. -ffunction-sections -fdata-sections), which can't be defined
- in global TARGET_CFLAGS, because they shall be not used for the
- gcc target libraries.
- Note: Both TARGET_CFLAGS and LIBC_PICOLIBC_TARGET_CFLAGS are used
- to compile the libraries.
-
- Leave blank if you don't know better.
-
-config LIBC_PICOLIBC_IO_C99FMT
- bool
- prompt "Enable IOs on C99 formats"
- default y
- help
- Enable support for IOs on C99 formats.
-
-config LIBC_PICOLIBC_REGISTER_FINI
- bool
- prompt "Enable finalization function registration using atexit"
- help
- Enable finalization function registration using atexit.
-
-config LIBC_PICOLIBC_ATEXIT_DYNAMIC_ALLOC
- bool
- prompt "Enable dynamic allocation of atexit entries"
- help
- Enable dynamic allocation of atexit entries.
-
-config LIBC_PICOLIBC_GLOBAL_ATEXIT
- bool
- prompt "Enable atexit data structure as global variable"
- help
- Enable atexit data structure as global variable, instead
- of being thread-local.
-
-config LIBC_PICOLIBC_LITE_EXIT
- bool
- prompt "Enable lite exit"
- default y
- help
- Enable lite exit, a size-reduced implementation of exit that doesn't
- invoke clean-up functions such as _fini or global destructors.
-
-config LIBC_PICOLIBC_MULTITHREAD
- bool
- prompt "Enable support for multiple threads"
- default y
- help
- Enable support for multiple threads.
-
-config LIBC_PICOLIBC_RETARGETABLE_LOCKING
- bool
- prompt "Enable retargetable locking"
- default y
- help
- Enable retargetable locking to allow the operating system to override
- the dummy lock functions defined within picolibc.
-
-config LIBC_PICOLIBC_EXTRA_SECTIONS
- bool
- prompt "Place each function & data element in their own section"
- help
- Place each function & data symbol in their own section. This allows
- the linker to garbage collect unused symbols at link time.
-
-config LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE
- bool
- prompt "Optimize picolibc for size"
- default y
- help
- Pass --enable-target-optspace to picolibc configure.
-
- This will compile picolibc with -Os.
-
-config LIBC_PICOLIBC_LTO
- bool
- prompt "Enable Link Time Optimization"
- depends on CC_GCC_USE_LTO
- help
- Builds the libraries with -flto to enable more aggressive link time
- optimization. You will need to add -flto-partition=one to your
- application's link line to keep the RETURN assembler macro together
- with it's consumers.
-
-config LIBC_PICOLIBC_NANO_MALLOC
- bool
- prompt "Enable Nano Malloc"
- default y
- help
- PICOLIBC has two implementations of malloc family's functions, one in
- `mallocr.c' and the other one in `nano-mallocr.c'. This options
- enables the nano-malloc implementation, which is for small systems
- with very limited memory. Note that this implementation does not
- support `--enable-malloc-debugging' any more.
-
-config LIBC_PICOLIBC_EXTRA_CONFIG_ARRAY
- string
- prompt "Extra config for picolibc"
- default ""
- help
- Extra flags to pass to meson when configuring picolibc.
+comment "Configuration for picolibc can be found under"
+comment "* -> C-library"
+comment "* -> picolibc"
diff --git a/config/libc/picolibc.in b/config/libc/picolibc.in
new file mode 100644
index 00000000..cd6da1ed
--- /dev/null
+++ b/config/libc/picolibc.in
@@ -0,0 +1,125 @@
+# picolibc options
+
+## depends on BARE_METAL && CONFIGURE_has_meson && CONFIGURE_has_ninja
+## select CC_CORE_NEEDED
+## select LIBC_SUPPORT_THREADS_NATIVE
+
+## help Picolibc is a C library intended for use on embedded systems. It is a
+## help conglomeration of several library parts, all under BSD-compatible software
+## help licenses that make them easily usable on embedded products.
+## help
+## help This requres GCC with picolibc support which is only available
+## help for GCC version 12.2.0 or later. A crosstool-ng dependency conflict
+## help prevents that from being managed automatically.
+##
+
+config LIBC_PICOLIBC_CXA_ATEXIT
+ def_bool y
+ select LIBC_PROVIDES_CXA_ATEXIT
+
+config LIBC_PICOLIBC_TARGET_CFLAGS
+ string
+ prompt "Target CFLAGS for picolibc"
+ default ""
+ help
+ Used to add specific options when compiling the target libraries
+ (eg. -ffunction-sections -fdata-sections), which can't be defined
+ in global TARGET_CFLAGS, because they shall be not used for the
+ gcc target libraries.
+ Note: Both TARGET_CFLAGS and LIBC_PICOLIBC_TARGET_CFLAGS are used
+ to compile the libraries.
+
+ Leave blank if you don't know better.
+
+config LIBC_PICOLIBC_IO_C99FMT
+ bool
+ prompt "Enable IOs on C99 formats"
+ default y
+ help
+ Enable support for IOs on C99 formats.
+
+config LIBC_PICOLIBC_REGISTER_FINI
+ bool
+ prompt "Enable finalization function registration using atexit"
+ help
+ Enable finalization function registration using atexit.
+
+config LIBC_PICOLIBC_ATEXIT_DYNAMIC_ALLOC
+ bool
+ prompt "Enable dynamic allocation of atexit entries"
+ help
+ Enable dynamic allocation of atexit entries.
+
+config LIBC_PICOLIBC_GLOBAL_ATEXIT
+ bool
+ prompt "Enable atexit data structure as global variable"
+ help
+ Enable atexit data structure as global variable, instead
+ of being thread-local.
+
+config LIBC_PICOLIBC_LITE_EXIT
+ bool
+ prompt "Enable lite exit"
+ default y
+ help
+ Enable lite exit, a size-reduced implementation of exit that doesn't
+ invoke clean-up functions such as _fini or global destructors.
+
+config LIBC_PICOLIBC_MULTITHREAD
+ bool
+ prompt "Enable support for multiple threads"
+ default y
+ help
+ Enable support for multiple threads.
+
+config LIBC_PICOLIBC_RETARGETABLE_LOCKING
+ bool
+ prompt "Enable retargetable locking"
+ default y
+ help
+ Enable retargetable locking to allow the operating system to override
+ the dummy lock functions defined within picolibc.
+
+config LIBC_PICOLIBC_EXTRA_SECTIONS
+ bool
+ prompt "Place each function & data element in their own section"
+ help
+ Place each function & data symbol in their own section. This allows
+ the linker to garbage collect unused symbols at link time.
+
+config LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE
+ bool
+ prompt "Optimize picolibc for size"
+ default y
+ help
+ Pass --enable-target-optspace to picolibc configure.
+
+ This will compile picolibc with -Os.
+
+config LIBC_PICOLIBC_LTO
+ bool
+ prompt "Enable Link Time Optimization"
+ depends on CC_GCC_USE_LTO
+ help
+ Builds the libraries with -flto to enable more aggressive link time
+ optimization. You will need to add -flto-partition=one to your
+ application's link line to keep the RETURN assembler macro together
+ with it's consumers.
+
+config LIBC_PICOLIBC_NANO_MALLOC
+ bool
+ prompt "Enable Nano Malloc"
+ default y
+ help
+ PICOLIBC has two implementations of malloc family's functions, one in
+ `mallocr.c' and the other one in `nano-mallocr.c'. This options
+ enables the nano-malloc implementation, which is for small systems
+ with very limited memory. Note that this implementation does not
+ support `--enable-malloc-debugging' any more.
+
+config LIBC_PICOLIBC_EXTRA_CONFIG_ARRAY
+ string
+ prompt "Extra config for picolibc"
+ default ""
+ help
+ Extra flags to pass to meson when configuring picolibc.
diff --git a/scripts/build/companion_libs/340-picolibc.sh b/scripts/build/companion_libs/340-picolibc.sh
index 1b005e0b..7b29a820 100644
--- a/scripts/build/companion_libs/340-picolibc.sh
+++ b/scripts/build/companion_libs/340-picolibc.sh
@@ -11,71 +11,13 @@ do_picolibc_for_build() { :; }
do_picolibc_for_host() { :; }
do_picolibc_for_target() { :; }
-if [ "${CT_COMP_LIBS_PICOLIBC}" = "y" ]; then
-
-# Download picolibc
-do_picolibc_get() {
- CT_Fetch PICOLIBC
-}
-
-do_picolibc_extract() {
- CT_ExtractPatch PICOLIBC
-}
-
-#------------------------------------------------------------------------------
-# Build an additional target libstdc++ with "-Os" (optimise for speed) option
-# flag for libstdc++ "picolibc" variant.
-do_cc_libstdcxx_picolibc()
-{
- local -a final_opts
- local final_backend
+if [ "${CT_LIBC_PICOLIBC}" = "y" -o "${CT_COMP_LIBS_PICOLIBC}" = "y" ]; then
- if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX}" = "y" ]; then
- final_opts+=( "host=${CT_HOST}" )
- final_opts+=( "libstdcxx_name=picolibc" )
- final_opts+=( "prefix=${CT_PREFIX_DIR}" )
- final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
- final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
- final_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
- final_opts+=( "lang_list=c,c++" )
- final_opts+=( "build_step=libstdcxx" )
- final_opts+=( "extra_config+=('--enable-stdio=stdio_pure')" )
- final_opts+=( "extra_config+=('--disable-wchar_t')" )
- if [ "${CT_LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
- final_opts+=( "enable_optspace=yes" )
- fi
-
- if [ "${CT_BARE_METAL}" = "y" ]; then
- final_opts+=( "mode=baremetal" )
- final_opts+=( "build_libgcc=yes" )
- final_opts+=( "build_libstdcxx=yes" )
- final_opts+=( "build_libgfortran=yes" )
- if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
- final_opts+=( "build_staticlinked=yes" )
- fi
- final_backend=do_gcc_core_backend
- else
- final_backend=do_gcc_backend
- fi
-
- CT_DoStep INFO "Installing libstdc++ picolibc"
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc"
- "${final_backend}" "${final_opts[@]}"
- CT_Popd
-
- CT_EndStep
- fi
-}
-
-do_picolibc_for_target() {
+do_picolibc_common_install() {
local -a picolibc_opts
local cflags_for_target
- CT_DoStep INFO "Installing Picolibc library"
-
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-picolibc-build-${CT_BUILD}"
-
- CT_DoLog EXTRA "Configuring Picolibc library"
+ CT_DoLog EXTRA "Configuring C library"
# Multilib is the default, so if it is not enabled, disable it.
if [ "${CT_MULTILIB}" != "y" ]; then
@@ -106,9 +48,6 @@ RETARGETABLE_LOCKING:newlib-retargetable-locking
fi
done
- [ "${CT_USE_SYSROOT}" = "y" ] && \
- picolibc_opts+=( "-Dsysroot-install=true" )
-
[ "${CT_LIBC_PICOLIBC_EXTRA_SECTIONS}" = "y" ] && \
CT_LIBC_PICOLIBC_TARGET_CFLAGS="${CT_LIBC_PICOLIBC_TARGET_CFLAGS} -ffunction-sections -fdata-sections"
@@ -145,13 +84,24 @@ needs_exe_wrapper = true
skip_sanity_check = true
EOF
+ local picolibc_sysroot_dir
+ local picolibc_lib_dir
+ if [ "${CT_LIBC_PICOLIBC}" = 'y' ]; then
+ picolibc_sysroot_dir="${CT_SYSROOT_DIR}"
+ picolibc_lib_dir="${CT_SYSROOT_DIR}/lib"
+ picolibc_opts+=( '-Dsystem-libc=true' )
+ else
+ picolibc_sysroot_dir="${CT_PREFIX_DIR}/picolibc"
+ picolibc_lib_dir="${picolibc_sysroot_dir}/${CT_TARGET}/lib"
+ fi
+
CT_DoExecLog CFG \
meson \
--cross-file picolibc-cross.txt \
- --prefix="${CT_PREFIX_DIR}" \
- -Dincludedir=picolibc/include \
- -Dlibdir=picolibc/${CT_TARGET}/lib \
- -Dspecsdir="${CT_SYSROOT_DIR}"/lib \
+ --prefix="${picolibc_sysroot_dir}" \
+ -Dincludedir=include \
+ -Dlibdir="${picolibc_lib_dir}" \
+ -Dspecsdir="${CT_SYSROOT_DIR}/lib" \
"${CT_SRC_DIR}/picolibc" \
"${picolibc_opts[@]}" \
"${CT_LIBC_PICOLIBC_EXTRA_CONFIG_ARRAY[@]}"
@@ -161,11 +111,75 @@ EOF
CT_DoLog EXTRA "Installing C library"
CT_DoExecLog ALL ninja install
+}
+
+fi # CT_LIBC_PICOLIBC -o CT_COMP_LIBS_PICOLIBC
+
+if [ "${CT_COMP_LIBS_PICOLIBC}" = "y" ]; then
+
+do_cc_libstdcxx_picolibc() { :; }
+
+# Download picolibc
+do_picolibc_get() {
+ CT_Fetch PICOLIBC
+}
+
+do_picolibc_extract() {
+ CT_ExtractPatch PICOLIBC
+}
+
+if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX}" = "y" ]; then
+#------------------------------------------------------------------------------
+# Build an additional target libstdc++ with "-Os" (optimise for speed) option
+# flag for libstdc++ "picolibc" variant.
+do_cc_libstdcxx_picolibc()
+{
+ local -a final_opts
+ local final_backend
+ final_opts+=( "host=${CT_HOST}" )
+ final_opts+=( "libstdcxx_name=picolibc" )
+ final_opts+=( "prefix=${CT_PREFIX_DIR}" )
+ final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
+ final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
+ final_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
+ final_opts+=( "lang_list=c,c++" )
+ final_opts+=( "build_step=libstdcxx" )
+ final_opts+=( "extra_config+=('--enable-stdio=stdio_pure')" )
+ final_opts+=( "extra_config+=('--disable-wchar_t')" )
+ if [ "${CT_LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
+ final_opts+=( "enable_optspace=yes" )
+ fi
+
+ if [ "${CT_BARE_METAL}" = "y" ]; then
+ final_opts+=( "mode=baremetal" )
+ final_opts+=( "build_libgcc=yes" )
+ final_opts+=( "build_libstdcxx=yes" )
+ final_opts+=( "build_libgfortran=yes" )
+ if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
+ final_opts+=( "build_staticlinked=yes" )
+ fi
+ final_backend=do_gcc_core_backend
+ else
+ final_backend=do_gcc_backend
+ fi
+
+ CT_DoStep INFO "Installing libstdc++ picolibc"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc"
+ "${final_backend}" "${final_opts[@]}"
CT_Popd
+
CT_EndStep
+}
+fi # CT_LIBC_PICOLIBC_GCC_LIBSTDCXX
+do_picolibc_for_target() {
+ CT_DoStep INFO "Installing Picolibc library"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-picolibc-build-${CT_BUILD}"
+ do_picolibc_common_install
+ CT_Popd
+ CT_EndStep
do_cc_libstdcxx_picolibc
}
-fi
+fi # CT_COMP_LIBS_PICOLIBC
diff --git a/scripts/build/libc/picolibc.sh b/scripts/build/libc/picolibc.sh
new file mode 100644
index 00000000..7e71c29b
--- /dev/null
+++ b/scripts/build/libc/picolibc.sh
@@ -0,0 +1,29 @@
+# This file adds functions to use the Picolibc library as the system libc
+# Copyright © 2022 Joakim Nohlgård
+# Licensed under the GPL v2 or later. See COPYING in the root of this package
+
+picolibc_get()
+{
+ CT_Fetch PICOLIBC
+}
+
+picolibc_extract()
+{
+ CT_ExtractPatch PICOLIBC
+}
+
+picolibc_headers()
+{
+ CT_DoStep INFO "Installing C library headers"
+ CT_DoExecLog ALL cp -a "${CT_SRC_DIR}/picolibc/newlib/libc/include/." "${CT_HEADERS_DIR}"
+ CT_EndStep
+}
+
+picolibc_main()
+{
+ CT_DoStep INFO "Installing C library"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc"
+ do_picolibc_common_install
+ CT_Popd
+ CT_EndStep
+}