From 2dec20b01f882d899ad2f1091d04cbdffb29da3f Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Wed, 23 Jul 2025 07:31:53 +0200 Subject: [PATCH] build: completely refactor static build to support cross-compilation --- .docker/Dockerfile.alpine | 106 +-- .docker/Dockerfile.ubuntu | 7 - .docker/Makefile | 12 +- .docker/build-linux.sh | 78 +- .docker/check_lib_versions.py | 7 + .docker/fetch.sh | 31 + .docker/install-bloaty.sh | 5 +- .docker/install-libstdcxx.sh | 87 --- .docker/install-mold.sh | 6 +- .docker/install-static-libs.sh | 953 +++++++++++++++--------- .docker/install-toolchain.sh | 219 ++++++ .github/workflows/build.yml | 317 +++++--- .github/workflows/docker-run-build.yml | 10 +- .maintainer-scripts/workflow-tracing.py | 7 +- CMakeLists.txt | 22 +- 15 files changed, 1223 insertions(+), 644 deletions(-) create mode 100755 .docker/fetch.sh delete mode 100644 .docker/install-libstdcxx.sh create mode 100644 .docker/install-toolchain.sh diff --git a/.docker/Dockerfile.alpine b/.docker/Dockerfile.alpine index 6062a150..a3b6584c 100644 --- a/.docker/Dockerfile.alpine +++ b/.docker/Dockerfile.alpine @@ -1,9 +1,18 @@ # syntax=docker/dockerfile:1 ARG ARCH=amd64 FROM $ARCH/alpine:latest + +ARG ARCH +ARG TARGET_ARCHS +ARG TOOLCHAIN_OPTIMIZE=2 + RUN apk update RUN apk upgrade -RUN apk add --no-cache \ +RUN qemu_pkgs=""; \ + for arch in $(echo $TARGET_ARCHS | tr ',' ' '); do \ + qemu_pkgs="$qemu_pkgs qemu-$arch"; \ + done; \ + apk add --no-cache \ bash-completion \ build-base \ wget \ @@ -11,81 +20,90 @@ RUN apk add --no-cache \ vim \ tar \ ripgrep \ - py3-pip \ less \ gcc \ g++ \ clang18 \ clang19 \ + clang20 \ + lld \ git \ + xz \ + gzip \ + bzip2 \ + zstd \ ccache \ - samurai \ + ninja-build \ cmake \ make \ bison \ flex \ ronn \ + perf \ + py3-pip \ 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 + gdb \ + gmp-dev \ + zlib-static \ + zstd-static \ + zlib-dev \ + zstd-dev \ + mpfr-dev \ + mpc1-dev \ + isl-dev \ + texinfo \ + linux-headers \ + gdb-multiarch \ + rsync \ + screen \ + $qemu_pkgs -# 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 -COPY install-libstdcxx.sh /usr/local/bin/install-libstdcxx.sh -RUN bash /usr/local/bin/install-libstdcxx.sh +COPY fetch.sh /usr/local/bin/fetch.sh # Install mold COPY install-mold.sh /usr/local/bin/install-mold.sh -RUN bash /usr/local/bin/install-mold.sh +RUN --mount=type=cache,id=ccache,target=/root/.ccache --mount=type=cache,id=pkgcache,target=/root/.pkgcache \ + bash /usr/local/bin/install-mold.sh # Install bloaty COPY install-bloaty.sh /usr/local/bin/install-bloaty.sh -RUN if [ "$ARCH" != "riscv64" ]; then \ +RUN --mount=type=cache,id=ccache,target=/root/.ccache --mount=type=cache,id=pkgcache,target=/root/.pkgcache \ + if [ "$ARCH" == "amd64" ]; then \ bash /usr/local/bin/install-bloaty.sh; \ else \ - echo "Skipping bloaty installation for RISC-V."; \ + echo "Skipping bloaty installation for $ARCH."; \ fi +RUN apk del linux-headers + +# Install size-optimized and static-link-optimized libstdc++ +COPY install-toolchain.sh /usr/local/bin/install-toolchain.sh +RUN --mount=type=cache,id=ccache,target=/root/.ccache --mount=type=cache,id=pkgcache,target=/root/.pkgcache \ + bash /usr/local/bin/install-toolchain.sh $TOOLCHAIN_OPTIMIZE $TARGET_ARCHS + +RUN apk del zlib-dev zstd-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 -# Install the *real* ninja... -# TODO: move this up if we change anything -RUN apk add --no-cache ninja-build +RUN --mount=type=cache,id=ccache,target=/root/.ccache --mount=type=cache,id=pkgcache,target=/root/.pkgcache \ + bash /usr/local/bin/install-static-libs.sh :all $TARGET_ARCHS + +# Install UPX +# UPX isn't supported on RISC-V/S390 (yet), so skip this +RUN if [ "$ARCH" == "amd64" ] || [ "$ARCH" == "arm64v8" ]; then \ + wget -O - https://github.com/upx/upx/releases/download/v5.0.2/upx-5.0.2-$(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 $ARCH architecture while it is not supported."; \ + echo "See https://github.com/upx/upx/discussions/793 for details."; \ + fi + +RUN pip3 install --break-system-packages --root-user-action ignore mistletoe # Set up git & user RUN git config --global --add safe.directory /workspace diff --git a/.docker/Dockerfile.ubuntu b/.docker/Dockerfile.ubuntu index 6ec4fd81..7bbf8e1d 100644 --- a/.docker/Dockerfile.ubuntu +++ b/.docker/Dockerfile.ubuntu @@ -72,13 +72,6 @@ RUN apt install -y \ libflac++-dev \ nlohmann-json3-dev \ python3-mistletoe -### XXX: no more static libs for Ubuntu -# COPY install-static-libs.sh /usr/local/bin/install-static-libs.sh -# # TODO: gcc-14 cannot build the current version of libunwind -# RUN bash /usr/local/bin/install-static-libs.sh gcc-13 clang-18 :ubuntu -ARG ARCH -# upx-4.2.2 is broken for arm64 (https://github.com/upx/upx/issues/758) -RUN 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" # current ronn version is horribly broken RUN gem install ronn-ng # RUN useradd -g users -u 1000 -m mhx diff --git a/.docker/Makefile b/.docker/Makefile index 8caae801..c481e10b 100644 --- a/.docker/Makefile +++ b/.docker/Makefile @@ -1,7 +1,7 @@ IMAGE_UBUNTU="dwarfs-buildenv" IMAGE_DEBIAN="dwarfs-buildenv-debian" IMAGE_ALPINE="dwarfs-buildenv-alpine" -IMAGE_ALPINE_RISCV="dwarfs-buildenv-alpine-riscv64" +IMAGE_ALPINE_NEWARCH="dwarfs-buildenv-alpine-newarch" IMAGE_UBUNTU2204="dwarfs-buildenv-ubuntu2204" IMAGE_FEDORA="dwarfs-buildenv-fedora" IMAGE_ARCH="dwarfs-buildenv-arch" @@ -34,16 +34,16 @@ run_debian: @docker run $(COMMON_RUN_OPTS) $(IMAGE_DEBIAN) build_alpine: - docker build -f Dockerfile.alpine -t $(IMAGE_ALPINE) . + docker buildx build -f Dockerfile.alpine --build-arg TARGET_ARCHS=x86_64,aarch64,riscv64,ppc64le,s390x,arm,i386 -t $(IMAGE_ALPINE) . run_alpine: @docker run $(COMMON_RUN_OPTS) $(IMAGE_ALPINE) -build_alpine_riscv: - docker build -f Dockerfile.alpine -t $(IMAGE_ALPINE_RISCV) --build-arg ARCH=riscv64 . +build_alpine_newarch: + docker buildx build -f Dockerfile.alpine --build-arg TARGET_ARCHS=s390x -t $(IMAGE_ALPINE_NEWARCH) . -run_alpine_riscv: - @docker run $(COMMON_RUN_OPTS) $(IMAGE_ALPINE_RISCV) +run_alpine_newarch: + @docker run $(COMMON_RUN_OPTS) $(IMAGE_ALPINE_NEWARCH) build_ubuntu2204: docker build -f Dockerfile.ubuntu-2204 -t $(IMAGE_UBUNTU2204) . diff --git a/.docker/build-linux.sh b/.docker/build-linux.sh index 77229cba..107c8a6c 100755 --- a/.docker/build-linux.sh +++ b/.docker/build-linux.sh @@ -9,8 +9,8 @@ mkdir -p "$LOCAL_REPO_PATH" LAST_UPDATE_FILE="$LOCAL_REPO_PATH/last-update" WORKFLOW_LOG_DIR="/artifacts/workflow-logs/${GITHUB_RUN_ID}" -NINJA_LOG_FILE="${WORKFLOW_LOG_DIR}/ninja-${BUILD_ARCH},${BUILD_DIST},${BUILD_TYPE}.log" -BUILD_LOG_FILE="${WORKFLOW_LOG_DIR}/build-${BUILD_ARCH},${BUILD_DIST},${BUILD_TYPE}.log" +NINJA_LOG_FILE="${WORKFLOW_LOG_DIR}/ninja-${BUILD_ARCH},${CROSS_ARCH},${BUILD_DIST},${BUILD_TYPE}.log" +BUILD_LOG_FILE="${WORKFLOW_LOG_DIR}/build-${BUILD_ARCH},${CROSS_ARCH},${BUILD_DIST},${BUILD_TYPE}.log" mkdir -p "$WORKFLOW_LOG_DIR" log() { @@ -77,7 +77,7 @@ cd build # Stick to clang-18, clang-19 has a regression for nilsimsa performance if [[ "$BUILD_DIST" == "alpine" ]]; then GCC_VERSION= - CLANG_VERSION=-19 + CLANG_VERSION=-20 elif [[ "$BUILD_DIST" == "ubuntu-2204" ]]; then GCC_VERSION=-12 CLANG_VERSION=-15 @@ -114,6 +114,9 @@ case "-$BUILD_TYPE-" in *-ubuntu-*|*-debian-*) export CC=gcc$GCC_VERSION CXX=g++$GCC_VERSION ;; + *) + export CC=gcc CXX=g++ + ;; esac export COMPILER=gcc ;; @@ -182,7 +185,16 @@ esac case "-$BUILD_TYPE-" in *-static-*) - export LDFLAGS="${LDFLAGS} -fuse-ld=mold" + case "$CROSS_ARCH" in + ppc64le) + # https://github.com/rui314/mold/issues/1490 + CMAKE_ARGS="${CMAKE_ARGS} -DDISABLE_MOLD=1" + export LDFLAGS="${LDFLAGS} -fuse-ld=lld" + ;; + *) + export LDFLAGS="${LDFLAGS} -fuse-ld=mold" + ;; + esac ;; esac @@ -287,39 +299,49 @@ if [[ "-$BUILD_TYPE-" == *-shared-* ]]; then fi if [[ "-$BUILD_TYPE-" == *-static-* ]]; then - if [[ "-$BUILD_TYPE-" == *-relsize-* ]]; then - _LIBSTDCXXDIR="/opt/static-libs/libstdc++-Os/lib" - if [[ "$ARCH" == "aarch64" ]]; then - # Similar to the issue with *not* linking against `gcc_eh` in the CMakeLists.txt, - # if we link against the `gcc_eh` from the `-Os` build, we run into exactly the - # same issue. So we temporarily copy the size-optimized `libgcc.a` to a directory - # we then use for linking. - _GCCLIBDIR="/tmp/gcclib" - mkdir -p "$_GCCLIBDIR" - cp -a "$_LIBSTDCXXDIR"/gcc/*/*/libgcc.a "$_GCCLIBDIR" - else - _GCCLIBDIR=$(ls -d1 $_LIBSTDCXXDIR/gcc/*/*) - fi - LDFLAGS="${LDFLAGS} -L$_GCCLIBDIR -L$_LIBSTDCXXDIR" + # A size-optimized libgcc/libstdc++/musl will only save about 10k for the universal + # and fuse-extract binaries, so we'll just stick to using the -O2 toolchain. + _SYSROOT="/opt/cross/O2" + _MARCH="${CROSS_ARCH}" + if [[ -z "$CROSS_ARCH" ]]; then + _MARCH="${ARCH}" fi - export LDFLAGS="${LDFLAGS} -L/opt/static-libs/$COMPILER/lib" - if [[ "$ARCH" == "aarch64" ]]; then - # For some reason, this dependency of libunwind is not resolved on aarch64 - export LDFLAGS="${LDFLAGS} -lz" + if [[ "$_MARCH" == "arm" ]]; then + _TARGET="${_MARCH}-linux-musleabihf" + else + _TARGET="${_MARCH}-alpine-linux-musl" fi - CMAKE_ARGS="${CMAKE_ARGS} -DSTATIC_BUILD_DO_NOT_USE=1 -DWITH_UNIVERSAL_BINARY=1 -DWITH_FUSE_EXTRACT_BINARY=1" + export CC="${_TARGET}-${CC}" + export CXX="${_TARGET}-${CXX}" + export STRIP_TOOL="${_TARGET}-strip" + export PATH="$_SYSROOT/usr/bin:$PATH" + + _staticprefix="/opt/static-libs/$COMPILER/$_TARGET" if [[ "$BUILD_TYPE" == *-minimal-* ]]; then - _jemallocprefix="/opt/static-libs/$COMPILER-jemalloc-minimal" + _jemallocprefix="/opt/static-libs/$COMPILER-jemalloc-minimal/$_TARGET" else CMAKE_ARGS="${CMAKE_ARGS} -DWITH_PXATTR=1" - _jemallocprefix="/opt/static-libs/$COMPILER-jemalloc-full" + _jemallocprefix="/opt/static-libs/$COMPILER-jemalloc-full/$_TARGET" fi if [[ "$BUILD_TYPE" == *-libressl-* ]]; then - _sslprefix="/opt/static-libs/$COMPILER-libressl" + _sslprefix="/opt/static-libs/$COMPILER-libressl/$_TARGET" else - _sslprefix="/opt/static-libs/$COMPILER-openssl" + _sslprefix="/opt/static-libs/$COMPILER-openssl/$_TARGET" + fi + + export LDFLAGS="${LDFLAGS} -static-libgcc -L$_staticprefix/lib -L$_sslprefix/lib" + export CFLAGS="${CFLAGS} -isystem $_staticprefix/include" + export CXXFLAGS="${CXXFLAGS} -isystem $_staticprefix/include" + + if [[ "$_MARCH" == "i386" ]]; then + export LDFLAGS="${LDFLAGS} -lucontext" + fi + + CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_SYSROOT=$_SYSROOT -DCMAKE_FIND_ROOT_PATH=$_staticprefix;$_sslprefix;$_jemallocprefix -DCMAKE_PREFIX_PATH=$_staticprefix;$_sslprefix;$_jemallocprefix -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DSTATIC_BUILD_DO_NOT_USE=1 -DWITH_UNIVERSAL_BINARY=1 -DWITH_FUSE_EXTRACT_BINARY=1" + + if [[ -n "$CROSS_ARCH" ]]; then + CMAKE_ARGS="${CMAKE_ARGS} -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$_MARCH -DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/qemu-$_MARCH -DFOLLY_HAVE_UNALIGNED_ACCESS=OFF -DFOLLY_HAVE_WEAK_SYMBOLS=ON -DFOLLY_HAVE_LINUX_VDSO=OFF -DFOLLY_HAVE_WCHAR_SUPPORT=OFF -DHAVE_VSNPRINTF_ERRORS=OFF" fi - CMAKE_ARGS="${CMAKE_ARGS} -DSTATIC_BUILD_EXTRA_PREFIX=/opt/static-libs/$COMPILER;$_sslprefix;$_jemallocprefix" fi INSTALLDIR="$HOME/install" diff --git a/.docker/check_lib_versions.py b/.docker/check_lib_versions.py index 8c396931..5c092477 100755 --- a/.docker/check_lib_versions.py +++ b/.docker/check_lib_versions.py @@ -23,6 +23,13 @@ repositories = [ # "microsoft/mimalloc", "jemalloc/jemalloc", "tukaani-project/xz", + "davea42/libdwarf-code", + "libevent/libevent", + "nlohmann/json", + "HowardHinnant/date", + "nemtrif/utfcpp", + "ericniebler/range-v3", + "greg7mdp/parallel-hashmap", ] diff --git a/.docker/fetch.sh b/.docker/fetch.sh new file mode 100755 index 00000000..ef4bc43d --- /dev/null +++ b/.docker/fetch.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -ex + +URL=$1 +FILE=${2:-$(basename "$URL")} +SHA512SUM="${3}" + +URLHASH=$(echo -n "$URL" | sha256sum | awk '{print $1}') +CACHEDIR="$HOME/.pkgcache" +CACHEFILE="$CACHEDIR/$URLHASH" + +if [ ! -f "$CACHEFILE" ]; then + rm -f "$CACHEFILE.tmp" + curl --retry 5 -L "$URL" > "$CACHEFILE.tmp" + if [ -n "$SHA512SUM" ]; then + echo "$SHA512SUM $CACHEFILE.tmp" | sha512sum -c - + if [ $? -ne 0 ]; then + echo "Checksum verification failed for $URL" + rm -f "$CACHEFILE.tmp" + exit 1 + fi + fi + mv -f "$CACHEFILE.tmp" "$CACHEFILE" +fi + +if [ "$FILE" == "-" ]; then + cat "$CACHEFILE" +else + cp "$CACHEFILE" "$FILE" +fi diff --git a/.docker/install-bloaty.sh b/.docker/install-bloaty.sh index aad8007e..519a1fe6 100644 --- a/.docker/install-bloaty.sh +++ b/.docker/install-bloaty.sh @@ -6,13 +6,16 @@ cd "$HOME" mkdir pkgs cd pkgs -git clone --recurse-submodules https://github.com/google/bloaty +git clone --depth=1 --recurse-submodules --shallow-submodules https://github.com/google/bloaty cd bloaty mkdir build cd build +export PATH="/usr/lib/ccache/bin:$PATH" + cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ninja +ccache -s ninja install cd "$HOME" diff --git a/.docker/install-libstdcxx.sh b/.docker/install-libstdcxx.sh deleted file mode 100644 index 66a87a52..00000000 --- a/.docker/install-libstdcxx.sh +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/bash - -set -ex - -cd "$HOME" -mkdir pkgs -cd pkgs - -GCC_VERSION=14.2.0 - -ARCH="$(uname -m)" - -wget https://ftp.gwdg.de/pub/misc/gcc/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.xz -tar xf gcc-${GCC_VERSION}.tar.xz -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 - -# for opt in s 2; do -for opt in s; do - cd "${HOME}"/pkgs - mkdir gcc-${GCC_VERSION}-build-O${opt} - cd gcc-${GCC_VERSION}-build-O${opt} - - export CFLAGS="-O${opt} -ffunction-sections -fdata-sections -fmerge-all-constants -fPIC" - export CXXFLAGS="-O${opt} -ffunction-sections -fdata-sections -fmerge-all-constants -fPIC" - export LDFLAGS="-Wl,--gc-sections" - INSTALLDIR=/opt/static-libs/libstdc++-O${opt} - - case "$ARCH" in - aarch64) - _arch_config="--with-arch=armv8-a --with-abi=lp64" - ;; - esac - - "$HOME"/pkgs/gcc-${GCC_VERSION}/configure --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 \ - --enable-default-pie --enable-default-ssp --with-linker-hash-style=gnu ${_arch_config} - make -j"$(nproc)" - make install -done - -cd "$HOME" -rm -rf pkgs diff --git a/.docker/install-mold.sh b/.docker/install-mold.sh index 533f2178..c657d7c3 100644 --- a/.docker/install-mold.sh +++ b/.docker/install-mold.sh @@ -6,14 +6,16 @@ cd "$HOME" mkdir pkgs cd pkgs -MOLD_VERSION=2.37.1 +MOLD_VERSION=2.40.2 -wget -O mold-${MOLD_VERSION}.tar.gz https://github.com/rui314/mold/archive/refs/tags/v${MOLD_VERSION}.tar.gz +fetch.sh https://github.com/rui314/mold/archive/refs/tags/v${MOLD_VERSION}.tar.gz mold-${MOLD_VERSION}.tar.gz tar xf mold-${MOLD_VERSION}.tar.gz cd mold-${MOLD_VERSION} mkdir build cd build +export PATH="/usr/lib/ccache/bin:$PATH" + cmake .. -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ninja ninja install diff --git a/.docker/install-static-libs.sh b/.docker/install-static-libs.sh index c0e00cb8..3563fcc2 100644 --- a/.docker/install-static-libs.sh +++ b/.docker/install-static-libs.sh @@ -6,18 +6,20 @@ cd "$HOME" mkdir pkgs cd pkgs -GCC="${1:-gcc}" -CLANG="${2:-clang}" -PKGS="${3:-:none}" - ARCH="$(uname -m)" +GCC="gcc" +CLANG="clang-20" +PKGS="$1" +TARGET_ARCH_STR="${2:-${ARCH}}" + FILE_VERSION=5.46 FILE_SHA512=a6cb7325c49fd4af159b7555bdd38149e48a5097207acbe5e36deb5b7493ad6ea94d703da6e0edece5bb32959581741f4213707e5cb0528cd46d75a97a5242dc 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 @@ -31,42 +33,38 @@ XXHASH_VERSION=0.8.3 # 2024-12-30 LZ4_VERSION=1.10.0 # 2024-07-22 BROTLI_VERSION=1.1.0 # 2023-08-31 ZSTD_VERSION=1.5.7 # 2025-02-19 -LIBFUSE_VERSION=3.17.2 # 2025-04-23 +LIBFUSE_VERSION=2.9.9 # 2019-01-04 +LIBFUSE3_VERSION=3.17.3 # 2025-07-19 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 +RANGE_V3_VERSION=0.12.0 # 2022-06-21 +PARALLEL_HASHMAP_VERSION=2.0.0 # 2025-01-21 echo "Using $GCC and $CLANG" -if [[ "$PKGS" == ":ubuntu" ]]; then - PKGS="file,bzip2,libarchive,flac,libunwind,benchmark,openssl,cpptrace" - 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" - else - PKGS="${PKGS#:alpine:}" - fi - export COMMON_CFLAGS="-ffunction-sections -fdata-sections -fmerge-all-constants" - 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 -elif [[ "$PKGS" == ":none" ]]; then +if [[ "$PKGS" == ":none" ]]; then echo "No libraries to build" exit 0 +elif [[ "$PKGS" == ":all" ]]; then + PKGS="benchmark,boost,brotli,cpptrace,date,double-conversion,flac,fmt,fuse,fuse3,glog,jemalloc,libarchive,libdwarf,libevent,libucontext,libunwind,libressl,lz4,mimalloc,nlohmann,openssl,parallel-hashmap,range-v3,utfcpp,xxhash,xz,zstd" fi +export COMMON_CFLAGS="-ffunction-sections -fdata-sections -fmerge-all-constants" +export COMMON_CXXFLAGS="$COMMON_CFLAGS" +export COMMON_LDFLAGS="-static-libgcc" + FILE_TARBALL="file-${FILE_VERSION}.tar.gz" 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" @@ -80,12 +78,35 @@ LZ4_TARBALL="lz4-${LZ4_VERSION}.tar.gz" BROTLI_TARBALL="brotli-${BROTLI_VERSION}.tar.gz" ZSTD_TARBALL="zstd-${ZSTD_VERSION}.tar.gz" LIBFUSE_TARBALL="fuse-${LIBFUSE_VERSION}.tar.gz" +LIBFUSE3_TARBALL="fuse-${LIBFUSE3_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" +RANGE_V3_TARBALL="range-v3-${RANGE_V3_VERSION}.tar.gz" +PARALLEL_HASHMAP_TARBALL="parallel-hashmap-${PARALLEL_HASHMAP_VERSION}.tar.gz" use_lib() { local lib="$1" + case "$CARCH" in + ppc64le|arm) + case "$lib" in + libunwind|libdwarf|cpptrace) + return 1 + ;; + esac + ;; + s390x) + case "$lib" in + libunwind|libdwarf|cpptrace|libressl) + return 1 + ;; + esac + ;; + esac if [[ ",$PKGS," == *",$lib,"* ]]; then return 0 else @@ -96,9 +117,7 @@ use_lib() { if use_lib file; then RETRY=0 while true; do - rm -f "$FILE_TARBALL" - curl -o "$FILE_TARBALL" "ftp://ftp.astron.com/pub/file/$FILE_TARBALL" - if echo "${FILE_SHA512} $FILE_TARBALL" | sha512sum -c; then + if fetch.sh "ftp://ftp.astron.com/pub/file/$FILE_TARBALL" "$FILE_TARBALL" "$FILE_SHA512"; then break fi RETRY=$((RETRY+1)) @@ -114,7 +133,7 @@ fetch_lib() { local url="$2" local tarball="${3:-${url##*/}}" if use_lib "$lib"; then - wget -O "$tarball" "$url" + fetch.sh "$url" "$tarball" fi } @@ -122,6 +141,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} @@ -135,9 +155,17 @@ fetch_lib lz4 https://github.com/lz4/lz4/releases/download/v${LZ4_VERSION}/${LZ4 fetch_lib brotli https://github.com/google/brotli/archive/refs/tags/v${BROTLI_VERSION}.tar.gz ${BROTLI_TARBALL} fetch_lib zstd https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/${ZSTD_TARBALL} fetch_lib fuse https://github.com/libfuse/libfuse/releases/download/fuse-${LIBFUSE_VERSION}/${LIBFUSE_TARBALL} +fetch_lib fuse3 https://github.com/libfuse/libfuse/releases/download/fuse-${LIBFUSE3_VERSION}/${LIBFUSE3_TARBALL} 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} +fetch_lib range-v3 https://github.com/ericniebler/range-v3/archive/refs/tags/${RANGE_V3_VERSION}.tar.gz ${RANGE_V3_TARBALL} +fetch_lib parallel-hashmap https://github.com/greg7mdp/parallel-hashmap/archive/refs/tags/v${PARALLEL_HASHMAP_VERSION}.tar.gz ${PARALLEL_HASHMAP_TARBALL} set_build_flags() { if [[ $CFLAGS =~ ^[[:space:]]*$ ]]; then @@ -166,343 +194,602 @@ set_build_flags() { opt_size() { export CFLAGS="$SIZE_CFLAGS" export CXXFLAGS="$SIZE_CXXFLAGS" + export CPPFLAGS="$TARGET_FLAGS" # export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=MinSizeRel" - export CMAKE_ARGS= + export CMAKE_ARGS="-GNinja" + if [[ "$CARCH" != "$ARCH" ]]; then + export CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$CARCH" + fi set_build_flags } opt_perf() { export CFLAGS="$PERF_CFLAGS" export CXXFLAGS="$PERF_CXXFLAGS" + export CPPFLAGS="$TARGET_FLAGS" # export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release" - export CMAKE_ARGS= + export CMAKE_ARGS="-GNinja" + if [[ "$CARCH" != "$ARCH" ]]; then + export CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=$CARCH" + fi set_build_flags } -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" +for target_arch in ${TARGET_ARCH_STR//,/ }; do + echo "===========================================================" + echo "Building for target architecture: $target_arch" + echo "===========================================================" - case "$COMPILER" in - clang*) - export CC="$CLANG" - export CXX="${CLANG/clang/clang++}" + export CARCH="$target_arch" + + rm -f /tmp/meson-$CARCH.txt + + case "$CARCH" in + aarch64*) OPENSSL_TARGET_ARGS="linux-aarch64" ;; + arm*) OPENSSL_TARGET_ARGS="linux-armv4" ;; + mips64*) OPENSSL_TARGET_ARGS="linux64-mips64" ;; + ppc) OPENSSL_TARGET_ARGS="linux-ppc" ;; + ppc64) OPENSSL_TARGET_ARGS="linux-ppc64" ;; + ppc64le) OPENSSL_TARGET_ARGS="linux-ppc64le" ;; + i386) OPENSSL_TARGET_ARGS="linux-elf" ;; + s390x) OPENSSL_TARGET_ARGS="linux64-s390x" ;; + riscv64) OPENSSL_TARGET_ARGS="linux64-riscv64" ;; + loongarch64) OPENSSL_TARGET_ARGS="linux64-loongarch64" ;; + x86_64) OPENSSL_TARGET_ARGS="linux-x86_64" ;; + *) echo "Unable to determine architecture from (CARCH=$CARCH)"; exit 1 ;; + esac + + BOOST_CONTEXT_ARCH="$CARCH" + case "$CARCH" in + aarch64*) BOOST_CONTEXT_ARCH="arm64" ;; + ppc64*) BOOST_CONTEXT_ARCH="ppc64" ;; + esac + + export TARGET="${CARCH}-alpine-linux-musl" + + case "$CARCH" in + arm) export TARGET="arm-linux-musleabihf" ;; + esac + + export TRIPLETS="--host=$TARGET --target=$TARGET --build=$ARCH-alpine-linux-musl" + export BOOST_CMAKE_ARGS="-DBOOST_CONTEXT_ARCHITECTURE=$BOOST_CONTEXT_ARCH" + export LIBUCONTEXT_MAKE_ARGS="ARCH=$CARCH" + export MESON_CROSS_FILE="--cross-file=/tmp/meson-$CARCH.txt" + + endian="little" + case "$CARCH" in + s390x|powerpc|powerpc64) + endian="big" ;; - gcc*) - export CC="$GCC" - export CXX="${GCC/gcc/g++}" + esac + + cat < /tmp/meson-$CARCH.txt +[binaries] +c = '$TARGET-clang' +cpp = '$TARGET-clang++' +ld = '$TARGET-clang' +ar = '$TARGET-ar' +strip = '$TARGET-strip' + +[host_machine] +system = 'linux' +cpu_family = '$CARCH' +cpu = '$CARCH' +endian = '$endian' +EOF + + export SYSROOT="/opt/cross/O2" + export PATH="$SYSROOT/usr/lib/ccache/bin:$SYSROOT/usr/bin:$PATH" + export WORKROOT="$HOME/pkgs" + + # COMPILERS="clang clang-lto clang-minsize-lto gcc" + case "$CARCH" in + # https://github.com/llvm/llvm-project/issues/150913 + ppc64le) + COMPILERS="gcc" ;; *) - echo "Unknown compiler: $COMPILER" - exit 1 + if [[ "$ARCH" == "riscv64" ]]; then + # This is so slow natively, stick to the basics for now + COMPILERS="clang" + else + COMPILERS="clang clang-minsize-lto gcc" + fi ;; esac - case "-$COMPILER-" in - *-minsize-*) - export SIZE_CFLAGS="$SIZE_CFLAGS -Os" - export SIZE_CXXFLAGS="$SIZE_CXXFLAGS -Os" - ;; - esac + INSTALL_ROOT="/opt/static-libs" - case "$COMPILER" in - *-lto) - export SIZE_CFLAGS="$SIZE_CFLAGS -flto" - export SIZE_CXXFLAGS="$SIZE_CXXFLAGS -flto" - export PERF_CFLAGS="$PERF_CFLAGS -flto" - export PERF_CXXFLAGS="$PERF_CXXFLAGS -flto" - export COMP_LDFLAGS="$COMP_LDFLAGS -flto" - ;; - esac + for COMPILER in $COMPILERS; do + INSTALL_DIR="$INSTALL_ROOT/$COMPILER/$TARGET" + INSTALL_DIR_OPENSSL="$INSTALL_ROOT/$COMPILER-openssl/$TARGET" + INSTALL_DIR_LIBRESSL="$INSTALL_ROOT/$COMPILER-libressl/$TARGET" + WORKSUBDIR="$COMPILER/$TARGET" + WORKDIR="$WORKROOT/$WORKSUBDIR" - cd "$HOME/pkgs" - mkdir $COMPILER + export TARGET_FLAGS="--sysroot=$SYSROOT" + export SIZE_CFLAGS="$TARGET_FLAGS $COMMON_CFLAGS -isystem $INSTALL_DIR/include" + export SIZE_CXXFLAGS="$TARGET_FLAGS $COMMON_CXXFLAGS -isystem $INSTALL_DIR/include" + export PERF_CFLAGS="$TARGET_FLAGS $COMMON_CFLAGS -isystem $INSTALL_DIR/include" + export PERF_CXXFLAGS="$TARGET_FLAGS $COMMON_CXXFLAGS -isystem $INSTALL_DIR/include" + export COMP_LDFLAGS="$TARGET_FLAGS $COMMON_LDFLAGS -L$INSTALL_DIR/lib" - INSTALL_DIR=/opt/static-libs/$COMPILER + case "$CARCH" in + ppc64le) + # https://github.com/rui314/mold/issues/1490 + export COMP_LDFLAGS="-fuse-ld=lld $COMP_LDFLAGS" + ;; + *) + export COMP_LDFLAGS="-fuse-ld=mold $COMP_LDFLAGS" + ;; + esac - if use_lib libunwind; then - opt_size - cd "$HOME/pkgs/$COMPILER" - 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 - make -j$(nproc) - make install - fi + case "$COMPILER" in + clang*) + export CC="$TARGET-clang" + export CXX="$TARGET-clang++" + ;; + gcc*) + export CC="$TARGET-gcc" + export CXX="$TARGET-g++" + ;; + *) + echo "Unknown compiler: $COMPILER" + exit 1 + ;; + esac - if use_lib boost; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${BOOST_TARBALL} - cd boost-${BOOST_VERSION} - mkdir build - cd build - 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 \ - -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} - make -j$(nproc) - make install - fi + case "-$COMPILER-" in + *-minsize-*) + export SIZE_CFLAGS="$SIZE_CFLAGS -Os" + export SIZE_CXXFLAGS="$SIZE_CXXFLAGS -Os" + ;; + esac - if use_lib jemalloc; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${JEMALLOC_TARBALL} - 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 - make -j$(nproc) - make install - fi + case "$COMPILER" in + *-lto) + export SIZE_CFLAGS="$SIZE_CFLAGS -flto" + export SIZE_CXXFLAGS="$SIZE_CXXFLAGS -flto" + export PERF_CFLAGS="$PERF_CFLAGS -flto" + export PERF_CXXFLAGS="$PERF_CXXFLAGS -flto" + export COMP_LDFLAGS="$COMP_LDFLAGS -flto" + ;; + esac - if use_lib mimalloc; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${MIMALLOC_TARBALL} - cd mimalloc-${MIMALLOC_VERSION} - mkdir build - cd build - cmake .. -DMI_LIBC_MUSL=ON -DMI_BUILD_SHARED=OFF -DMI_BUILD_OBJECT=OFF -DMI_BUILD_TESTS=OFF -DMI_OPT_ARCH=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} - make -j$(nproc) - make install - fi + cd "$WORKROOT" + mkdir -p "$WORKSUBDIR" - if use_lib double-conversion; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${DOUBLE_CONVERSION_TARBALL} - cd double-conversion-${DOUBLE_CONVERSION_VERSION} - mkdir build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib fmt; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${FMT_TARBALL} - cd fmt-${FMT_VERSION} - mkdir build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DFMT_DOC=OFF -DFMT_TEST=OFF ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib fuse; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${LIBFUSE_TARBALL} - cd fuse-${LIBFUSE_VERSION} - mkdir build - cd build - meson setup .. --default-library=static --prefix="$INSTALL_DIR" - meson configure -D utils=false -D tests=false -D examples=false - meson setup --reconfigure .. - ninja - ninja install - fi - - if use_lib glog; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${GLOG_TARBALL} - cd glog-${GLOG_VERSION} - mkdir build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib benchmark; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${BENCHMARK_TARBALL} - cd benchmark-${BENCHMARK_VERSION} - mkdir build - cd build - cmake .. -DBENCHMARK_ENABLE_TESTING=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib xxhash; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${XXHASH_TARBALL} - cd xxHash-${XXHASH_VERSION} - make -j$(nproc) - make install PREFIX="$INSTALL_DIR" - fi - - if use_lib bzip2; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${BZIP2_TARBALL} - cd bzip2-${BZIP2_VERSION} - make -j$(nproc) - make PREFIX="$INSTALL_DIR" install - fi - - if use_lib brotli; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${BROTLI_TARBALL} - cd brotli-${BROTLI_VERSION} - mkdir build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib lz4; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${LZ4_TARBALL} - cd lz4-${LZ4_VERSION}/build/cmake - mkdir build - cd build - cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON ${CMAKE_ARGS} - make -j$(nproc) - make install - fi - - if use_lib xz; then - opt_size - 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 - make -j$(nproc) - make install - fi - - if use_lib zstd; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${ZSTD_TARBALL} - cd zstd-${ZSTD_VERSION} - mkdir meson-build - cd meson-build - meson setup ../build/meson --default-library=static --prefix="$INSTALL_DIR" - meson configure -D zlib=disabled -D lzma=disabled -D lz4=disabled - meson setup --reconfigure ../build/meson - ninja - ninja install - fi - - if use_lib openssl; then - opt_size - 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 \ - 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 \ - no-srp no-srtp no-ssl3-method no-ssl-trace no-tfo no-ts no-ui-console no-whirlpool no-fips-securitychecks \ - no-tests no-docs - - make -j$(nproc) - make install_sw - fi - - if use_lib libressl; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${LIBRESSL_TARBALL} - cd libressl-${LIBRESSL_VERSION} - ./configure --prefix="$INSTALL_DIR-libressl" --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 [[ -z "$LIBARCHIVE_PREFIXES" ]]; then - LIBARCHIVE_PREFIXES="$INSTALL_DIR" - fi - - for prefix in $LIBARCHIVE_PREFIXES; do + if use_lib libucontext; then opt_size - cd "$HOME/pkgs/$COMPILER" - rm -rf libarchive-${LIBARCHIVE_VERSION} - 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" \ - --without-iconv --without-xml2 --without-expat \ - --without-bz2lib --without-zlib \ - --disable-shared --disable-acl --disable-xattr \ - --disable-bsdtar --disable-bsdcat --disable-bsdcpio \ - --disable-bsdunzip + cd "$WORKDIR" + mkdir libucontext-${LIBUCONTEXT_VERSION} + tar xf ${WORKROOT}/${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 + cd "$WORKDIR" + tar xf ${WORKROOT}/${LIBUNWIND_TARBALL} + cd libunwind-${LIBUNWIND_VERSION} + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/master/main/libunwind/Remove-the-useless-endina.h-for-loongarch64.patch - | patch -p1 + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/master/main/libunwind/fix-libunwind-pc-in.patch - | patch -p1 + LDFLAGS="$LDFLAGS -lucontext" CFLAGS="$CFLAGS -fno-stack-protector" \ + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-cxx-exceptions --disable-tests --disable-shared make -j$(nproc) make install - done - fi + fi - if use_lib file; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${FILE_TARBALL} - cd file-${FILE_VERSION} - ./configure --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no - 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 flac; then - opt_perf - cd "$HOME/pkgs/$COMPILER" - tar xf ../${FLAC_TARBALL} - cd flac-${FLAC_VERSION} - ./configure --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 date; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${DATE_TARBALL} + cd date-${DATE_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + ninja + ninja install + fi - if use_lib cpptrace; then - opt_size - cd "$HOME/pkgs/$COMPILER" - tar xf ../${CPPTRACE_TARBALL} - cd cpptrace-${CPPTRACE_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 "$WORKDIR" + tar xf ${WORKROOT}/${UTFCPP_TARBALL} + cd utfcpp-${UTFCPP_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib boost; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${BOOST_TARBALL} + cd boost-${BOOST_VERSION} + mkdir build + cd build + 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_CHARCONV_QUADMATH_FOUND_EXITCODE=0 \ + -DBOOST_EXCLUDE_LIBRARIES=stacktrace ${BOOST_CMAKE_ARGS} \ + -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib jemalloc; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${JEMALLOC_TARBALL} + cd jemalloc-${JEMALLOC_VERSION} + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/abc0b4170e42e2a7d835e4490ecbae49e6f3d137/main/jemalloc/musl-exception-specification-errors.patch - | patch -p1 + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/abc0b4170e42e2a7d835e4490ecbae49e6f3d137/main/jemalloc/pkgconf.patch - | patch -p1 + ./autogen.sh ${TRIPLETS} + mkdir build-minimal + cd build-minimal + ../configure ${TRIPLETS} --prefix="$INSTALL_ROOT/$COMPILER-jemalloc-minimal/$TARGET" --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 ${TRIPLETS} --prefix="$INSTALL_ROOT/$COMPILER-jemalloc-full/$TARGET" --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 + + if use_lib mimalloc; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${MIMALLOC_TARBALL} + cd mimalloc-${MIMALLOC_VERSION} + mkdir build + cd build + cmake .. -DMI_LIBC_MUSL=ON -DMI_BUILD_SHARED=OFF -DMI_BUILD_OBJECT=OFF -DMI_BUILD_TESTS=OFF -DMI_OPT_ARCH=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib double-conversion; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${DOUBLE_CONVERSION_TARBALL} + cd double-conversion-${DOUBLE_CONVERSION_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib fmt; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${FMT_TARBALL} + cd fmt-${FMT_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DFMT_DOC=OFF -DFMT_TEST=OFF ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib fuse; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${LIBFUSE_TARBALL} + cd fuse-${LIBFUSE_VERSION} + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" \ + --disable-shared --enable-static \ + --disable-example --enable-lib --disable-util + make -j$(nproc) + make install + fi + + if use_lib fuse3; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${LIBFUSE3_TARBALL} + cd fuse-${LIBFUSE3_VERSION} + mkdir build + cd build + 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 + ninja install + fi + + if use_lib glog; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${GLOG_TARBALL} + cd glog-${GLOG_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib benchmark; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${BENCHMARK_TARBALL} + cd benchmark-${BENCHMARK_VERSION} + mkdir build + cd build + cmake .. -DBENCHMARK_ENABLE_TESTING=OFF -DBENCHMARK_ENABLE_WERROR=OFF -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib xxhash; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${XXHASH_TARBALL} + cd xxHash-${XXHASH_VERSION} + make -j$(nproc) + make install PREFIX="$INSTALL_DIR" + fi + + if use_lib bzip2; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${BZIP2_TARBALL} + cd bzip2-${BZIP2_VERSION} + make -j$(nproc) + make PREFIX="$INSTALL_DIR" install + fi + + if use_lib brotli; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${BROTLI_TARBALL} + cd brotli-${BROTLI_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBROTLI_BUILD_TOOLS=OFF -DBUILD_SHARED_LIBS=OFF ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib lz4; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${LZ4_TARBALL} + cd lz4-${LZ4_VERSION}/build/cmake + mkdir build + cd build + cmake .. -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DBUILD_SHARED_LIBS=OFF -DBUILD_STATIC_LIBS=ON ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib xz; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${XZ_TARBALL} + cd xz-${XZ_VERSION} + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --localstatedir=/var --sysconfdir=/etc \ + --disable-rpath --disable-werror --disable-doc --disable-shared --disable-nls \ + --disable-xz --disable-xzdec --disable-lzmainfo --disable-lzmadec \ + --disable-lzma-links --disable-scripts + make -j$(nproc) + make install + fi + + if use_lib zstd; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${ZSTD_TARBALL} + cd zstd-${ZSTD_VERSION} + mkdir meson-build + cd meson-build + meson setup ../build/meson --default-library=static --prefix="$INSTALL_DIR" $MESON_CROSS_FILE + meson configure -D bin_programs=false -D bin_contrib=false -D zlib=disabled -D lzma=disabled -D lz4=disabled + meson setup --reconfigure ../build/meson + ninja + ninja install + fi + + if use_lib openssl; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${OPENSSL_TARBALL} + cd openssl-${OPENSSL_VERSION} + ./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 \ + no-srp no-srtp no-ssl3-method no-ssl-trace no-tfo no-ts no-ui-console no-whirlpool no-fips-securitychecks \ + no-tests no-docs + + make -j$(nproc) build_libs + make install_dev + fi + + if use_lib libressl; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${LIBRESSL_TARBALL} + cd libressl-${LIBRESSL_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_PREFIX_PATH="$INSTALL_DIR" -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR_LIBRESSL" \ + -DBUILD_SHARED_LIBS=OFF -DLIBRESSL_APPS=OFF -DLIBRESSL_TESTS=OFF \ + ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib libevent; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${LIBEVENT_TARBALL} + cd libevent-${LIBEVENT_VERSION}-stable + fetch.sh 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 + ninja + ninja install + fi + + SSL_PREFIXES="" + if [ -d "$INSTALL_DIR_OPENSSL" ]; then + SSL_PREFIXES="$SSL_PREFIXES $INSTALL_DIR_OPENSSL" + fi + if [ -d "$INSTALL_DIR_LIBRESSL" ]; then + SSL_PREFIXES="$SSL_PREFIXES $INSTALL_DIR_LIBRESSL" + fi + if [[ -z "$SSL_PREFIXES" ]]; then + SSL_PREFIXES="$INSTALL_DIR" + fi + + if use_lib libarchive; then + for prefix in $SSL_PREFIXES; do + sslsuffix="" + if [[ "$prefix" == *libressl* ]]; then + sslsuffix="-libressl" + elif [[ "$prefix" == *openssl* ]]; then + sslsuffix="-openssl" + fi + opt_size + # This is safe because `opt_size` will re-initialize CFLAGS, CPPFLAGS, and LDFLAGS + export CFLAGS="-I$prefix/include $CFLAGS" + export CPPFLAGS="-I$prefix/include $CPPFLAGS" + export LDFLAGS="-L$prefix/lib $LDFLAGS -latomic" + cd "$WORKDIR" + rm -rf libarchive-${LIBARCHIVE_VERSION} + tar xf ${WORKROOT}/${LIBARCHIVE_TARBALL} + cd libarchive-${LIBARCHIVE_VERSION} + # TODO: once DwarFS supports ACLs / xattrs, we need to update this + ./configure ${TRIPLETS} --prefix="$prefix" \ + --without-iconv --without-xml2 --without-expat \ + --without-bz2lib --without-zlib \ + --disable-shared --disable-acl --disable-xattr \ + --disable-bsdtar --disable-bsdcat --disable-bsdcpio \ + --disable-bsdunzip + make -j$(nproc) + make install + done + fi + + if use_lib file; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${FILE_TARBALL} + cd file-${FILE_VERSION} + ./configure ${TRIPLETS} --prefix="$INSTALL_DIR" --enable-static=yes --enable-shared=no + make -j$(nproc) + make install + fi + + if use_lib flac; then + opt_perf + cd "$WORKDIR" + tar xf ${WORKROOT}/${FLAC_TARBALL} + cd flac-${FLAC_VERSION} + ./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 + for prefix in $SSL_PREFIXES; do + opt_size + # This is safe because `opt_size` will re-initialize CFLAGS, CPPFLAGS, and LDFLAGS + export CFLAGS="-isystem $prefix/include $CFLAGS" + export CPPFLAGS="-isystem $prefix/include $CPPFLAGS" + export LDFLAGS="-L$prefix/lib $LDFLAGS" + cd "$WORKDIR" + rm -rf libdwarf-${LIBDWARF_VERSION} + tar xf ${WORKROOT}/${LIBDWARF_TARBALL} + cd libdwarf-${LIBDWARF_VERSION} + mkdir meson-build + cd meson-build + meson setup .. --default-library=static --prefix="$prefix" $MESON_CROSS_FILE + # meson configure + # meson setup --reconfigure .. + ninja + ninja install + done + fi + + if use_lib cpptrace; then + for prefix in $SSL_PREFIXES; do + opt_size + # This is safe because `opt_size` will re-initialize CFLAGS, CPPFLAGS, and LDFLAGS + export CFLAGS="-isystem $prefix/include $CFLAGS" + export CPPFLAGS="-isystem $prefix/include $CPPFLAGS" + export LDFLAGS="-L$prefix/lib $LDFLAGS" + cd "$WORKDIR" + rm -rf cpptrace-${CPPTRACE_VERSION} + tar xf ${WORKROOT}/${CPPTRACE_TARBALL} + cd cpptrace-${CPPTRACE_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_PREFIX_PATH="$prefix;$INSTALL_DIR" -DCMAKE_INSTALL_PREFIX="$prefix" \ + -DCPPTRACE_USE_EXTERNAL_LIBDWARF=ON -DCPPTRACE_FIND_LIBDWARF_WITH_PKGCONFIG=ON \ + -DCPPTRACE_UNWIND_WITH_LIBUNWIND=ON -DCPPTRACE_GET_SYMBOLS_WITH_LIBDWARF=ON \ + ${CMAKE_ARGS} + ninja + ninja install + done + fi + + if use_lib range-v3; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${RANGE_V3_TARBALL} + cd range-v3-${RANGE_V3_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_PREFIX_PATH="$INSTALL_DIR" -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ + -DBUILD_SHARED_LIBS=OFF -DRANGE_V3_EXAMPLES=OFF -DRANGE_V3_TESTS=OFF \ + -DRANGE_V3_DOCS=OFF -DRANGES_BUILD_CALENDAR_EXAMPLE=OFF \ + -DRANGES_ENABLE_WERROR=OFF -DRANGES_NATIVE=OFF -DRANGES_DEBUG_INFO=OFF \ + ${CMAKE_ARGS} + ninja + ninja install + fi + + if use_lib parallel-hashmap; then + opt_size + cd "$WORKDIR" + tar xf ${WORKROOT}/${PARALLEL_HASHMAP_TARBALL} + cd parallel-hashmap-${PARALLEL_HASHMAP_VERSION} + mkdir build + cd build + cmake .. -DCMAKE_PREFIX_PATH="$INSTALL_DIR" -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" \ + -DBUILD_SHARED_LIBS=OFF -DPHMAP_BUILD_EXAMPLES=OFF -DPHMAP_BUILD_TESTS=OFF \ + ${CMAKE_ARGS} + ninja + ninja install + fi + done done cd "$HOME" rm -rf pkgs +rm -f /tmp/meson-*.txt diff --git a/.docker/install-toolchain.sh b/.docker/install-toolchain.sh new file mode 100644 index 00000000..68d59d4f --- /dev/null +++ b/.docker/install-toolchain.sh @@ -0,0 +1,219 @@ +#!/bin/bash + +set -ex + +ARCH="$(uname -m)" +OPTIMIZE_STR="${1:-2}" +TARGET_ARCH_STR="${2:-$ARCH}" + +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 + +cd "$HOME" +mkdir pkgs +cd pkgs + +fetch.sh https://mirror.netcologne.de/gnu/binutils/${BINUTILS_TARBALL} +fetch.sh https://ftp.gwdg.de/pub/misc/gcc/releases/gcc-${GCC_VERSION}/${GCC_TARBALL} +fetch.sh https://www.musl-libc.org/releases/${MUSL_TARBALL} +fetch.sh 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 + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/3.21-stable/main/gcc/$p - | patch -p1 +done +fetch.sh https://gcc.gnu.org/pipermail/gcc-patches/attachments/20250220/c6211b02/attachment.bin - | patch -p1 + +ORIGPATH="$PATH" + +export CC="/usr/bin/ccache /usr/bin/gcc" +export CXX="/usr/bin/ccache /usr/bin/g++" +export LD="/usr/bin/ld" + +for target_arch in ${TARGET_ARCH_STR//,/ }; do + for OPT in ${OPTIMIZE_STR//,/ }; do + echo "===========================================================" + echo "Building for target architecture: $target_arch (-O${OPT})" + echo "===========================================================" + + export TARGETARCH="$target_arch" + + TARGET="${TARGETARCH}-alpine-linux-musl" + + CARCH="$TARGETARCH" + case "$TARGETARCH" in + aarch64*) CARCH="arm64" ;; + arm*) CARCH="arm" ;; + mips*) CARCH="mips" ;; + s390*) CARCH="s390" ;; + ppc*) CARCH="powerpc" ;; + riscv*) CARCH="riscv" ;; + loongarch*) CARCH="loongarch" ;; + esac + + case "$TARGETARCH" in + i386) + GCC_CONFIGURE_ARGS="--with-arch=i486 --with-tune=generic" + ;; + aarch64*) + GCC_CONFIGURE_ARGS="--with-arch=armv8-a --with-abi=lp64" + ;; + arm*) + GCC_CONFIGURE_ARGS="--with-arch=armv6 --with-fpu=vfp --with-float=hard" + TARGET="arm-linux-musleabihf" + ;; + s390x) + GCC_CONFIGURE_ARGS="--with-arch=z10" + ;; + *) + GCC_CONFIGURE_ARGS="" + ;; + esac + + export CFLAGS="-O${OPT} -ffunction-sections -fdata-sections -fmerge-all-constants -fPIC" + export CXXFLAGS="$CFLAGS" + export LDFLAGS="-Wl,--gc-sections" + + SYSROOT="/opt/cross/O${OPT}" + PREFIX="$SYSROOT/usr" + PATH="$PREFIX/bin:$ORIGPATH" + + GCC_NODOCS="MAKEINFO=/bin/true gcc_cv_prog_makeinfo_modern=no HELP2MAN=/bin/true TEXI2POD=/bin/true POD2MAN=/bin/true" + + # Stage 1 + cd "${HOME}"/pkgs + + mkdir binutils-${BINUTILS_VERSION}-build-${TARGETARCH}-O${OPT} + cd binutils-${BINUTILS_VERSION}-build-${TARGETARCH}-O${OPT} + + "$HOME"/pkgs/binutils-${BINUTILS_VERSION}/configure \ + --target=$TARGET --program-prefix="$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/$TARGET headers_install + + if [[ "$TARGETARCH" != "$ARCH" ]]; then + cd "$HOME"/pkgs + mkdir gcc-${GCC_VERSION}-build-${TARGETARCH}-O${OPT}-stage1 + cd gcc-${GCC_VERSION}-build-${TARGETARCH}-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++ ${GCC_NODOCS} + make -j"$(nproc)" all-gcc ${GCC_NODOCS} + make -j"$(nproc)" all-target-libgcc ${GCC_NODOCS} + make install-gcc + make install-target-libgcc + MUSL_CC="${TARGET}-gcc" + else + MUSL_CC="gcc" + fi + + cd "$HOME"/pkgs + rm -rf musl-${MUSL_VERSION} + tar xf ${MUSL_TARBALL} + cd musl-${MUSL_VERSION} + fetch.sh https://gitlab.alpinelinux.org/alpine/aports/-/raw/3.22-stable/main/musl/__stack_chk_fail_local.c + ${MUSL_CC} $CFLAGS -c __stack_chk_fail_local.c -o __stack_chk_fail_local.o + ${TARGET}-ar r libssp_nonshared.a __stack_chk_fail_local.o + ./configure --prefix=$PREFIX/$TARGET --target=$TARGET CC=$MUSL_CC + make install-headers + make -j"$(nproc)" + make install + cp libssp_nonshared.a $PREFIX/$TARGET/lib/ + + if [[ "$TARGETARCH" == "$ARCH" ]]; then + # Fix for aarch64 build: rsync musl headers to native sysroot + rsync -av $PREFIX/$TARGET/include/ $PREFIX/include/ + rsync -av $PREFIX/$TARGET/lib/ $PREFIX/lib/ + fi + + # Stage 2 + cd "$HOME"/pkgs + mkdir gcc-${GCC_VERSION}-build-${TARGETARCH}-O${OPT}-final + cd gcc-${GCC_VERSION}-build-${TARGETARCH}-O${OPT}-final + + "$HOME"/pkgs/gcc-${GCC_VERSION}/configure \ + --target=$TARGET --prefix=$PREFIX --with-sysroot=$SYSROOT ${GCC_CONFIGURE_ARGS} \ + --with-gmp=/usr --with-mpfr=/usr --with-mpc=/usr \ + --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 --enable-checking=release --disable-cet --disable-fixed-point \ + --enable-libstdcxx-time=yes --enable-default-pie --enable-default-ssp --with-linker-hash-style=gnu ${GCC_NODOCS} + make -j"$(nproc)" ${GCC_NODOCS} + make install + + # Directory for ccache symlinks + mkdir -p $PREFIX/lib/ccache/bin + + # Symbolic links for clang + for clang_binary in /usr/bin/clang{++,}{-[1-9]*,}; do + name=$(basename $clang_binary) + ln -s $clang_binary $PREFIX/bin/$TARGET-$name + ln -s /usr/bin/ccache $PREFIX/lib/ccache/bin/$TARGET-$name + done + + # Also provide ccache symlinks for gcc + for gcc_binary in $PREFIX/bin/$TARGET-{c++,g++,gcc,gcc-[1-9]*}; do + name=$(basename $gcc_binary) + ln -s /usr/bin/ccache $PREFIX/lib/ccache/bin/$name + done + done +done + +cd "$HOME" +rm -rf pkgs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 991a44ea..79fa6623 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -108,143 +108,222 @@ jobs: strategy: matrix: - arch: - - amd64 - - arm64v8 - dist: - - ubuntu - - fedora - - arch - build_type: - - gcc-debug-shared-ninja-full - - gcc-release-ninja-split - - gcc-release-shared-ninja-split - - clang-release-shared-ninja-full - exclude: - - arch: arm64v8 - dist: arch - build_type: gcc-debug-shared-ninja-full - - arch: arm64v8 - dist: arch - build_type: gcc-release-ninja-split - - arch: arm64v8 - dist: arch - build_type: gcc-release-shared-ninja-split - - arch: arm64v8 - dist: arch - build_type: clang-release-shared-ninja-full - - arch: arm64v8 - dist: ubuntu - build_type: gcc-release-ninja-split - - arch: arm64v8 - dist: ubuntu - build_type: gcc-release-shared-ninja-split - - arch: arm64v8 - dist: fedora - build_type: gcc-release-ninja-split - - arch: arm64v8 - dist: fedora - build_type: gcc-release-shared-ninja-split include: - - arch: amd64 - dist: debian - build_type: gcc-release-make-full - - arch: amd64 - dist: debian - build_type: clang-debug-shared-ninja-split - - arch: amd64 - dist: ubuntu - build_type: clang-reldbg-shared-asan-ninja - - arch: amd64 - dist: ubuntu - build_type: clang-debug-shared-tsan-ninja - - arch: amd64 - dist: ubuntu - build_type: clang-reldbg-shared-ubsan-ninja - - arch: amd64 - dist: ubuntu - build_type: oldgcc-debug-shared-make-split - - arch: amd64 - dist: ubuntu - build_type: gcc-debug-shared-noperfmon-ninja-split - - arch: amd64 - dist: ubuntu - build_type: oldclang-debug-shared-make-split - - arch: amd64 - dist: ubuntu-2204 + - build_arch: amd64 + build_dist: ubuntu + build_type: gcc-release-ninja-split + + - build_arch: amd64 + build_dist: ubuntu build_type: gcc-release-shared-ninja-split - - arch: amd64 - dist: ubuntu-2204 + + - build_arch: amd64 + build_dist: ubuntu build_type: gcc-debug-shared-ninja-full - - arch: amd64 - dist: ubuntu-2204 - build_type: clang-release-ninja-split - - arch: amd64 - dist: ubuntu + + - build_arch: amd64 + build_dist: ubuntu + build_type: gcc-debug-shared-noperfmon-ninja-split + + - build_arch: amd64 + build_dist: ubuntu + build_type: clang-release-shared-ninja-full + + - build_arch: amd64 + build_dist: ubuntu + build_type: clang-reldbg-shared-asan-ninja + + - build_arch: amd64 + build_dist: ubuntu + build_type: clang-reldbg-shared-ubsan-ninja + + - build_arch: amd64 + build_dist: ubuntu + build_type: clang-debug-shared-tsan-ninja + + - build_arch: amd64 + build_dist: ubuntu build_type: clang-debug-coverage-ninja - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: ubuntu + build_type: oldgcc-debug-shared-make-split + + - build_arch: amd64 + build_dist: ubuntu + build_type: oldclang-debug-shared-make-split + + - build_arch: amd64 + build_dist: ubuntu-2204 + build_type: gcc-release-shared-ninja-split + + - build_arch: amd64 + build_dist: ubuntu-2204 + build_type: gcc-debug-shared-ninja-full + + - build_arch: amd64 + build_dist: ubuntu-2204 + build_type: clang-release-ninja-split + + - build_arch: amd64 + build_dist: fedora + build_type: gcc-release-ninja-split + + - build_arch: amd64 + build_dist: fedora + build_type: gcc-release-shared-ninja-split + + - build_arch: amd64 + build_dist: fedora + build_type: gcc-debug-shared-ninja-full + + - build_arch: amd64 + build_dist: fedora + build_type: clang-release-shared-ninja-full + + - build_arch: amd64 + build_dist: arch + build_type: gcc-release-ninja-split + + - build_arch: amd64 + build_dist: arch + build_type: gcc-release-shared-ninja-split + + - build_arch: amd64 + build_dist: arch + build_type: gcc-debug-shared-ninja-full + + - build_arch: amd64 + build_dist: arch + build_type: clang-release-shared-ninja-full + + - build_arch: amd64 + build_dist: debian + build_type: gcc-release-make-full + + - build_arch: amd64 + build_dist: debian + build_type: clang-debug-shared-ninja-split + + - build_arch: amd64 + build_dist: alpine build_type: gcc-release-ninja-static - - arch: arm64v8 - dist: alpine - build_type: gcc-release-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-release-ninja-static - - arch: arm64v8 - dist: alpine - build_type: clang-release-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-lto-ninja-static - - arch: arm64v8 - dist: alpine - build_type: clang-relsize-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-libressl-lto-ninja-static - - arch: arm64v8 - dist: alpine - build_type: clang-relsize-libressl-lto-ninja-static - - arch: riscv64 - dist: alpine - build_type: clang-relsize-libressl-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-minimal-lto-ninja-static - - arch: arm64v8 - dist: alpine - build_type: clang-relsize-minimal-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-minimal-libressl-lto-ninja-static - # - arch: arm64v8 - # dist: alpine - # build_type: clang-relsize-minimal-libressl-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-minimal-mimalloc-lto-ninja-static - - arch: arm64v8 - dist: alpine - build_type: clang-relsize-minimal-mimalloc-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-relsize-minimal-mimalloc-libressl-lto-ninja-static - # - arch: arm64v8 - # dist: alpine - # build_type: clang-relsize-minimal-mimalloc-libressl-lto-ninja-static - - arch: amd64 - dist: alpine + + - build_arch: amd64 + build_dist: alpine build_type: clang-reldbg-stacktrace-ninja-static - - arch: arm64v8 - dist: alpine + + - build_arch: arm64v8 + build_dist: ubuntu + build_type: gcc-debug-shared-ninja-full + + - build_arch: arm64v8 + build_dist: ubuntu + build_type: clang-release-shared-ninja-full + + - build_arch: arm64v8 + build_dist: fedora + build_type: gcc-debug-shared-ninja-full + + - build_arch: arm64v8 + build_dist: fedora + build_type: clang-release-shared-ninja-full + + - build_arch: arm64v8 + build_dist: alpine + build_type: gcc-release-ninja-static + + - build_arch: arm64v8 + build_dist: alpine + build_type: clang-release-ninja-static + + - build_arch: arm64v8 + build_dist: alpine + build_type: clang-relsize-lto-ninja-static + + - build_arch: arm64v8 + build_dist: alpine + build_type: clang-relsize-libressl-lto-ninja-static + + - build_arch: arm64v8 + build_dist: alpine + build_type: clang-relsize-minimal-lto-ninja-static + + - build_arch: arm64v8 + build_dist: alpine + build_type: clang-relsize-minimal-mimalloc-lto-ninja-static + + - build_arch: arm64v8 + build_dist: alpine build_type: clang-reldbg-stacktrace-ninja-static + - build_arch: riscv64 + build_dist: debian + build_type: gcc-release-ninja-full + + - build_arch: riscv64 + build_dist: ubuntu + build_type: clang-debug-shared-ninja-split + + - build_arch: amd64 + build_dist: alpine + build_type: clang-relsize-libressl-lto-ninja-static + cross_arch: aarch64 + + - build_arch: amd64 + build_dist: alpine + build_type: clang-relsize-libressl-lto-ninja-static + cross_arch: riscv64 + + - build_arch: amd64 + build_dist: alpine + build_type: clang-relsize-libressl-lto-ninja-static + cross_arch: i386 + + - build_arch: amd64 + build_dist: alpine + build_type: clang-relsize-libressl-lto-ninja-static + cross_arch: arm + + - build_arch: amd64 + build_dist: alpine + build_type: gcc-release-ninja-static + cross_arch: ppc64le + uses: ./.github/workflows/docker-run-build.yml with: build_type: ${{ matrix.build_type }} - build_arch: ${{ matrix.arch }} - build_dist: ${{ matrix.dist }} + build_arch: ${{ matrix.build_arch }} + build_dist: ${{ matrix.build_dist }} + cross_arch: ${{ matrix.cross_arch }} build_from_tarball: true upload_coverage: ${{ matrix.build_type == 'clang-debug-coverage-ninja' }} upload_artifacts: ${{ endsWith(matrix.build_type, '-static') }} diff --git a/.github/workflows/docker-run-build.yml b/.github/workflows/docker-run-build.yml index 7c75c8c2..34fa2337 100644 --- a/.github/workflows/docker-run-build.yml +++ b/.github/workflows/docker-run-build.yml @@ -10,6 +10,10 @@ on: build_arch: required: true type: string + cross_arch: + required: false + type: string + default: '' build_dist: required: true type: string @@ -47,12 +51,15 @@ jobs: fetch-depth: '0' ref: ${{ github.ref }} + # Only if inputs.build_arch is `amd64`, we want to build a cross-compiling + # container by setting TARGET_ARCHS. Otherwise, don't set TARGET_ARCHS. - name: Build Docker Image run: | - docker build \ + docker buildx build --progress=plain \ -f .docker/Dockerfile.${{ inputs.build_dist }} \ -t dwarfs-linux-build-${{ inputs.build_dist }} \ --build-arg ARCH=${{ inputs.build_arch }} \ + ${{ inputs.build_arch == 'amd64' && '--build-arg TARGET_ARCHS=x86_64,aarch64,riscv64,ppc64le,s390x,arm,i386' || '' }} \ .docker - name: Run Build @@ -67,6 +74,7 @@ jobs: ${{ inputs.build_from_tarball && '--env BUILD_FROM_TARBALL=1' || '' }} \ --env BUILD_TYPE=${{ inputs.build_type }} \ --env BUILD_ARCH=${{ inputs.build_arch }} \ + --env CROSS_ARCH=${{ inputs.cross_arch }} \ --env BUILD_DIST=${{ inputs.build_dist }} \ --env GITHUB_REF_NAME \ --env GITHUB_REF_TYPE \ diff --git a/.maintainer-scripts/workflow-tracing.py b/.maintainer-scripts/workflow-tracing.py index 457fde9f..b5ee249d 100644 --- a/.maintainer-scripts/workflow-tracing.py +++ b/.maintainer-scripts/workflow-tracing.py @@ -136,10 +136,11 @@ def main(): if args.ninja and step.get("name") == "Run Build": run_id = job.get("run_id", 0) # get arch, dist, config from "linux (arm64v8, alpine, clang-release-ninja-static) / docker-build" - m = re.match(r"linux \(([^,]+), ([^,]+), ([^,]+)\)", name) + m = re.match(r"linux \(([^,]+), ([^,]+), ([^,]+)(, ([^,]+))?\)", name) if m: - build_log_path = f"{args.log_base}/{run_id}/build-{m.group(1)},{m.group(2)},{m.group(3)}.log" - ninja_log_path = f"{args.log_base}/{run_id}/ninja-{m.group(1)},{m.group(2)},{m.group(3)}.log" + cross = m.group(5) if m.group(5) else "" + build_log_path = f"{args.log_base}/{run_id}/build-{m.group(1)},{cross},{m.group(2)},{m.group(3)}.log" + ninja_log_path = f"{args.log_base}/{run_id}/ninja-{m.group(1)},{cross},{m.group(2)},{m.group(3)}.log" build_events = {} if os.path.exists(build_log_path): with open(build_log_path, "r") as f: diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ae18a30..71ec300b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,17 +140,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules") find_package(PkgConfig) if(STATIC_BUILD_DO_NOT_USE) - # Strangely this is needed when linking statically against FLAC++ - #add_compile_options(-fno-omit-frame-pointer) - - if(STATIC_BUILD_EXTRA_PREFIX) - foreach (prefix ${STATIC_BUILD_EXTRA_PREFIX}) - include_directories(BEFORE ${prefix}/include) - endforeach() - list(PREPEND CMAKE_PREFIX_PATH ${STATIC_BUILD_EXTRA_PREFIX}) - set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON) - endif() - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" CACHE STRING "please look for static libs") @@ -991,7 +980,11 @@ if(STATIC_BUILD_DO_NOT_USE OR APPLE) if(APPLE) add_custom_target(strip COMMAND strip ${FILES_TO_STRIP}) else() - add_custom_target(strip COMMAND strip $,--strip-debug,--strip-all> ${FILES_TO_STRIP}) + set(STRIP_TOOL strip) + if(DEFINED ENV{STRIP_TOOL}) + set(STRIP_TOOL $ENV{STRIP_TOOL}) + endif() + add_custom_target(strip COMMAND ${STRIP_TOOL} $,--strip-debug,--strip-all> ${FILES_TO_STRIP}) endif() endif() endif() @@ -1018,6 +1011,9 @@ endif() if(DWARFS_ARTIFACT_SUFFIX) set(DWARFS_ARTIFACT_ID "${DWARFS_ARTIFACT_ID}${DWARFS_ARTIFACT_SUFFIX}") endif() +if(CMAKE_CROSSCOMPILING) + set(DWARFS_ARTIFACT_ID "${DWARFS_ARTIFACT_ID}-cross-${CMAKE_HOST_SYSTEM_PROCESSOR}") +endif() if(STATIC_BUILD_DO_NOT_USE OR WIN32) if(TARGET dwarfsuniversal) @@ -1043,7 +1039,7 @@ if(STATIC_BUILD_DO_NOT_USE OR WIN32) WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) else() - if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i386|x86_64|AMD64|aarch64)$") + if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^(i386|x86_64|AMD64|aarch64|ppc64le|arm)$") find_program(UPX_EXE upx upx.exe PATHS "c:/bin" DOC "ultimate packer for executables") endif()