From 62c4d3919b0714f8194a0e1853c94c74f1cbbdc9 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Wed, 23 Jul 2025 07:31:53 +0200 Subject: [PATCH] wip: cross-build --- .docker/Dockerfile.alpine-xx | 116 ++++++++++++++ .docker/Makefile | 14 ++ .docker/install-libstdcxx.sh | 10 +- .docker/install-mold.sh | 5 + .docker/install-static-libs.sh | 260 +++++++++++++++++++++++++------ .docker/install-toolchain.sh | 172 ++++++++++++++++++++ .docker/meson-x86_64-riscv64.txt | 11 ++ 7 files changed, 537 insertions(+), 51 deletions(-) create mode 100644 .docker/Dockerfile.alpine-xx create mode 100644 .docker/install-toolchain.sh create mode 100644 .docker/meson-x86_64-riscv64.txt diff --git a/.docker/Dockerfile.alpine-xx b/.docker/Dockerfile.alpine-xx new file mode 100644 index 00000000..e43e0d26 --- /dev/null +++ b/.docker/Dockerfile.alpine-xx @@ -0,0 +1,116 @@ +# syntax=docker/dockerfile:1 +ARG ARCH=amd64 +FROM --platform=$BUILDPLATFORM tonistiigi/xx AS xx +FROM --platform=$BUILDPLATFORM alpine:latest + +COPY --from=xx / / +ARG TARGETPLATFORM +ARG XXMARCH +RUN echo "Building for target platform: $TARGETPLATFORM, arch: $XXMARCH" + +RUN apk update +RUN apk upgrade +RUN apk add --no-cache \ + bash-completion \ + build-base \ + wget \ + curl \ + vim \ + tar \ + ripgrep \ + less \ + gcc \ + g++ \ + clang19 \ + git \ + xz \ + gzip \ + bzip2 \ + zstd \ + ccache \ + ninja-build \ + cmake \ + make \ + bison \ + flex \ + ronn \ + fuse \ + fuse3 \ + pkgconf \ + meson \ + autoconf \ + strace \ + gdb \ + gmp-dev \ + zlib-dev \ + mpfr-dev \ + mpc1-dev \ + isl-dev \ + texinfo \ + rsync \ + qemu-$XXMARCH + +RUN xx-apk add --no-cache binutils gcc g++ + +# Install UPX +ARG ARCH +# UPX isn't supported on RISC-V yet, so skip this +RUN if [ "$XXMARCH" ~= "^(riscv|s390)" ]; then \ + wget -O - https://github.com/upx/upx/releases/download/v5.0.0/upx-5.0.0-$(bash -c "echo \${0//v8/}" $XXMARCH)_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 size-optimized and static-link-optimized libstdc++ +#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 + +RUN apk add --no-cache linux-headers + +# Install mold +COPY install-mold.sh /usr/local/bin/install-mold.sh +RUN bash /usr/local/bin/install-mold.sh + +RUN apk del linux-headers zlib-dev + +# 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:nlohmann +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:date +RUN bash /usr/local/bin/install-static-libs.sh gcc clang-19 :alpine:utfcpp +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:libevent +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 + +# 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..cfc160ea 100644 --- a/.docker/Makefile +++ b/.docker/Makefile @@ -2,6 +2,8 @@ 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_ALPINE_XX_I386="dwarfs-buildenv-alpine-xx-i386" IMAGE_UBUNTU2204="dwarfs-buildenv-ubuntu2204" IMAGE_FEDORA="dwarfs-buildenv-fedora" IMAGE_ARCH="dwarfs-buildenv-arch" @@ -39,6 +41,18 @@ 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 --build-arg XXMARCH=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_xx_i386: + docker buildx build -f Dockerfile.alpine-xx --platform linux/i386 --build-arg XXMARCH=i386 -t $(IMAGE_ALPINE_XX_I386) . + +run_alpine_xx_i386: + @docker run --platform linux/i386 --env TARGETPLATFORM=linux/386 $(COMMON_RUN_OPTS) $(IMAGE_ALPINE_XX_I386) + 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..cd756c76 100644 --- a/.docker/install-static-libs.sh +++ b/.docker/install-static-libs.sh @@ -11,6 +11,7 @@ CLANG="${2:-clang}" PKGS="${3:-:none}" ARCH="$(uname -m)" +CARCH="$(xx-info march)" FILE_VERSION=5.46 FILE_SHA512=a6cb7325c49fd4af159b7555bdd38149e48a5097207acbe5e36deb5b7493ad6ea94d703da6e0edece5bb32959581741f4213707e5cb0528cd46d75a97a5242dc @@ -18,6 +19,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 +37,11 @@ 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 +LIBEVENT_VERSION=2.1.12 # 2020-07-05 +NLOHMANN_VERSION=3.12.0 # 2025-04-07 +DATE_VERSION=3.0.4 # 2025-05-28 +UTFCPP_VERSION=4.0.6 # 2024-11-03 echo "Using $GCC and $CLANG" @@ -43,7 +50,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,date,double-conversion,flac,fmt,fuse,glog,jemalloc,libarchive,libdwarf,libevent,libucontext,libunwind,libressl,lz4,mimalloc,nlohmann,openssl,utfcpp,xxhash,xz,zstd" else PKGS="${PKGS#:alpine:}" fi @@ -51,12 +58,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 +75,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 +92,10 @@ 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" +LIBEVENT_TARBALL="libevent-${LIBEVENT_VERSION}-stable.tar.gz" +DATE_TARBALL="date-${DATE_VERSION}.tar.gz" +UTFCPP_TARBALL="utfcpp-${UTFCPP_VERSION}.tar.gz" use_lib() { local lib="$1" @@ -122,6 +135,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 +152,11 @@ 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} +fetch_lib libevent https://github.com/libevent/libevent/releases/download/release-${LIBEVENT_VERSION}-stable/${LIBEVENT_TARBALL} +fetch_lib nlohmann https://github.com/nlohmann/json/releases/download/v${NLOHMANN_VERSION}/json.hpp +fetch_lib date https://github.com/HowardHinnant/date/archive/refs/tags/v${DATE_VERSION}.tar.gz ${DATE_TARBALL} +fetch_lib utfcpp https://github.com/nemtrif/utfcpp/archive/refs/tags/v${UTFCPP_VERSION}.tar.gz ${UTFCPP_TARBALL} set_build_flags() { if [[ $CFLAGS =~ ^[[:space:]]*$ ]]; then @@ -167,7 +186,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=$CARCH" + else + export CMAKE_ARGS= + fi set_build_flags } @@ -175,25 +198,89 @@ 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=$CARCH" + else + export CMAKE_ARGS= + fi set_build_flags } +rm -f /tmp/meson-$CARCH.txt + +if [ -n "$TARGETPLATFORM" ]; then + export TARGET="$(xx-info triple)" + export TRIPLETS="--host=$(xx-info triple) --target=$(xx-info triple) --build=$(TARGETARCH= TARGETPLATFORM= xx-info triple)" + export BOOST_CMAKE_ARGS="-DBOOST_CONTEXT_ARCHITECTURE=$CARCH" + export OPENSSL_TARGET_ARGS="linux-$CARCH" + export LIBUCONTEXT_MAKE_ARGS="ARCH=$CARCH" + export MESON_CROSS_FILE="--cross-file=/tmp/meson-$CARCH.txt" + + endian="little" + case "$CARCH" in + powerpc|powerpc64|s390|s390x) + endian="big" + ;; + esac + + cat < /tmp/meson-$CARCH.txt +[binaries] +c = 'xx-clang' +cpp = 'xx-clang++' +ar = '$TARGET-ar' +strip = '$TARGET-strip' + +[host_machine] +system = 'linux' +cpu_family = '$CARCH' +cpu = '$CARCH' +endian = '$endian' +EOF +else + export TARGET="" + export TRIPLETS="" + export BOOST_CMAKE_ARGS="" + export OPENSSL_TARGET_ARGS="" + export LIBUCONTEXT_MAKE_ARGS="" + export MESON_CROSS_FILE="" +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 +308,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 +324,36 @@ 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 + + if use_lib nlohmann; then + mkdir -p "$INSTALL_DIR/include/nlohmann" + cp "$HOME/pkgs/json.hpp" "$INSTALL_DIR/include/nlohmann/json.hpp" + fi + + if use_lib date; then + opt_size + cd "$HOME/pkgs/$COMPILER" + tar xf ../${DATE_TARBALL} + cd date-${DATE_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + make -j$(nproc) + make install + fi + + if use_lib utfcpp; then + opt_size + cd "$HOME/pkgs/$COMPILER" + tar xf ../${UTFCPP_TARBALL} + cd utfcpp-${UTFCPP_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} make -j$(nproc) make install fi @@ -244,7 +368,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 +381,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 +439,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" $MESON_CROSS_FILE + # 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 @@ -340,7 +466,7 @@ for COMPILER in $COMPILERS; do cd benchmark-${BENCHMARK_VERSION} mkdir build cd build - cmake .. -DBENCHMARK_ENABLE_TESTING=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + cmake .. -DBENCHMARK_ENABLE_TESTING=OFF -DBENCHMARK_ENABLE_WERROR=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} make -j$(nproc) make install fi @@ -392,7 +518,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 +530,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" $MESON_CROSS_FILE meson configure -D zlib=disabled -D lzma=disabled -D lz4=disabled meson setup --reconfigure ../build/meson ninja @@ -416,7 +542,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 +559,36 @@ 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 libevent; then + opt_size + cd "$HOME/pkgs/$COMPILER" + tar xf ../${LIBEVENT_TARBALL} + cd libevent-${LIBEVENT_VERSION}-stable + curl https://github.com/libevent/libevent/commit/883630f76cbf512003b81de25cd96cb75c6cf0f9.diff | patch -p1 + mkdir build + cd build + cmake .. -DCMAKE_PREFIX_PATH="$INSTALL_DIR" -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} \ + -DEVENT__DISABLE_DEBUG_MODE=ON -DEVENT__DISABLE_THREAD_SUPPORT=ON -DEVENT__DISABLE_OPENSSL=ON \ + -DEVENT__DISABLE_MBEDTLS=ON -DEVENT__DISABLE_BENCHMARK=ON -DEVENT__DISABLE_TESTS=ON \ + -DEVENT__DISABLE_REGRESS=ON -DEVENT__DISABLE_SAMPLES=ON -DEVENT__LIBRARY_TYPE=STATIC 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 +600,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 +619,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 +629,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" $MESON_CROSS_FILE + # meson configure + # meson setup --reconfigure .. + ninja + ninja install + fi + if use_lib cpptrace; then opt_size cd "$HOME/pkgs/$COMPILER" @@ -498,7 +656,9 @@ for COMPILER in $COMPILERS; do cd cpptrace-${CPPTRACE_VERSION} mkdir build cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + cmake .. -DCMAKE_PREFIX_PATH="$INSTALL_DIR" -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..22ca6510 --- /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 march)" +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'