diff --git a/.docker/Dockerfile.alpine-xx b/.docker/Dockerfile.alpine-xx new file mode 100644 index 00000000..5b1824ea --- /dev/null +++ b/.docker/Dockerfile.alpine-xx @@ -0,0 +1,121 @@ +# syntax=docker/dockerfile:1 +ARG ARCH=amd64 +FROM --platform=$BUILDPLATFORM tonistiigi/xx AS xx +FROM --platform=$BUILDPLATFORM alpine:latest +RUN apk update +RUN apk upgrade +RUN apk add --no-cache \ + bash-completion \ + build-base \ + wget \ + curl \ + vim \ + tar \ + ripgrep \ + py3-pip \ + less \ + gcc \ + g++ \ + clang19 \ + git \ + ccache \ + samurai \ + cmake \ + make \ + bison \ + flex \ + ronn \ + fuse \ + fuse-dev \ + fuse-static \ + fuse3 \ + fuse3-dev \ + fuse3-static \ + pkgconf \ + binutils-dev \ + libevent-dev \ + libevent-static \ + linux-headers \ + date-dev \ + range-v3-dev \ + zlib-static \ + libucontext-dev \ + libdwarf-dev \ + elfutils-dev \ + utfcpp \ + nlohmann-json \ + meson \ + autoconf \ + strace \ + gdb + +COPY --from=xx / / +ARG TARGETPLATFORM +RUN xx-apk add --no-cache musl-dev binutils gcc g++ + +# Install UPX +ARG ARCH +# UPX isn't supported on RISC-V yet, so skip this +RUN if [ "$ARCH" != "riscv64" ]; then \ + wget -O - https://github.com/upx/upx/releases/download/v5.0.0/upx-5.0.0-$(bash -c "echo \${0//v8/}" $ARCH)_linux.tar.xz | tar -xJf - -C /usr/local/bin --strip-components=1 --wildcards "*/upx"; \ + else \ + echo "Skipping UPX installation for RISC-V architecture while it is not supported."; \ + echo "See https://github.com/upx/upx/discussions/793 for details."; \ + fi + +# Install mistletoe +RUN pip3 install --break-system-packages --root-user-action ignore mistletoe + +# Install size-optimized and static-link-optimized libstdc++ +RUN apk add --no-cache gmp-dev mpfr-dev mpc1-dev isl-dev texinfo rsync +#COPY install-libstdcxx.sh /usr/local/bin/install-libstdcxx.sh +#RUN bash /usr/local/bin/install-libstdcxx.sh +COPY install-toolchain.sh /usr/local/bin/install-toolchain.sh +RUN bash /usr/local/bin/install-toolchain.sh prepare +RUN bash /usr/local/bin/install-toolchain.sh build-stage1 s +RUN bash /usr/local/bin/install-toolchain.sh build-final s +RUN bash /usr/local/bin/install-toolchain.sh cleanup + +# Install mold +COPY install-mold.sh /usr/local/bin/install-mold.sh +RUN bash /usr/local/bin/install-mold.sh + +RUN apk add qemu-riscv64 +COPY meson-x86_64-riscv64.txt /usr/local/share/meson-x86_64-riscv64.txt + +# Install all static libraries +COPY install-static-libs.sh /usr/local/bin/install-static-libs.sh +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:libucontext +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:libunwind +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:boost +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:jemalloc +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:mimalloc +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:double-conversion +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:fmt +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:fuse +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:glog +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:benchmark +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:xxhash +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:bzip2 +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:brotli +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:lz4 +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:xz +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:zstd +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:libressl +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:libarchive +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:flac +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:libdwarf +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:cpptrace + +### # RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine + +# Install the *real* ninja... +# TODO: move this up if we change anything +RUN apk add --no-cache ninja-build +RUN apk del fuse fuse-dev fuse-static binutils-dev + +# Set up git & user +RUN git config --global --add safe.directory /workspace +RUN adduser -G users -s bash -u 1000 -D mhx +USER mhx +ENTRYPOINT /workspace/.docker/build-linux.sh diff --git a/.docker/Makefile b/.docker/Makefile index 8caae801..9cb0dad4 100644 --- a/.docker/Makefile +++ b/.docker/Makefile @@ -2,6 +2,7 @@ IMAGE_UBUNTU="dwarfs-buildenv" IMAGE_DEBIAN="dwarfs-buildenv-debian" IMAGE_ALPINE="dwarfs-buildenv-alpine" IMAGE_ALPINE_RISCV="dwarfs-buildenv-alpine-riscv64" +IMAGE_ALPINE_XX_RISCV="dwarfs-buildenv-alpine-xx-riscv64" IMAGE_UBUNTU2204="dwarfs-buildenv-ubuntu2204" IMAGE_FEDORA="dwarfs-buildenv-fedora" IMAGE_ARCH="dwarfs-buildenv-arch" @@ -39,6 +40,12 @@ build_alpine: run_alpine: @docker run $(COMMON_RUN_OPTS) $(IMAGE_ALPINE) +build_alpine_xx_riscv: + docker buildx build -f Dockerfile.alpine-xx --platform linux/riscv64 -t $(IMAGE_ALPINE_XX_RISCV) . + +run_alpine_xx_riscv: + @docker run --platform linux/riscv64 --env TARGETPLATFORM=linux/riscv64 $(COMMON_RUN_OPTS) $(IMAGE_ALPINE_XX_RISCV) + build_alpine_riscv: docker build -f Dockerfile.alpine -t $(IMAGE_ALPINE_RISCV) --build-arg ARCH=riscv64 . diff --git a/.docker/install-libstdcxx.sh b/.docker/install-libstdcxx.sh index 66a87a52..8120defb 100644 --- a/.docker/install-libstdcxx.sh +++ b/.docker/install-libstdcxx.sh @@ -2,6 +2,14 @@ set -ex +if [ -n "$TARGETPLATFORM" ]; then + # export CC="xx-cc" + # export CXX="xx-c++" + export TRIPLETS="--host=$(TARGETPLATFORM= xx-info triple) --build=$(TARGETPLATFORM= xx-info triple) --target=$(xx-info triple)" +else + export TRIPLETS="" +fi + cd "$HOME" mkdir pkgs cd pkgs @@ -74,7 +82,7 @@ for opt in s; do ;; esac - "$HOME"/pkgs/gcc-${GCC_VERSION}/configure --prefix=${INSTALLDIR} --libdir=${INSTALLDIR}/lib \ + "$HOME"/pkgs/gcc-${GCC_VERSION}/configure ${TRIPLETS} --prefix=${INSTALLDIR} --libdir=${INSTALLDIR}/lib \ --disable-shared --enable-tls --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers \ --enable-threads --enable-__cxa_atexit --enable-languages=c,c++ --enable-link-serialization=2 --enable-linker-build-id \ --disable-libssp --disable-libsanitizer --with-system-zlib --enable-checking=release --disable-cet --disable-fixed-point \ diff --git a/.docker/install-mold.sh b/.docker/install-mold.sh index 533f2178..58a7eea8 100644 --- a/.docker/install-mold.sh +++ b/.docker/install-mold.sh @@ -2,6 +2,11 @@ set -ex +# if [ -n "$TARGETPLATFORM" ]; then +# export CC="xx-cc" +# export CXX="xx-c++" +# fi + cd "$HOME" mkdir pkgs cd pkgs diff --git a/.docker/install-static-libs.sh b/.docker/install-static-libs.sh index c0e00cb8..d5cd6d36 100644 --- a/.docker/install-static-libs.sh +++ b/.docker/install-static-libs.sh @@ -18,6 +18,7 @@ BZIP2_VERSION=1.0.8 LIBARCHIVE_VERSION=3.8.1 # 2025-06-01 FLAC_VERSION=1.5.0 # 2025-02-11 +LIBUCONTEXT_VERSION=1.3.2 # 2024-10-07 LIBUNWIND_VERSION=1.8.2 # 2025-05-22 BENCHMARK_VERSION=1.9.4 # 2025-05-19 BOOST_VERSION=1.88.0 # 2025-04-11 @@ -35,6 +36,7 @@ LIBFUSE_VERSION=3.17.2 # 2025-04-23 MIMALLOC_VERSION=2.1.7 # 2024-05-21 JEMALLOC_VERSION=5.3.0 # 2022-05-02 XZ_VERSION=5.8.1 # 2025-04-03 +LIBDWARF_VERSION=2.1.0 # 2025-07-19 echo "Using $GCC and $CLANG" @@ -43,7 +45,7 @@ if [[ "$PKGS" == ":ubuntu" ]]; then COMPILERS="clang gcc" elif [[ "$PKGS" == ":alpine"* ]]; then if [[ "$PKGS" == ":alpine" ]]; then - PKGS="benchmark,boost,brotli,cpptrace,double-conversion,flac,fmt,fuse,glog,jemalloc,libarchive,libunwind,libressl,lz4,mimalloc,openssl,xxhash,xz,zstd" + PKGS="benchmark,boost,brotli,cpptrace,double-conversion,flac,fmt,fuse,glog,jemalloc,libarchive,libucontext,libunwind,libressl,lz4,mimalloc,openssl,xxhash,xz,zstd" else PKGS="${PKGS#:alpine:}" fi @@ -51,12 +53,13 @@ elif [[ "$PKGS" == ":alpine"* ]]; then export COMMON_CXXFLAGS="$COMMON_CFLAGS" export COMMON_LDFLAGS="-fuse-ld=mold" # COMPILERS="clang clang-lto clang-minsize-lto gcc" - if [[ "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]]; then - # Let's keep it simple for more exotic architectures - COMPILERS="clang-minsize-lto" - else - COMPILERS="clang clang-minsize-lto gcc" - fi + COMPILERS="clang-minsize-lto" + # if [[ "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]]; then + # # Let's keep it simple for more exotic architectures + # COMPILERS="clang-minsize-lto" + # else + # COMPILERS="clang clang-minsize-lto gcc" + # fi elif [[ "$PKGS" == ":none" ]]; then echo "No libraries to build" exit 0 @@ -67,6 +70,7 @@ BZIP2_TARBALL="bzip2-${BZIP2_VERSION}.tar.gz" BOOST_TARBALL="boost-${BOOST_VERSION}.tar.xz" LIBARCHIVE_TARBALL="libarchive-${LIBARCHIVE_VERSION}.tar.xz" FLAC_TARBALL="flac-${FLAC_VERSION}.tar.xz" +LIBUCONTEXT_TARBALL="libucontext-${LIBUCONTEXT_VERSION}.tar.gz" LIBUNWIND_TARBALL="libunwind-${LIBUNWIND_VERSION}.tar.gz" BENCHMARK_TARBALL="benchmark-${BENCHMARK_VERSION}.tar.gz" OPENSSL_TARBALL="openssl-${OPENSSL_VERSION}.tar.gz" @@ -83,6 +87,7 @@ LIBFUSE_TARBALL="fuse-${LIBFUSE_VERSION}.tar.gz" MIMALLOC_TARBALL="mimalloc-${MIMALLOC_VERSION}.tar.gz" JEMALLOC_TARBALL="jemalloc-${JEMALLOC_VERSION}.tar.bz2" XZ_TARBALL="xz-${XZ_VERSION}.tar.xz" +LIBDWARF_TARBALL="libdwarf-${LIBDWARF_VERSION}.tar.xz" use_lib() { local lib="$1" @@ -122,6 +127,7 @@ fetch_lib bzip2 https://sourceware.org/pub/bzip2/${BZIP2_TARBALL} fetch_lib boost https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION}-cmake.tar.xz ${BOOST_TARBALL} fetch_lib libarchive https://github.com/libarchive/libarchive/releases/download/v${LIBARCHIVE_VERSION}/${LIBARCHIVE_TARBALL} fetch_lib flac https://github.com/xiph/flac/releases/download/${FLAC_VERSION}/${FLAC_TARBALL} +fetch_lib libucontext https://github.com/kaniini/libucontext/archive/refs/tags/${LIBUCONTEXT_TARBALL} fetch_lib libunwind https://github.com/libunwind/libunwind/releases/download/v${LIBUNWIND_VERSION}/${LIBUNWIND_TARBALL} fetch_lib benchmark https://github.com/google/benchmark/archive/refs/tags/v${BENCHMARK_VERSION}.tar.gz ${BENCHMARK_TARBALL} fetch_lib openssl https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/${OPENSSL_TARBALL} @@ -138,6 +144,7 @@ fetch_lib fuse https://github.com/libfuse/libfuse/releases/download/fuse-${LIBFU fetch_lib mimalloc https://github.com/microsoft/mimalloc/archive/refs/tags/v${MIMALLOC_VERSION}.tar.gz ${MIMALLOC_TARBALL} fetch_lib jemalloc https://github.com/jemalloc/jemalloc/releases/download/${JEMALLOC_VERSION}/${JEMALLOC_TARBALL} fetch_lib xz https://github.com/tukaani-project/xz/releases/download/v${XZ_VERSION}/${XZ_TARBALL} +fetch_lib libdwarf https://github.com/davea42/libdwarf-code/releases/download/v${LIBDWARF_VERSION}/${LIBDWARF_TARBALL} set_build_flags() { if [[ $CFLAGS =~ ^[[:space:]]*$ ]]; then @@ -167,7 +174,11 @@ opt_size() { export CFLAGS="$SIZE_CFLAGS" export CXXFLAGS="$SIZE_CXXFLAGS" # export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=MinSizeRel" - export CMAKE_ARGS= + if [ -n "$TARGETPLATFORM" ]; then + export CMAKE_ARGS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$(xx-info arch)" + else + export CMAKE_ARGS= + fi set_build_flags } @@ -175,25 +186,66 @@ opt_perf() { export CFLAGS="$PERF_CFLAGS" export CXXFLAGS="$PERF_CXXFLAGS" # export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release" - export CMAKE_ARGS= + if [ -n "$TARGETPLATFORM" ]; then + export CMAKE_ARGS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$(xx-info arch)" + else + export CMAKE_ARGS= + fi set_build_flags } +if [ -n "$TARGETPLATFORM" ]; then + export TARGET="$(xx-info triple)" + export TRIPLETS="--host=$(xx-info triple) --target=$(xx-info triple) --build=$(TARGETPLATFORM= xx-info triple)" + export TRIPLETS2="--host=$(TARGETPLATFORM= xx-info triple) --target=$(xx-info triple) --build=$(TARGETPLATFORM= xx-info triple)" + export BOOST_CMAKE_ARGS="-DBOOST_CONTEXT_ARCHITECTURE=$(xx-info arch)" + export OPENSSL_TARGET_ARGS="linux-$(xx-info arch)" + export LIBUCONTEXT_MAKE_ARGS="ARCH=$(xx-info arch)" +else + export TARGET="" + export TRIPLETS="" + export TRIPLETS2="" + export BOOST_CMAKE_ARGS="" + export OPENSSL_TARGET_ARGS="" + export LIBUCONTEXT_MAKE_ARGS="" +fi + +# TODO +export PATH="/opt/static-libs/libstdc++-Os/$TARGET/usr/bin:$PATH" +export COMMON_CFLAGS="$COMMON_CFLAGS -isystem /opt/static-libs/libstdc++-Os/$TARGET/usr/include" +export COMMON_CXXFLAGS="$COMMON_CXXFLAGS -isystem /opt/static-libs/libstdc++-Os/$TARGET/usr/include" + for COMPILER in $COMPILERS; do - export SIZE_CFLAGS="$COMMON_CFLAGS" - export SIZE_CXXFLAGS="$COMMON_CXXFLAGS" - export PERF_CFLAGS="$COMMON_CFLAGS" - export PERF_CXXFLAGS="$COMMON_CXXFLAGS" - export COMP_LDFLAGS="$COMMON_LDFLAGS" + INSTALL_DIR=/opt/static-libs/$COMPILER + if [ -n "$TARGETPLATFORM" ]; then + INSTALL_DIR="$INSTALL_DIR/$TARGET" + fi + INSTALL_DIR="$INSTALL_DIR/usr" + + export SIZE_CFLAGS="$COMMON_CFLAGS -isystem $INSTALL_DIR/include" + export SIZE_CXXFLAGS="$COMMON_CXXFLAGS -isystem $INSTALL_DIR/include" + export PERF_CFLAGS="$COMMON_CFLAGS -isystem $INSTALL_DIR/include" + export PERF_CXXFLAGS="$COMMON_CXXFLAGS -isystem $INSTALL_DIR/include" + export COMP_LDFLAGS="$COMMON_LDFLAGS -L$INSTALL_DIR/lib" case "$COMPILER" in clang*) - export CC="$CLANG" - export CXX="${CLANG/clang/clang++}" + if [ -n "$TARGETPLATFORM" ]; then + export CC="xx-clang" + export CXX="xx-clang++" + else + export CC="$CLANG" + export CXX="${CLANG/clang/clang++}" + fi ;; gcc*) - export CC="$GCC" - export CXX="${GCC/gcc/g++}" + if [ -n "$TARGETPLATFORM" ]; then + export CC="$TARGET-gcc" + export CXX="$TARGET-g++" + else + export CC="$GCC" + export CXX="${GCC/gcc/g++}" + fi ;; *) echo "Unknown compiler: $COMPILER" @@ -221,7 +273,15 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs" mkdir $COMPILER - INSTALL_DIR=/opt/static-libs/$COMPILER + if use_lib libucontext; then + opt_size + cd "$HOME/pkgs/$COMPILER" + mkdir libucontext-${LIBUCONTEXT_VERSION} + tar xf ../${LIBUCONTEXT_TARBALL} --strip-components=1 -C libucontext-${LIBUCONTEXT_VERSION} + cd libucontext-${LIBUCONTEXT_VERSION} + make -j$(nproc) ${LIBUCONTEXT_MAKE_ARGS} + make install ${LIBUCONTEXT_MAKE_ARGS} DESTDIR="$INSTALL_DIR" prefix="" + fi if use_lib libunwind; then opt_size @@ -229,7 +289,7 @@ for COMPILER in $COMPILERS; do tar xf ../${LIBUNWIND_TARBALL} cd libunwind-${LIBUNWIND_VERSION} LDFLAGS="$LDFLAGS -lucontext" CFLAGS="$CFLAGS -fno-stack-protector" ./configure \ - --prefix="$INSTALL_DIR" --enable-cxx-exceptions --disable-tests + ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-cxx-exceptions --disable-tests make -j$(nproc) make install fi @@ -244,7 +304,7 @@ for COMPILER in $COMPILERS; do cmake .. -DBOOST_ENABLE_MPI=OFF -DBOOST_ENABLE_PYTHON=OFF -DBUILD_SHARED_LIBS=OFF \ -DBOOST_IOSTREAMS_ENABLE_ZLIB=OFF -DBOOST_IOSTREAMS_ENABLE_BZIP2=OFF \ -DBOOST_IOSTREAMS_ENABLE_LZMA=OFF -DBOOST_IOSTREAMS_ENABLE_ZSTD=OFF \ - -DBOOST_EXCLUDE_LIBRARIES=stacktrace \ + -DBOOST_EXCLUDE_LIBRARIES=stacktrace ${BOOST_CMAKE_ARGS} \ -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} make -j$(nproc) make install @@ -257,16 +317,17 @@ for COMPILER in $COMPILERS; do cd jemalloc-${JEMALLOC_VERSION} curl https://gitlab.alpinelinux.org/alpine/aports/-/raw/abc0b4170e42e2a7d835e4490ecbae49e6f3d137/main/jemalloc/musl-exception-specification-errors.patch | patch -p1 curl https://gitlab.alpinelinux.org/alpine/aports/-/raw/abc0b4170e42e2a7d835e4490ecbae49e6f3d137/main/jemalloc/pkgconf.patch | patch -p1 - ./autogen.sh - mkdir build-minimal - cd build-minimal - ../configure --prefix="$INSTALL_DIR-jemalloc-minimal" --localstatedir=/var --sysconfdir=/etc --with-lg-hugepage=21 --disable-stats --disable-prof --enable-static --disable-shared --disable-log --disable-debug - make -j$(nproc) - make install - cd .. - mkdir build-full - cd build-full - ../configure --prefix="$INSTALL_DIR-jemalloc-full" --localstatedir=/var --sysconfdir=/etc --with-lg-hugepage=21 --enable-stats --enable-prof --enable-static --disable-shared --disable-log --disable-debug + ./autogen.sh ${TRIPLETS} + # mkdir build-minimal + # cd build-minimal + # ../configure ${TRIPLETS} --prefix="$INSTALL_DIR-jemalloc-minimal" --localstatedir=/var --sysconfdir=/etc --with-lg-hugepage=21 --disable-stats --disable-prof --enable-static --disable-shared --disable-log --disable-debug + # make -j$(nproc) + # make install + # cd .. + # mkdir build-full + mkdir build + cd build + ../configure ${TRIPLETS} --prefix="$INSTALL_DIR" --localstatedir=/var --sysconfdir=/etc --with-lg-hugepage=21 --enable-stats --enable-prof --enable-static --disable-shared --disable-log --disable-debug make -j$(nproc) make install fi @@ -314,7 +375,8 @@ for COMPILER in $COMPILERS; do cd fuse-${LIBFUSE_VERSION} mkdir build cd build - meson setup .. --default-library=static --prefix="$INSTALL_DIR" + meson setup .. --default-library=static --prefix="$INSTALL_DIR" --cross-file=/usr/local/share/meson-x86_64-riscv64.txt + # meson configure ${TRIPLETS} -D utils=false -D tests=false -D examples=false meson configure -D utils=false -D tests=false -D examples=false meson setup --reconfigure .. ninja @@ -392,7 +454,7 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs/$COMPILER" tar xf ../${XZ_TARBALL} cd xz-${XZ_VERSION} - ./configure --prefix="$INSTALL_DIR" --localstatedir=/var --sysconfdir=/etc --disable-rpath --disable-werror --disable-doc --disable-shared --disable-nls + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --localstatedir=/var --sysconfdir=/etc --disable-rpath --disable-werror --disable-doc --disable-shared --disable-nls make -j$(nproc) make install fi @@ -404,7 +466,7 @@ for COMPILER in $COMPILERS; do cd zstd-${ZSTD_VERSION} mkdir meson-build cd meson-build - meson setup ../build/meson --default-library=static --prefix="$INSTALL_DIR" + meson setup ../build/meson --default-library=static --prefix="$INSTALL_DIR" --cross-file=/usr/local/share/meson-x86_64-riscv64.txt meson configure -D zlib=disabled -D lzma=disabled -D lz4=disabled meson setup --reconfigure ../build/meson ninja @@ -416,7 +478,8 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs/$COMPILER" tar xf ../${OPENSSL_TARBALL} cd openssl-${OPENSSL_VERSION} - ./Configure --prefix="$INSTALL_DIR-openssl" --libdir=lib threads no-fips no-shared no-pic no-dso no-aria no-async no-atexit \ + ./Configure ${OPENSSL_TARGET_ARGS} --prefix="$INSTALL_DIR-openssl" --libdir=lib \ + threads no-fips no-shared no-pic no-dso no-aria no-async no-atexit \ no-autoload-config no-blake2 no-bf no-camellia no-cast no-chacha no-cmac no-cms no-cmp no-comp no-ct no-des \ no-dgram no-dh no-dsa no-ec no-engine no-filenames no-idea no-ktls no-md4 no-multiblock \ no-nextprotoneg no-ocsp no-ocb no-poly1305 no-psk no-rc2 no-rc4 no-seed no-siphash no-siv no-sm3 no-sm4 \ @@ -432,19 +495,20 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs/$COMPILER" tar xf ../${LIBRESSL_TARBALL} cd libressl-${LIBRESSL_VERSION} - ./configure --prefix="$INSTALL_DIR-libressl" --enable-static --disable-shared --disable-tests + # ./configure ${TRIPLETS} --prefix="$INSTALL_DIR-libressl" --enable-static --disable-shared --disable-tests + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-static --disable-shared --disable-tests make -j$(nproc) make install fi if use_lib libarchive; then unset LIBARCHIVE_PREFIXES - if use_lib openssl; then - LIBARCHIVE_PREFIXES="$LIBARCHIVE_PREFIXES $INSTALL_DIR-openssl" - fi - if use_lib libressl; then - LIBARCHIVE_PREFIXES="$LIBARCHIVE_PREFIXES $INSTALL_DIR-libressl" - fi + # if use_lib openssl; then + # LIBARCHIVE_PREFIXES="$LIBARCHIVE_PREFIXES $INSTALL_DIR-openssl" + # fi + # if use_lib libressl; then + # LIBARCHIVE_PREFIXES="$LIBARCHIVE_PREFIXES $INSTALL_DIR-libressl" + # fi if [[ -z "$LIBARCHIVE_PREFIXES" ]]; then LIBARCHIVE_PREFIXES="$INSTALL_DIR" fi @@ -456,10 +520,10 @@ for COMPILER in $COMPILERS; do tar xf ../${LIBARCHIVE_TARBALL} cd libarchive-${LIBARCHIVE_VERSION} # TODO: once DwarFS supports ACLs / xattrs, we need to update this - export CFLAGS="-I$prefix/include $CFLAGS" - export CPPFLAGS="-I$prefix/include $CPPFLAGS" - export LDFLAGS="-L$prefix/lib $LDFLAGS" - ./configure --prefix="$prefix" \ + # export CFLAGS="-I$prefix/include $CFLAGS" + # export CPPFLAGS="-I$prefix/include $CPPFLAGS" + # export LDFLAGS="-L$prefix/lib $LDFLAGS" + ./configure ${TRIPLETS} --prefix="$prefix" \ --without-iconv --without-xml2 --without-expat \ --without-bz2lib --without-zlib \ --disable-shared --disable-acl --disable-xattr \ @@ -475,7 +539,7 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs/$COMPILER" tar xf ../${FILE_TARBALL} cd file-${FILE_VERSION} - ./configure --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no make -j$(nproc) make install fi @@ -485,12 +549,26 @@ for COMPILER in $COMPILERS; do cd "$HOME/pkgs/$COMPILER" tar xf ../${FLAC_TARBALL} cd flac-${FLAC_VERSION} - ./configure --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no \ + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no \ --disable-doxygen-docs --disable-ogg --disable-programs --disable-examples make -j$(nproc) make install fi + if use_lib libdwarf; then + opt_size + cd "$HOME/pkgs/$COMPILER" + tar xf ../${LIBDWARF_TARBALL} + cd libdwarf-${LIBDWARF_VERSION} + mkdir meson-build + cd meson-build + meson setup .. --default-library=static --prefix="$INSTALL_DIR" --cross-file=/usr/local/share/meson-x86_64-riscv64.txt + # meson configure + # meson setup --reconfigure .. + ninja + ninja install + fi + if use_lib cpptrace; then opt_size cd "$HOME/pkgs/$COMPILER" @@ -498,7 +576,7 @@ for COMPILER in $COMPILERS; do cd cpptrace-${CPPTRACE_VERSION} mkdir build cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DCPPTRACE_USE_EXTERNAL_LIBDWARF=ON -DCPPTRACE_FIND_LIBDWARF_WITH_PKGCONFIG=ON ${CMAKE_ARGS} make -j$(nproc) make install fi diff --git a/.docker/install-toolchain.sh b/.docker/install-toolchain.sh new file mode 100644 index 00000000..397f1035 --- /dev/null +++ b/.docker/install-toolchain.sh @@ -0,0 +1,172 @@ +#!/bin/bash + +set -ex + +TASK="$1" +OPT="${2:-s}" + +if [ -z "$TARGETPLATFORM" ]; then + exit 0 +fi + +BINUTILS_VERSION=2.44 +GCC_VERSION=14.2.0 +MUSL_VERSION=1.2.5 +LINUX_VERSION=6.15.7 + +BINUTILS_TARBALL=binutils-${BINUTILS_VERSION}.tar.xz +GCC_TARBALL=gcc-${GCC_VERSION}.tar.xz +MUSL_TARBALL=musl-${MUSL_VERSION}.tar.gz +LINUX_TARBALL=linux-${LINUX_VERSION}.tar.xz + +ARCH="$(uname -m)" + +ORIGPATH="$PATH" +TARGET="$(xx-info triple)" + +CARCH="$(xx-info arch)" +case "$CARCH" in + aarch64*) CARCH="arm64" ;; + arm*) CARCH="arm" ;; + mips*) CARCH="mips" ;; + s390*) CARCH="s390" ;; + ppc*) CARCH="powerpc" ;; + riscv*) CARCH="riscv" ;; + loongarch*) CARCH="loongarch" ;; +esac + +CFLAGS="-O${OPT} -ffunction-sections -fdata-sections -fmerge-all-constants -fPIC" +CXXFLAGS="-O${OPT} -ffunction-sections -fdata-sections -fmerge-all-constants -fPIC" +LDFLAGS="-Wl,--gc-sections" + +SYSROOT="/opt/static-libs/libstdc++-O${OPT}/${TARGET}" +PREFIX="$SYSROOT/usr" +PATH="$PREFIX/bin:$ORIGPATH" + +case "$TASK" in + prepare) + cd "$HOME" + mkdir pkgs + cd pkgs + + wget https://mirror.netcologne.de/gnu/binutils/${BINUTILS_TARBALL} + wget https://ftp.gwdg.de/pub/misc/gcc/releases/gcc-${GCC_VERSION}/${GCC_TARBALL} + wget https://www.musl-libc.org/releases/${MUSL_TARBALL} + wget https://cdn.kernel.org/pub/linux/kernel/v6.x/${LINUX_TARBALL} + + tar xf ${BINUTILS_TARBALL} + tar xf ${GCC_TARBALL} + tar xf ${LINUX_TARBALL} + + cd gcc-${GCC_VERSION} + + for p in 0001-posix_memalign.patch \ + 0002-gcc-poison-system-directories.patch \ + 0003-specs-turn-on-Wl-z-now-by-default.patch \ + 0004-Turn-on-D_FORTIFY_SOURCE-2-by-default-for-C-C-ObjC-O.patch \ + 0005-On-linux-targets-pass-as-needed-by-default-to-the-li.patch \ + 0006-Enable-Wformat-and-Wformat-security-by-default.patch \ + 0007-Enable-Wtrampolines-by-default.patch \ + 0008-Disable-ssp-on-nostdlib-nodefaultlibs-and-ffreestand.patch \ + 0009-Ensure-that-msgfmt-doesn-t-encounter-problems-during.patch \ + 0010-Don-t-declare-asprintf-if-defined-as-a-macro.patch \ + 0011-libiberty-copy-PIC-objects-during-build-process.patch \ + 0012-libgcc_s.patch \ + 0013-nopie.patch \ + 0014-ada-fix-shared-linking.patch \ + 0015-build-fix-CXXFLAGS_FOR_BUILD-passing.patch \ + 0016-add-fortify-headers-paths.patch \ + 0017-Alpine-musl-package-provides-libssp_nonshared.a.-We-.patch \ + 0018-DP-Use-push-state-pop-state-for-gold-as-well-when-li.patch \ + 0019-aarch64-disable-multilib-support.patch \ + 0020-s390x-disable-multilib-support.patch \ + 0021-ppc64-le-disable-multilib-support.patch \ + 0022-x86_64-disable-multilib-support.patch \ + 0023-riscv-disable-multilib-support.patch \ + 0024-always-build-libgcc_eh.a.patch \ + 0025-ada-libgnarl-compatibility-for-musl.patch \ + 0026-ada-musl-support-fixes.patch \ + 0027-configure-Add-enable-autolink-libatomic-use-in-LINK_.patch \ + 0028-configure-fix-detection-of-atomic-builtins-in-libato.patch \ + 0029-libstdc-do-not-throw-exceptions-for-non-C-locales-on.patch \ + 0030-gdc-unconditionally-link-libgphobos-against-libucont.patch \ + 0031-druntime-link-against-libucontext-on-all-platforms.patch \ + 0032-libgnat-time_t-is-always-64-bit-on-musl-libc.patch \ + 0033-libphobos-do-not-use-LFS64-symbols.patch \ + 0034-libgo-fix-lfs64-use.patch \ + 0035-loongarch-disable-multilib-support.patch \ + 0036-libphobos-add-riscv64-and-loongarch64-support.patch \ + fix-arm64.patch \ + ppc64le-quadmath.patch \ + riscv64-improve-build-time.patch; do + curl https://gitlab.alpinelinux.org/alpine/aports/-/raw/3.21-stable/main/gcc/$p | patch -p1 + done + curl https://gcc.gnu.org/pipermail/gcc-patches/attachments/20250220/c6211b02/attachment.bin | patch -p1 + ;; + + build-stage1) + cd "${HOME}"/pkgs + + mkdir binutils-${BINUTILS_VERSION}-build-O${OPT} + cd binutils-${BINUTILS_VERSION}-build-O${OPT} + + "$HOME"/pkgs/binutils-${BINUTILS_VERSION}/configure \ + --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT --disable-nls --disable-werror + make -j"$(nproc)" + make install + + cd "$HOME"/pkgs/linux-${LINUX_VERSION} + make ARCH="$CARCH" INSTALL_HDR_PATH=$PREFIX headers_install + + cd "$HOME"/pkgs + mkdir gcc-${GCC_VERSION}-build-O${OPT}-stage1 + cd gcc-${GCC_VERSION}-build-O${OPT}-stage1 + "$HOME"/pkgs/gcc-${GCC_VERSION}/configure \ + --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT --with-newlib --without-headers \ + --disable-nls --disable-shared --disable-multilib --disable-decimal-float --disable-threads \ + --disable-libatomic --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv \ + --disable-libstdcxx --enable-languages=c,c++ + make -j"$(nproc)" all-gcc + make -j"$(nproc)" all-target-libgcc + make install-gcc + make install-target-libgcc + + cd "$HOME"/pkgs + rm -rf musl-${MUSL_VERSION} + tar xf ${MUSL_TARBALL} + cd musl-${MUSL_VERSION} + ./configure --prefix=$PREFIX --target=$TARGET CC=$TARGET-gcc + make install-headers + make -j"$(nproc)" + make install + ;; + + build-final) + cd "$HOME"/pkgs + mkdir gcc-${GCC_VERSION}-build-O${OPT}-final + cd gcc-${GCC_VERSION}-build-O${OPT}-final + + case "$ARCH" in + aarch64) + _arch_config="--with-arch=armv8-a --with-abi=lp64" + ;; + esac + + "$HOME"/pkgs/gcc-${GCC_VERSION}/configure \ + --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT \ + --libdir=$PREFIX/lib --includedir=$PREFIX/include \ + --disable-shared --enable-tls --disable-libstdcxx-pch --disable-multilib --disable-nls --disable-werror --disable-symvers \ + --enable-threads --enable-__cxa_atexit --enable-languages=c,c++ --enable-link-serialization=2 --enable-linker-build-id \ + --enable-libssp --disable-libsanitizer --with-system-zlib --enable-checking=release --disable-cet --disable-fixed-point \ + --enable-libstdcxx-time=yes --enable-default-pie --enable-default-ssp --with-linker-hash-style=gnu ${_arch_config} + make -j"$(nproc)" + make install + ;; + + cleanup) + cd "$HOME" + rm -rf pkgs + ;; +esac + + diff --git a/.docker/meson-x86_64-riscv64.txt b/.docker/meson-x86_64-riscv64.txt new file mode 100644 index 00000000..f5518dc5 --- /dev/null +++ b/.docker/meson-x86_64-riscv64.txt @@ -0,0 +1,11 @@ +[binaries] +c = 'xx-clang' +cpp = 'xx-clang++' +ar = 'riscv64-alpine-linux-musl-ar' +strip = 'riscv64-alpine-linux-musl-strip' + +[host_machine] +system = 'linux' +cpu_family = 'riscv64' +cpu = 'riscv64' +endian = 'little'