Skip to content

Update zig.

Update zig. #501

# Copyright (C) Markus Franz Xaver Johannes Oberhumer
# for current target status see https://github.com/ziglang/zig-bootstrap/
# also see: zig targets | jq '.["libc"]'
# 115 build-on-linux targets (jobs)
# 9 build-on-macos targets (jobs)
#
# All linux-musl targets also perform exhaustive
# runtime tests using QEMU.
# All i386-windows and x86_64-windows targets also perform exhaustive
# runtime tests using Wine.
name: 'Build UPX with zig cc'
on: [push, workflow_dispatch]
env:
CMAKE_REQUIRED_QUIET: 'OFF'
CMAKE_VERBOSE_MAKEFILE: 'ON'
CTEST_OUTPUT_ON_FAILURE: 'ON'
DEBIAN_FRONTEND: noninteractive
NO_COLOR: 1
UPX_CMAKE_BUILD_FLAGS: --verbose
UPX_CMAKE_CONFIG_FLAGS: -Wdev --warn-uninitialized
UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1
UPX_DEBUG_TEST_LIBC_QSORT: 1
ZSTD_CLEVEL: 17
# for upx.git cloning:
REMOTE_REF_NAME: test-threads
REMOTE_REPOSITORY: upx/upx-test-threads
REMOTE_SERVER_URL: https://github.com
# 2025-02-05
ZIG_DIST_VERSION: 0.14.0-dev.3046+08d661fcf
jobs:
job-build-on-linux:
if: github.repository_owner == 'upx'
name: ${{ format('{0} {1}', matrix.zig_target, matrix.zig_pic) }}
runs-on: ubuntu-latest
container: 'alpine:edge'
strategy:
fail-fast: false
matrix:
include:
# Linux musl (statically linked, can use qemu-user for testing)
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64 }
- { zig_target: aarch64-linux-musl, qemu: qemu-aarch64, zig_pic: -fPIE }
- { zig_target: aarch64_be-linux-musl, qemu: qemu-aarch64_be, tt: UPX-UNSUPPORTED }
- { zig_target: aarch64_be-linux-musl, qemu: qemu-aarch64_be, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: arm-linux-musleabi, qemu: qemu-arm }
- { zig_target: arm-linux-musleabi, qemu: qemu-arm, zig_pic: -fPIE }
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm }
- { zig_target: arm-linux-musleabihf, qemu: qemu-arm, zig_pic: -fPIE }
- { zig_target: armeb-linux-musleabi, qemu: qemu-armeb, UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 0 }
- { zig_target: armeb-linux-musleabi, qemu: qemu-armeb, zig_pic: -fPIE, UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 0 }
- { zig_target: armeb-linux-musleabihf, qemu: qemu-armeb }
- { zig_target: armeb-linux-musleabihf, qemu: qemu-armeb, zig_pic: -fPIE }
- { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386 }
- { zig_target: i386-linux-musl, zig_flags: -march=i586, qemu: qemu-i386, zig_pic: -fPIE }
- { zig_target: loongarch64-linux-musl, qemu: qemu-loongarch64, tt: UPX-UNSUPPORTED }
- { zig_target: loongarch64-linux-musl, qemu: qemu-loongarch64, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
# { zig_target: m68k-linux-musl, qemu: qemu-m68k, tt: UPX-UNSUPPORTED }
# { zig_target: m68k-linux-musl, qemu: qemu-m68k, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: mips-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mips }
- { zig_target: mips-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mips, zig_pic: -fPIE }
- { zig_target: mips-linux-musleabihf, qemu: qemu-mips }
- { zig_target: mips-linux-musleabihf, qemu: qemu-mips, zig_pic: -fPIE }
- { zig_target: mipsel-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mipsel }
- { zig_target: mipsel-linux-musleabi, zig_flags: -msoft-float, qemu: qemu-mipsel, zig_pic: -fPIE }
- { zig_target: mipsel-linux-musleabihf, qemu: qemu-mipsel }
- { zig_target: mipsel-linux-musleabihf, qemu: qemu-mipsel, zig_pic: -fPIE }
- { zig_target: mips64-linux-muslabi64, qemu: qemu-mips64, tt: UPX-UNSUPPORTED }
- { zig_target: mips64-linux-muslabi64, qemu: qemu-mips64, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
# { zig_target: mips64-linux-muslabi64, zig_flags: -msoft-float, qemu: qemu-mips64, tt: UPX-UNSUPPORTED }
# { zig_target: mips64-linux-muslabi64, zig_flags: -msoft-float, qemu: qemu-mips64, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: mips64el-linux-muslabi64, qemu: qemu-mips64el, tt: UPX-UNSUPPORTED }
- { zig_target: mips64el-linux-muslabi64, qemu: qemu-mips64el, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
# { zig_target: mips64el-linux-muslabi64, zig_flags: -msoft-float, qemu: qemu-mips64el, tt: UPX-UNSUPPORTED }
# { zig_target: mips64el-linux-muslabi64, zig_flags: -msoft-float, qemu: qemu-mips64el, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: powerpc-linux-musleabi, qemu: qemu-ppc }
- { zig_target: powerpc-linux-musleabi, qemu: qemu-ppc, zig_pic: -fPIE }
- { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc }
- { zig_target: powerpc-linux-musleabihf, qemu: qemu-ppc, zig_pic: -fPIE }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64 }
- { zig_target: powerpc64-linux-musl, qemu: qemu-ppc64, zig_pic: -fPIE }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le }
- { zig_target: powerpc64le-linux-musl, qemu: qemu-ppc64le, zig_pic: -fPIE }
- { zig_target: riscv32-linux-musl, qemu: qemu-riscv32, tt: UPX-UNSUPPORTED }
- { zig_target: riscv32-linux-musl, qemu: qemu-riscv32, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: riscv64-linux-musl, qemu: qemu-riscv64, tt: UPX-UNSUPPORTED }
- { zig_target: riscv64-linux-musl, qemu: qemu-riscv64, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: s390x-linux-musl, qemu: qemu-s390x, tt: UPX-UNSUPPORTED }
- { zig_target: s390x-linux-musl, qemu: qemu-s390x, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: thumb-linux-musleabi, qemu: qemu-arm }
- { zig_target: thumb-linux-musleabi, qemu: qemu-arm, zig_pic: -fPIE }
- { zig_target: thumb-linux-musleabihf, qemu: qemu-arm }
- { zig_target: thumb-linux-musleabihf, qemu: qemu-arm, zig_pic: -fPIE }
- { zig_target: thumbeb-linux-musleabi, qemu: qemu-armeb }
- { zig_target: thumbeb-linux-musleabi, qemu: qemu-armeb, zig_pic: -fPIE }
- { zig_target: thumbeb-linux-musleabihf, qemu: qemu-armeb }
- { zig_target: thumbeb-linux-musleabihf, qemu: qemu-armeb, zig_pic: -fPIE }
- { zig_target: x86_64-linux-musl, qemu: qemu-x86_64 }
- { zig_target: x86_64-linux-musl, qemu: qemu-x86_64, zig_pic: -fPIE }
# Linux GNU (glibc)
- { zig_target: aarch64-linux-gnu }
- { zig_target: aarch64_be-linux-gnu }
# { zig_target: arc-linux-gnu }
- { zig_target: arm-linux-gnueabi }
- { zig_target: arm-linux-gnueabihf }
- { zig_target: armeb-linux-gnueabi }
- { zig_target: armeb-linux-gnueabihf }
# { zig_target: csky-linux-gnueabi }
# { zig_target: csky-linux-gnueabihf }
- { zig_target: i386-linux-gnu }
- { zig_target: i386-linux-gnu.2.3.4, UPX_CONFIG_DISABLE_SHARED_LIBS: 'ON' } # RHEL 4
- { zig_target: i386-linux-gnu.2.5 } # RHEL 5, manylinux1
- { zig_target: i386-linux-gnu.2.12 } # RHEL 6, manylinux2010
- { zig_target: i386-linux-gnu.2.17 } # RHEL 7, manylinux2014
- { zig_target: i386-linux-gnu.2.40 } # latest glibc version supported by zig
# { zig_target: loongarch32-linux-gnu }
- { zig_target: loongarch64-linux-gnu }
# { zig_target: m68k-linux-gnu }
- { zig_target: mips-linux-gnueabi }
- { zig_target: mips-linux-gnueabihf }
- { zig_target: mipsel-linux-gnueabi }
- { zig_target: mipsel-linux-gnueabihf }
- { zig_target: mips64-linux-gnuabi64 }
- { zig_target: mips64el-linux-gnuabi64 }
- { zig_target: powerpc-linux-gnueabi }
- { zig_target: powerpc-linux-gnueabihf }
- { zig_target: powerpc-linux-gnueabihf.2.11 } # SLES 11, Fedora 12
- { zig_target: powerpc64-linux-gnu } # zig problem: currently FAILS; PRIORITY 1
- { zig_target: powerpc64-linux-gnu.2.11 } # SLES 11, Fedora 12; TODO later
- { zig_target: powerpc64le-linux-gnu }
- { zig_target: riscv32-linux-gnu }
- { zig_target: riscv64-linux-gnu }
- { zig_target: s390x-linux-gnu }
# { zig_target: sparc-linux-gnu }
# { zig_target: sparc64-linux-gnu }
- { zig_target: x86_64-linux-gnu }
- { zig_target: x86_64-linux-gnu.2.3.4 } # RHEL 4
- { zig_target: x86_64-linux-gnu.2.5 } # RHEL 5, manylinux1
- { zig_target: x86_64-linux-gnu.2.12 } # RHEL 6, manylinux2010
- { zig_target: x86_64-linux-gnu.2.17 } # RHEL 7, manylinux2014
- { zig_target: x86_64-linux-gnu.2.40 } # latest glibc version supported by zig
# Linux ILP32 on 64-bit archs
- { zig_target: mips64-linux-gnuabin32 }
- { zig_target: mips64-linux-muslabin32, qemu: qemu-mipsn32, tt: UPX-UNSUPPORTED }
- { zig_target: mips64-linux-muslabin32, qemu: qemu-mipsn32, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: mips64el-linux-gnuabin32 }
- { zig_target: mips64el-linux-muslabin32, qemu: qemu-mipsn32el, tt: UPX-UNSUPPORTED }
- { zig_target: mips64el-linux-muslabin32, qemu: qemu-mipsn32el, tt: UPX-UNSUPPORTED, zig_pic: -fPIE }
- { zig_target: x86_64-linux-gnux32 }
- { zig_target: x86_64-linux-muslx32 }
- { zig_target: x86_64-linux-muslx32, zig_pic: -fPIE }
# Windows (can use Wine for testing); also see https://github.com/mstorsjo/llvm-mingw
- { zig_target: aarch64-windows-gnu }
# { zig_target: arm-windows-gnu } # NOT WORKING: https://github.com/ziglang/zig-bootstrap/issues/105
# TODO later: UPX problem: fix i386-windows need for UPX_CONFIG_DISABLE_RUN_PACKED_TEST
- { zig_target: i386-windows-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
# { zig_target: i386-windows.xp-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
# { zig_target: i386-windows.vista-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
- { zig_target: i386-windows.win7-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
- { zig_target: i386-windows.win8-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
- { zig_target: i386-windows.win10-gnu, wine: wine32, UPX_CONFIG_DISABLE_RUN_PACKED_TEST: 'ON' }
- { zig_target: thumb-windows-gnu }
- { zig_target: x86_64-windows-gnu, wine: wine64 }
# { zig_target: x86_64-windows.xp-gnu, wine: wine64 }
- { zig_target: x86_64-windows.vista-gnu, wine: wine64 }
- { zig_target: x86_64-windows.win7-gnu, wine: wine64 }
- { zig_target: x86_64-windows.win8-gnu, wine: wine64 }
- { zig_target: x86_64-windows.win10-gnu, wine: wine64 }
# macOS
- { zig_target: aarch64-macos-none }
- { zig_target: aarch64-macos.11.0-none }
- { zig_target: aarch64-macos.12.0-none }
- { zig_target: aarch64-macos.13.0-none }
- { zig_target: x86_64-macos-none }
- { zig_target: x86_64-macos.11.0-none }
- { zig_target: x86_64-macos.12.0-none }
- { zig_target: x86_64-macos.13.0-none }
# wasm/WebAssembly (TODO later: can use Wasmtime for testing?)
- { zig_target: wasm32-wasi-musl, zig_flags: -Wno-macro-redefined -DDOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS -DDOCTEST_CONFIG_NO_POSIX_SIGNALS -DHAVE_SETJMP_H=0 -DHAVE_SIGNAL_H=0 -DHAVE_CHMOD=0 -DHAVE_CHOWN=0 -DHAVE_DUP=0, UPX_CONFIG_DISABLE_SANITIZE: 'ON', UPX_CONFIG_DISABLE_SHARED_LIBS: 'ON', UPX_CONFIG_EXPECT_THREADS: 'OFF' }
# just for testing: MIPS extra -march tests
# - mips32 is based on mips2; it looks like mips32 is the default arch for zig
# - mips1 is experimental (not fully supported) by clang/llvm
# - mips32r4 is not supported by clang/llvm/gcc
# - zig bug: mips3 and mips4 do not work (need extra flags)
# - zig bug: mips32r6 needs UPX_CONFIG_DISABLE_SAVE_TEMPS
# ====== working
# { zig_target: mips2-linux-musl, zig_flags: -march=mips2, qemu: qemu-mips }
# { zig_target: mips2-linux-muslsf, zig_flags: -march=mips2 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel2-linux-musl, zig_flags: -march=mips2, qemu: qemu-mipsel }
# { zig_target: mipsel2-linux-muslsf, zig_flags: -march=mips2 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips32-linux-musl, zig_flags: -march=mips32, qemu: qemu-mips }
# { zig_target: mips32-linux-muslsf, zig_flags: -march=mips32 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel32-linux-musl, zig_flags: -march=mips32, qemu: qemu-mipsel }
# { zig_target: mipsel32-linux-muslsf, zig_flags: -march=mips32 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips32r2-linux-musl, zig_flags: -march=mips32r2, qemu: qemu-mips }
# { zig_target: mips32r2-linux-muslsf, zig_flags: -march=mips32r2 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel32r2-linux-musl, zig_flags: -march=mips32r2, qemu: qemu-mipsel }
# { zig_target: mipsel32r2-linux-muslsf, zig_flags: -march=mips32r2 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips32r3-linux-musl, zig_flags: -march=mips32r3, qemu: qemu-mips }
# { zig_target: mips32r3-linux-muslsf, zig_flags: -march=mips32r3 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel32r3-linux-musl, zig_flags: -march=mips32r3, qemu: qemu-mipsel }
# { zig_target: mipsel32r3-linux-muslsf, zig_flags: -march=mips32r3 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips32r5-linux-musl, zig_flags: -march=mips32r5, qemu: qemu-mips }
# { zig_target: mips32r5-linux-muslsf, zig_flags: -march=mips32r5 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel32r5-linux-musl, zig_flags: -march=mips32r5, qemu: qemu-mipsel }
# { zig_target: mipsel32r5-linux-muslsf, zig_flags: -march=mips32r5 -msoft-float, qemu: qemu-mipsel }
# ====== these currently do not work with zig
# { zig_target: mips3-linux-musl, zig_flags: -march=mips3, qemu: qemu-mips }
# { zig_target: mips3-linux-muslsf, zig_flags: -march=mips3 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel3-linux-musl, zig_flags: -march=mips3, qemu: qemu-mipsel }
# { zig_target: mipsel3-linux-muslsf, zig_flags: -march=mips3 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips4-linux-musl, zig_flags: -march=mips4, qemu: qemu-mips }
# { zig_target: mips4-linux-muslsf, zig_flags: -march=mips4 -msoft-float, qemu: qemu-mips }
# { zig_target: mipsel4-linux-musl, zig_flags: -march=mips4, qemu: qemu-mipsel }
# { zig_target: mipsel4-linux-muslsf, zig_flags: -march=mips4 -msoft-float, qemu: qemu-mipsel }
# { zig_target: mips32r6-linux-musl, zig_flags: -march=mips32r6, qemu: qemu-mips, UPX_CONFIG_DISABLE_SAVE_TEMPS: 'ON' }
# { zig_target: mips32r6-linux-muslsf, zig_flags: -march=mips32r6 -msoft-float, qemu: qemu-mips, UPX_CONFIG_DISABLE_SAVE_TEMPS: 'ON' }
# { zig_target: mipsel32r6-linux-musl, zig_flags: -march=mips32r6, qemu: qemu-mipsel, UPX_CONFIG_DISABLE_SAVE_TEMPS: 'ON' }
# { zig_target: mipsel32r6-linux-muslsf, zig_flags: -march=mips32r6 -msoft-float, qemu: qemu-mipsel, UPX_CONFIG_DISABLE_SAVE_TEMPS: 'ON' }
env:
# for zig-cc wrapper scripts (see below):
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
ZIG_FLAGS: ${{ matrix.zig_flags }}
ZIG_PIC: ${{ matrix.zig_pic }}
ZIG_TARGET: ${{ matrix.zig_target }}
# for running the tests under QEMU/Wine:
UPX: --no-color --no-progress
UPX_DEBUG_DISABLE_GITREV_WARNING: 1
UPX_DEBUG_DOCTEST_VERBOSE: 0
steps:
- name: ${{ format('Install packages {0}', 'alpine') }}
if: ${{ job.container }}
shell: sh
run: |
apk update && apk upgrade && apk add bash cmake coreutils file git make parallel tar util-linux xz zstd
if test '${{ matrix.zig_target }}' = 'x86_64-linux-gnu'; then # only do this once per Action
apk add clang g++
fi
# set PATH like in Ubuntu
echo "PATH=$HOME/.local/bin:$PATH" >> $GITHUB_ENV
git config --global --add safe.directory '*' # needed when running in a container
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
- name: ${{ format('Check out UPX {0} source code', env.REMOTE_REF_NAME) }}
run: |
git clone --branch "$REMOTE_REF_NAME" --depth 1 "$REMOTE_SERVER_URL/$REMOTE_REPOSITORY" .
git submodule update --init
rev=$(git rev-parse --short=7 HEAD)
echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV
# allow matrix to override env vars
test -z "${{ matrix.UPX_CONFIG_DISABLE_RUN_PACKED_TEST }}" || echo "UPX_CONFIG_DISABLE_RUN_PACKED_TEST=${{ matrix.UPX_CONFIG_DISABLE_RUN_PACKED_TEST }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_CONFIG_DISABLE_SANITIZE }}" || echo "UPX_CONFIG_DISABLE_SANITIZE=${{ matrix.UPX_CONFIG_DISABLE_SANITIZE }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_CONFIG_DISABLE_SAVE_TEMPS }}" || echo "UPX_CONFIG_DISABLE_SAVE_TEMPS=${{ matrix.UPX_CONFIG_DISABLE_SAVE_TEMPS }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_CONFIG_DISABLE_SELF_PACK_TEST }}" || echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=${{ matrix.UPX_CONFIG_DISABLE_SELF_PACK_TEST }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_CONFIG_DISABLE_SHARED_LIBS }}" || echo "UPX_CONFIG_DISABLE_SHARED_LIBS=${{ matrix.UPX_CONFIG_DISABLE_SHARED_LIBS }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_CONFIG_EXPECT_THREADS }}" || echo "UPX_CONFIG_EXPECT_THREADS=${{ matrix.UPX_CONFIG_EXPECT_THREADS }}" >> $GITHUB_ENV
test -z "${{ matrix.UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO }}" || echo "UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO=${{ matrix.UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO }}" >> $GITHUB_ENV
test -z "${{ matrix.tt }}" || echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV
# note that ~/.local/bin is included in the default $PATH on Ubuntu
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
shell: bash
run: |
mkdir -p -v ~/.local/bin
cd ~/.local/bin
ZIG_DIST_NAME=zig-linux-x86_64-${ZIG_DIST_VERSION}
wget -q https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
ls -l ${ZIG_DIST_NAME}.tar.xz
tar -xoJf ${ZIG_DIST_NAME}.tar.xz
rm ${ZIG_DIST_NAME}.tar.xz
ln -s -v ${ZIG_DIST_NAME}/zig zig
#echo "PATH=$PATH" && which zig
echo -n 'zig version: '; zig version
# create wrapper scripts (needed for CMake)
log=
log='set -x\n'
echo -e '#!/bin/sh\n'$log'exec zig ar "$@"' > zig-ar
echo -e '#!/bin/sh\n'$log'exec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
echo -e '#!/bin/sh\n'$log'exec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
echo -e '#!/bin/sh\n'$log'exec zig ranlib "$@"' > zig-ranlib
chmod +x zig-ar zig-cc zig-cxx zig-ranlib
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
# update ZIG_TARGET
ZIG_TARGET=${ZIG_TARGET/i386-/x86-} # i386 => x86
ZIG_TARGET=${ZIG_TARGET/-muslsf/-musl} # muslsf => musl
ZIG_TARGET=${ZIG_TARGET/mips2-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel2-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips3-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel3-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips4-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel4-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips32-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel32-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips32r2-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel32r2-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips32r3-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel32r3-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips32r5-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel32r5-/mipsel-}
ZIG_TARGET=${ZIG_TARGET/mips32r6-/mips-}; ZIG_TARGET=${ZIG_TARGET/mipsel32r6-/mipsel-}
echo "ZIG_TARGET=$ZIG_TARGET" >> $GITHUB_ENV
# update ZIG_FLAGS
# -fPIE is for compilation only => also use the correct linker flag "-pie"
# INFO: it seems the zig driver does handle this automatically(??), so not really needed
if test "X$ZIG_PIC" = "X-fPIE"; then true;
ZIG_FLAGS="$ZIG_FLAGS --start-no-unused-arguments -pie --end-no-unused-arguments"
echo "UPX_CONFIG_DISABLE_SHARED_LIBS=ON" >> $GITHUB_ENV # conflicts with ZIG_PIC/ZIG_FLAGS
fi
# zig bug TODO later: need -Wno-unused-command-line-argument
case "$ZIG_TARGET" in
powerpc*) ZIG_FLAGS="$ZIG_FLAGS -Wno-unused-command-line-argument" ;;
esac
# clang/zig bug TODO later: bogus warnings when using -save-temps
####ZIG_FLAGS="$ZIG_FLAGS -save-temps=obj -Wno-parentheses-equality -Wno-self-assign"
echo "ZIG_FLAGS=$ZIG_FLAGS" >> $GITHUB_ENV
#- run: set -x; zig version; zig-cc --version; zig-cxx --version
- run: zig-cc -E -x c -dM /dev/null # list predefined macros for C
- run: zig-cxx -E -x c++ -dM /dev/null # list predefined macros for C++
- name: 'Build with local clang and gcc'
if: ${{ matrix.zig_target == 'x86_64-linux-gnu' }} # only do this once per Action
run: |
export UPX_CONFIG_HAVE_WORKING_BUILD_RPATH=ON
clang --version; clang++ --version
gcc --version; g++ --version
make build/extra/clang/all+test
make build/extra/gcc/all+test
- name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: |
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/release \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
file build/zig/${ZIG_TARGET}${ZIG_PIC}/release/upx*
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: |
make UPX_XTARGET=zig/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/.local/bin/zig-ar" CMAKE_RANLIB="$HOME/.local/bin/zig-ranlib"
file build/zig/${ZIG_TARGET}${ZIG_PIC}/debug/upx*
- name: ${{ format('Make artifact from upx-{0}-{1}', env.REMOTE_REF_NAME, env.UPX_GITREV_SHORT) }}
shell: bash
run: |
N=$(echo "upx-zigcc-linux-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.+-]/-/g')
xbuild=$(echo "build-upx-${REMOTE_REF_NAME}-${UPX_GITREV_SHORT}" | sed 's/[^0-9a-zA-Z_.+-]/-/g')
mkdir -p "tmp/artifact/$N/$xbuild"
if [[ "${{ matrix.zig_target }}" == *-linux* ]]; then
dirs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithDestdir/$d" cmake --install build/zig/$d; done
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithDestdirAndStrip/$d" cmake --install build/zig/$d --strip; done
for d in $dirs; do cmake --install build/zig/$d --prefix "$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithPrefix/$d"; done
for d in $dirs; do cmake --install build/zig/$d --prefix "$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithPrefixAndStrip/$d" --strip; done
fi
(cd build && shopt -s nullglob && cp -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N/$xbuild")
(cd tmp/artifact/$N/$xbuild && find . -type f | LC_ALL=C sort | xargs -r file)
if command -v hardlink >/dev/null; then (cd "tmp/artifact/$N" && hardlink .) fi
(cd tmp/artifact && tar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.artifact_name }}
path: tmp/artifact
- name: 'Install QEMU'
if: ${{ matrix.qemu }}
shell: bash
run: |
uname -a; pwd; id; umask
qemu='${{ matrix.qemu }}'
if test -f /etc/alpine-release; then
apk add "${qemu%% *}"
else
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y --no-install-recommends qemu-user
fi
- name: 'Run basic tests under QEMU - Release'
if: ${{ matrix.qemu }}
shell: bash
run: |
set -ex -o pipefail
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release
file ./upx
qemu='${{ matrix.qemu }}'
tt='${{ matrix.tt }}'
[[ $tt == UPX-UNSUPPORTED ]] && tt=/bin/bash
[[ -z $tt ]] && tt=./upx
$qemu ./upx --version-short
$qemu ./upx -3 $tt -o tt.packed
$qemu ./upx -l tt.packed
$qemu ./upx -t tt.packed
$qemu ./upx -d tt.packed -o tt.unpacked
[[ $tt == ./upx ]] && $qemu ./tt.unpacked --version-short
[[ $tt == ./upx ]] && $qemu ./tt.packed --version-short
true
- name: 'Run basic tests under QEMU - Debug'
if: ${{ matrix.qemu }}
shell: bash
run: |
set -ex -o pipefail
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
file ./upx
qemu='${{ matrix.qemu }}'
tt='${{ matrix.tt }}'
[[ $tt == UPX-UNSUPPORTED ]] && tt=/bin/bash
[[ -z $tt ]] && tt=./upx
$qemu ./upx --version-short
$qemu ./upx -3 $tt -o tt.packed
$qemu ./upx -l tt.packed
$qemu ./upx -t tt.packed
$qemu ./upx -d tt.packed -o tt.unpacked
[[ $tt == ./upx ]] && $qemu ./tt.unpacked --version-short
[[ $tt == ./upx ]] && $qemu ./tt.packed --version-short
true
- name: ${{ format('Mimic ctest tests with QEMU {0} - Release', matrix.qemu) }}
if: ${{ matrix.qemu }}
run: |
export upx_exe_runner="${{ matrix.qemu }}"
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
- name: ${{ format('Mimic ctest tests with QEMU {0} - Debug', matrix.qemu) }}
if: ${{ matrix.qemu }}
run: |
export upx_exe_runner="${{ matrix.qemu }}"
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
- name: 'Install Wine'
if: ${{ matrix.wine }}
shell: bash
run: |
uname -a; pwd; id; umask
if test -f /etc/alpine-release; then
# Wine >= 8.0 can run i686 win32 programs in WOW64 mode under pure 64-bit Alpine Linux
apk add wine
else
[[ '${{ matrix.wine }}' == wine32 ]] && sudo dpkg --add-architecture i386
sudo apt-get update && sudo apt-get upgrade -y
[[ '${{ matrix.wine }}' == wine32 ]] && sudo apt-get install -y wine wine32:i386
[[ '${{ matrix.wine }}' == wine64 ]] && sudo apt-get install -y wine wine64
fi
# this seems to be needed for Wine when running in a container (beause of UID mismatch??)
mkdir -p -v ~/.wine
wineboot --init
- name: 'Run basic tests under Wine - Release'
if: ${{ matrix.wine }}
shell: bash
run: |
set -ex -o pipefail
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/release
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
file ./upx.exe
wine=wine
tt='./upx.exe'
$wine ./upx.exe --version-short
$wine ./upx.exe -3 $tt -o tt.packed.exe
$wine ./upx.exe -l tt.packed.exe
$wine ./upx.exe -t tt.packed.exe
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
$wine ./tt.unpacked.exe --version-short
[[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST == ON ]] || $wine ./tt.packed.exe --version-short
- name: 'Run basic tests under Wine - Debug'
if: ${{ matrix.wine }}
shell: bash
run: |
set -ex -o pipefail
cd build/zig/${ZIG_TARGET}${ZIG_PIC}/debug
[[ -f upx && ! -f upx.exe ]] && mv -i -v upx upx.exe
file ./upx.exe
wine=wine
tt='./upx.exe'
$wine ./upx.exe --version-short
$wine ./upx.exe -3 $tt -o tt.packed.exe
$wine ./upx.exe -l tt.packed.exe
$wine ./upx.exe -t tt.packed.exe
$wine ./upx.exe -d tt.packed.exe -o tt.unpacked.exe
$wine ./tt.unpacked.exe --version-short
[[ $UPX_CONFIG_DISABLE_RUN_PACKED_TEST == ON ]] || $wine ./tt.packed.exe --version-short
- name: 'Mimic ctest tests under Wine - Release'
if: ${{ matrix.wine }}
run: |
export upx_exe_runner=wine
export upx_exe=./upx.exe
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/release bash "$PWD"/misc/testsuite/mimic_ctest.sh
- name: 'Mimic ctest tests under Wine - Debug'
if: ${{ matrix.wine }}
run: |
export upx_exe_runner=wine
export upx_exe=./upx.exe
env -C build/zig/${ZIG_TARGET}${ZIG_PIC}/debug bash "$PWD"/misc/testsuite/mimic_ctest.sh
job-build-on-macos:
if: github.repository_owner == 'upx'
name: ${{ format('{0} {1} {2}', matrix.os, matrix.zig_target, matrix.zig_pic) }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
# { os: macos-11, zig_target: x86_64-macos-none } # macos-11 is EOL
# { os: macos-11, zig_target: x86_64-macos.11.0-none } # macos-11 is EOL
# { os: macos-12, zig_target: x86_64-macos-none }
# { os: macos-12, zig_target: x86_64-macos.11.0-none }
# { os: macos-12, zig_target: x86_64-macos.12.0-none }
- { os: macos-13, zig_target: x86_64-macos-none }
- { os: macos-13, zig_target: x86_64-macos.11.0-none }
# { os: macos-13, zig_target: x86_64-macos.12.0-none }
- { os: macos-13, zig_target: x86_64-macos.13.0-none }
# { os: macos-14, zig_target: x86_64-macos-none }
# { os: macos-14, zig_target: x86_64-macos.11.0-none }
# { os: macos-14, zig_target: x86_64-macos.12.0-none }
# { os: macos-14, zig_target: x86_64-macos.13.0-none }
- { os: macos-14, zig_target: aarch64-macos-none }
- { os: macos-14, zig_target: aarch64-macos.11.0-none }
# { os: macos-14, zig_target: aarch64-macos.12.0-none }
- { os: macos-14, zig_target: aarch64-macos.13.0-none }
- { os: macos-15, zig_target: aarch64-macos-none }
- { os: macos-15, zig_target: aarch64-macos.11.0-none }
# { os: macos-15, zig_target: aarch64-macos.12.0-none }
- { os: macos-15, zig_target: aarch64-macos.13.0-none }
env:
UPX_CONFIG_HAVE_WORKING_BUILD_RPATH: 'ON'
# for zig-cc wrapper scripts (see below):
ZIG_CPPFLAGS: -DUPX_DOCTEST_CONFIG_MULTITHREADING
ZIG_FLAGS: ${{ matrix.zig_flags }}
ZIG_PIC: ${{ matrix.zig_pic }}
ZIG_TARGET: ${{ matrix.zig_target }}
# for running the tests:
UPX: --no-color --no-progress
UPX_DEBUG_DISABLE_GITREV_WARNING: 1
UPX_DEBUG_DOCTEST_VERBOSE: 0
# misc
BUILD_SUBDIR: zig-on-${{ matrix.os }}
steps:
- name: ${{ format('Check out UPX {0} source code', env.REMOTE_REF_NAME) }}
run: |
git clone --branch "$REMOTE_REF_NAME" --depth 1 "$REMOTE_SERVER_URL/$REMOTE_REPOSITORY" .
git submodule update --init
rev=$(git rev-parse --short=7 HEAD)
echo "UPX_GITREV_SHORT=$rev" >> $GITHUB_ENV
#
mkdir -p ~/.parallel && : > ~/.parallel/$(echo 6305-4721 | tr 0-7 leticlwi)
echo "UPX_DEBUG_FORCE_PACK_MACOS=1" >> $GITHUB_ENV
case "${{ matrix.os }}" in
# TODO FIXME: UPX problem: UPX on macos-13+ is broken => disable run-packed for now
macos-13 | macos-14 | macos-15) echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON" >> $GITHUB_ENV ;;
esac
# note that ~/bin is included in the default $PATH on macos-11/12/13/14 runners
- name: ${{ format('Install Zig {0}', env.ZIG_DIST_VERSION) }}
run: |
uname -a; pwd; id; umask
mkdir -p -v ~/bin
cd ~/bin
ZIG_DIST_NAME=zig-macos-aarch64-${ZIG_DIST_VERSION}
case "${{ matrix.os }}" in
*-1[0-3]) ZIG_DIST_NAME=zig-macos-x86_64-${ZIG_DIST_VERSION} ;;
esac
wget -q https://ziglang.org/builds/${ZIG_DIST_NAME}.tar.xz
ls -l ${ZIG_DIST_NAME}.tar.xz
tar -xoJf ${ZIG_DIST_NAME}.tar.xz
rm ${ZIG_DIST_NAME}.tar.xz
ln -s -v ${ZIG_DIST_NAME}/zig zig
#echo "PATH=$PATH" && which zig
echo -n 'zig version: '; zig version
# create wrapper scripts (needed for CMake)
log=
log='set -x\n'
echo -e '#!/bin/sh\n'$log'exec zig ar "$@"' > zig-ar
echo -e '#!/bin/sh\n'$log'exec zig cc -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CFLAGS "$@"' > zig-cc
echo -e '#!/bin/sh\n'$log'exec zig c++ -target $ZIG_TARGET $ZIG_PIC $ZIG_FLAGS $ZIG_CPPFLAGS $ZIG_CXXFLAGS "$@"' > zig-cxx
echo -e '#!/bin/sh\n'$log'exec zig ranlib "$@"' > zig-ranlib
chmod +x zig-ar zig-cc zig-cxx zig-ranlib
ls -la; head zig-ar zig-cc zig-cxx zig-ranlib
- run: set -x; xcode-select -p || true; xcodebuild -version || true
- run: set -x; zig version; zig-cc --version; zig-cxx --version
- run: zig-cc -E -x c -dM /dev/null # list predefined macros for C
- run: zig-cxx -E -x c++ -dM /dev/null # list predefined macros for C++
- name: 'Build with local clang'
if: ${{ endsWith(matrix.zig_target,'-macos-none') }} # only do this once per Action
run: |
export UPX_CONFIG_HAVE_WORKING_BUILD_RPATH=ON
clang --version; clang++ --version
make build/extra/clang/all+test
- name: ${{ format('Build Release with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: |
make UPX_XTARGET=$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC} xtarget/release \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/bin/zig-ar" CMAKE_RANLIB="$HOME/bin/zig-ranlib"
file build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/release/upx*
- name: ${{ format('Build Debug with zig-cc -target {0} {1}', env.ZIG_TARGET, env.ZIG_PIC) }}
run: |
make UPX_XTARGET=$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC} xtarget/debug \
CC="zig-cc" CXX="zig-cxx" CMAKE_AR="$HOME/bin/zig-ar" CMAKE_RANLIB="$HOME/bin/zig-ranlib"
file build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/debug/upx*
- name: ${{ format('Make artifact from upx-{0}-{1}', env.REMOTE_REF_NAME, env.UPX_GITREV_SHORT) }}
run: |
N=$(echo "upx-zigcc-${{ matrix.os }}-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.zig_target }}${ZIG_PIC}" | sed 's/[^0-9a-zA-Z_.+-]/-/g')
xbuild=$(echo "build-upx-${REMOTE_REF_NAME}-${UPX_GITREV_SHORT}" | sed 's/[^0-9a-zA-Z_.+-]/-/g')
mkdir -p "tmp/artifact/$N/$xbuild"
dirs="${ZIG_TARGET}${ZIG_PIC}/debug ${ZIG_TARGET}${ZIG_PIC}/release"
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithDestdir/$BUILD_SUBDIR/$d" cmake --install build/$BUILD_SUBDIR/$d; done
for d in $dirs; do DESTDIR="$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithDestdirAndStrip/$BUILD_SUBDIR/$d" cmake --install build/$BUILD_SUBDIR/$d --strip; done
for d in $dirs; do cmake --install build/$BUILD_SUBDIR/$d --prefix "$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithPrefix/$BUILD_SUBDIR/$d"; done
for d in $dirs; do cmake --install build/$BUILD_SUBDIR/$d --prefix "$PWD/tmp/artifact/$N/$xbuild/InstallWithCMake/InstallWithPrefixAndStrip/$BUILD_SUBDIR/$d" --strip; done
(cd build && shopt -s nullglob && rsync -R -a */upx */*/*/upx "../tmp/artifact/$N/$xbuild/")
hardlink="$HOMEBREW_PREFIX/opt/util-linux/bin/hardlink"
if test -f "$hardlink"; then (cd "tmp/artifact/$N" && "$hardlink" .) fi
(cd tmp/artifact && gtar --sort=name --zstd -cf "$N.tar.zst" "$N" && rm -rf "./$N" && ls -la && zstd -tq "$N.tar.zst")
echo "artifact_name=$N" >> $GITHUB_ENV
- name: ${{ format('Upload artifact {0}', env.artifact_name) }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.artifact_name }}
path: tmp/artifact
- name: 'Run ctest tests - Release'
run: |
UPX_DEBUG_DOCTEST_VERBOSE=1 ./build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/release/upx --version-short
make build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/release+test
- name: 'Run ctest tests - Debug'
run: |
UPX_DEBUG_DOCTEST_VERBOSE=1 ./build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/debug/upx --version-short
make build/$BUILD_SUBDIR/${ZIG_TARGET}${ZIG_PIC}/debug+test