From 27b18d2fc70a7788c97f57a02a768214a2548ee0 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 11 Jan 2021 22:28:38 -0800 Subject: picolibc: Build libstdc++ against picolibc if requested This uses the gcc support for building libstdc++ using alternate lib header files. Signed-off-by: Keith Packard diff --git a/config/comp_libs/picolibc.in b/config/comp_libs/picolibc.in index 62ab22b..cb7a1e4 100644 --- a/config/comp_libs/picolibc.in +++ b/config/comp_libs/picolibc.in @@ -10,6 +10,16 @@ ## help conglomeration of several library parts, all under BSD-compatible software ## help licenses that make them easily usable on embedded products. +config LIBC_PICOLIBC_GCC_LIBSTDCXX + bool + prompt "Compile 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. + config LIBC_PICOLIBC_CXA_ATEXIT def_bool y select LIBC_PROVIDES_CXA_ATEXIT diff --git a/samples/arm-picolibc-eabi/crosstool.config b/samples/arm-picolibc-eabi/crosstool.config index 48a4543..1da1616 100644 --- a/samples/arm-picolibc-eabi/crosstool.config +++ b/samples/arm-picolibc-eabi/crosstool.config @@ -8,3 +8,4 @@ CT_CC_GCC_CONFIG_TLS=y CT_TARGET_CFLAGS="-ftls-model=local-exec" CT_CC_GCC_MULTILIB_LIST="rmprofile" CT_COMP_LIBS_PICOLIBC=y +CT_CC_LANG_CXX=y diff --git a/scripts/build/companion_libs/340-picolibc.sh b/scripts/build/companion_libs/340-picolibc.sh index c0128c1..525497a 100644 --- a/scripts/build/companion_libs/340-picolibc.sh +++ b/scripts/build/companion_libs/340-picolibc.sh @@ -22,6 +22,50 @@ 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_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')" ) + 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() { local -a picolibc_opts local cflags_for_target @@ -119,6 +163,8 @@ EOF CT_Popd CT_EndStep + + do_cc_libstdcxx_picolibc } fi -- cgit v0.10.2-6-g49f6