How to build libcxx/libcxxabi for riscv target

Hello,

I am tring to build libcxx and libcxxabi for riscv target, by following steps here Building libc++ — libc++ documentation , using the script below:

    BUILDDIR=${HOME}/rvllvm
    TARGET=riscv64-unknown-elf
    arch=rv32imac
    abi=ilp32
    llvm_bin=${BUILDDIR}/bin
    target=${TARGET}
    runtimes_flags="-march=${arch} -mabi=${abi} -mcmodel=medany -ffunction-sections -fdata-sections"
    instlibprefix=${INSTDIR}/${target}/lib/${arch}/${abi}
    instincprefix=${INSTDIR}/${target}/include
    mkdir -p buildruntime
    pushd buildruntime
    cmake -G Ninja \
        -DCMAKE_AR=${llvm_bin}/llvm-ar \
        -DCMAKE_ASM_COMPILER_TARGET=${target} \
        -DCMAKE_ASM_FLAGS="${runtimes_flags}" \
        -DCMAKE_BUILD_TYPE=MinSizeRel \
        -DCMAKE_CXX_COMPILER=${llvm_bin}/clang++ \
        -DCMAKE_CXX_COMPILER_TARGET=${target} \
        -DCMAKE_CXX_FLAGS="${runtimes_flags} -std=gnu++20" \
        -DCMAKE_C_COMPILER=${llvm_bin}/clang \
        -DCMAKE_C_COMPILER_TARGET=${target} \
        -DCMAKE_C_FLAGS="${runtimes_flags}" \
        -DCMAKE_INSTALL_PREFIX=${instlibprefix} \
        -DCMAKE_NM=${llvm_bin}/llvm-nm \
        -DCMAKE_RANLIB=${llvm_bin}/llvm-ranlib \
        -DCMAKE_C_COMPILER_TARGET=${TARGET}   \
        -DCMAKE_CXX_COMPILER_TARGET=${TARGET} \
        -DCMAKE_ASM_COMPILER_TARGET=${TARGTE} \
        -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \
        -DLLVM_ENABLE_RUNTIMES="libcxxabi;libcxx;libunwind" \
        -DLIBCXXABI_BAREMETAL=ON \
        -DLIBCXXABI_ENABLE_ASSERTIONS=OFF \
        -DLIBCXXABI_ENABLE_SHARED=OFF \
        -DLIBCXXABI_ENABLE_STATIC=ON \
        -DLIBCXXABI_LIBCXX_INCLUDES=${instincprefix}/c++/v1 \
        -DLIBCXXABI_USE_COMPILER_RT=ON \
        -DLIBCXXABI_USE_LLVM_UNWINDER=ON \
        -DLIBCXX_CXX_ABI=libcxxabi \
        -DLIBCXX_ENABLE_DEBUG_MODE_SUPPORT=OFF \
        -DLIBCXX_ENABLE_FILESYSTEM=OFF \
        -DLIBCXX_ENABLE_SHARED=OFF \
        -DLIBCXX_ENABLE_STATIC=ON \
        -DLIBCXX_INCLUDE_BENCHMARKS=OFF \
        -DLIBUNWIND_ENABLE_SHARED=OFF \
        -DLIBUNWIND_ENABLE_STATIC=ON \
        -DLIBUNWIND_IS_BAREMETAL=ON \
        -DLIBUNWIND_REMEMBER_HEAP_ALLOC=ON \
        -DLIBUNWIND_USE_COMPILER_RT=ON \
        -DLIBCXXABI_ENABLE_EXCEPTIONS=OFF \
        -DLIBCXXABI_ENABLE_THREADS=OFF \
        -DLIBCXX_ENABLE_EXCEPTIONS=OFF \
        -DLIBCXX_ENABLE_MONOTONIC_CLOCK=OFF \
        -DLIBCXX_ENABLE_RANDOM_DEVICE=OFF \
        -DLIBCXX_ENABLE_RTTI=OFF \
        -DLIBCXX_ENABLE_THREADS=OFF \
        -DLIBCXX_ENABLE_WIDE_CHARACTERS=ON \
        -DLIBUNWIND_ENABLE_THREADS=OFF \
        -DLLVM_CONFIG_PATH=${llvm_bin}/llvm-config \
        ../runtimes
    ninja

It build failed with following error:

llvm-project/llvmbuild/202302/buildruntime/include/c++/v1/math.h:972:92: error: no member named 'logl' in the global namespace
inline _LIBCPP_INLINE_VISIBILITY long double log(long double __lcpp_x) _NOEXCEPT {return ::logl(__lcpp_x);}
                                                                                         ~~^
llvm-project/llvmbuild/202302/buildruntime/include/c++/v1/math.h:984:94: error: no member named 'log10l' in the global namespace
inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __lcpp_x) _NOEXCEPT {return ::log10l(__lcpp_x);}
                                                                                           ~~^
llvm-project/llvmbuild/202302/buildruntime/include/c++/v1/math.h:996:116: error: no member named 'modfl' in the global namespace
inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __lcpp_x, long double* __lcpp_y) _NOEXCEPT {return ::modfl(__lcpp_x, __lcpp_y);}
                                                                                                                 ~~^
llvm-project/llvmbuild/202302/buildruntime/include/c++/v1/math.h:1003:114: error: no member named 'powl' in the global namespace
inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __lcpp_x, long double __lcpp_y) _NOEXCEPT {return ::powl(__lcpp_x, __lcpp_y);}
                                                                                                               ~~^
llvm-project/llvmbuild/202302/buildruntime/include/c++/v1/math.h:1026:92: error: no member named 'sinl' in the global namespace
inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __lcpp_x) _NOEXCEPT {return ::sinl(__lcpp_x);}
                                                                                         ~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
[855/860] Building CXX object libcxx/src/CMakeFiles/cxx_static.dir/locale.cpp.o

Did anyone met the same issue? could you give some guidance.

Thanks

I’ve no experience with riscv. Looking at the errors it seems you libc doesn’t have an implementation of powl. libc++ depends on libc to provide these functions.

Does powl work in C applications?

Ok, I got it. So it rely on libc, or I can use newlibc to build it. Thanks