Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions config/comp_libs/picolibc.in
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ config LIBC_PICOLIBC_GCC_LIBSTDCXX
picolibc. This version is linked when "--specs=picolibcpp.specs"
is specified.

config LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT
bool
prompt "Compile libstdc++ picolibc variant with exceptions disabled"
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_noexcept.specs"
is specified.

config LIBC_PICOLIBC_CXA_ATEXIT
def_bool y
select LIBC_PROVIDES_CXA_ATEXIT
Expand Down
1 change: 1 addition & 0 deletions samples/arm-picolibc-eabi/crosstool.config
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ CT_CC_GCC_MULTILIB_LIST="rmprofile"
CT_CC_GCC_CONFIG_TLS=y
CT_CC_LANG_CXX=y
CT_COMP_LIBS_PICOLIBC=y
CT_LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT=y
27 changes: 26 additions & 1 deletion scripts/build/companion_libs/340-picolibc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ do_picolibc_extract() {
# flag for libstdc++ "picolibc" variant.
do_cc_libstdcxx_picolibc()
{
local variant="$1"
local -a final_opts
local final_backend
local suffix=

if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX}" = "y" ]; then
final_opts+=( "host=${CT_HOST}" )
Expand All @@ -46,6 +48,10 @@ do_cc_libstdcxx_picolibc()
if [ "${CT_LIBC_PICOLIBC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
final_opts+=( "enable_optspace=yes" )
fi
if [ "${variant}" = "noexcept" ]; then
final_opts+=( "extra_cxxflags_for_target=-fno-exceptions" )
suffix="-noexcept"
fi

if [ "${CT_BARE_METAL}" = "y" ]; then
final_opts+=( "mode=baremetal" )
Expand All @@ -61,7 +67,7 @@ do_cc_libstdcxx_picolibc()
fi

CT_DoStep INFO "Installing libstdc++ picolibc"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc"
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-libstdcxx-picolibc${suffix}"
"${final_backend}" "${final_opts[@]}"
CT_Popd

Expand Down Expand Up @@ -168,6 +174,12 @@ EOF
CT_Popd
CT_EndStep

if [ "${CT_LIBC_PICOLIBC_GCC_LIBSTDCXX_NOEXCEPT}" = "y" ]; then
do_cc_libstdcxx_picolibc noexcept
picolibc_add_suffix_to_lib "${CT_PREFIX_DIR}/picolibc/${CT_TARGET}/lib" "libstdc++.a" "noexcept"
picolibc_add_suffix_to_lib "${CT_PREFIX_DIR}/picolibc/${CT_TARGET}/lib" "libsupc++.a" "noexcept"
fi

do_cc_libstdcxx_picolibc

if [ "${CT_STRIP_TARGET_TOOLCHAIN_LIBRARIES}" = "y" ]; then
Expand All @@ -185,4 +197,17 @@ EOF
fi
}

picolibc_add_suffix_to_lib() {
local lib_dir="${1}"
local lib_name="${2}"
local suffix="${3}"
local filename extension

find "${lib_dir}" -name "${lib_name}" | while read target_lib; do
filename=${target_lib%.*}
extension=${target_lib##*.}
CT_DoExecLog ALL mv "${target_lib}" "${filename}_${suffix}.${extension}"
done
}

fi