mirror of
https://github.com/upx/upx.git
synced 2026-05-07 20:12:50 +00:00
294 lines
17 KiB
YAML
294 lines
17 KiB
YAML
# Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
|
|
|
name: Extra Cross Builds
|
|
|
|
on: [workflow_dispatch]
|
|
|
|
defaults: { run: { shell: bash } }
|
|
|
|
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_CONFIG_HAVE_WORKING_BUILD_RPATH: 'ON'
|
|
UPX_DEBUG_TEST_FLOAT_DIVISION_BY_ZERO: 1
|
|
UPX_DEBUG_TEST_LIBC_QSORT: 1
|
|
ZSTD_CLEVEL: 17
|
|
|
|
jobs:
|
|
job-extra-cross-builds: # uses cmake + make
|
|
if: github.repository_owner == 'upx'
|
|
name: Extra Cross Builds
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- { container: 'ubuntu:26.04', target: g++-aarch64-linux-gnu, qemu: qemu-aarch64 }
|
|
- { container: 'ubuntu:26.04', target: g++-arm-linux-gnueabi, qemu: qemu-arm }
|
|
- { container: 'ubuntu:26.04', target: g++-arm-linux-gnueabihf, qemu: qemu-arm }
|
|
- { container: 'ubuntu:26.04', target: g++-i686-linux-gnu, qemu: qemu-i386 }
|
|
- { container: 'ubuntu:24.04', target: g++-mips-linux-gnu, qemu: qemu-mips }
|
|
- { container: 'ubuntu:24.04', target: g++-mipsel-linux-gnu, qemu: qemu-mipsel }
|
|
- { container: 'ubuntu:26.04', target: g++-powerpc-linux-gnu, qemu: qemu-ppc }
|
|
- { container: 'ubuntu:26.04', target: g++-powerpc64-linux-gnu, qemu: qemu-ppc64 }
|
|
- { container: 'ubuntu:26.04', target: g++-powerpc64le-linux-gnu, qemu: qemu-ppc64le }
|
|
|
|
- { container: 'ubuntu:20.04', target: g++-mingw-w64-i686, wine: wine }
|
|
- { container: 'ubuntu:20.04', target: g++-mingw-w64-x86-64, wine: wine }
|
|
- { container: 'ubuntu:22.04', target: g++-mingw-w64-i686, wine: wine }
|
|
- { container: 'ubuntu:22.04', target: g++-mingw-w64-x86-64, wine: wine }
|
|
- { container: 'ubuntu:24.04', target: g++-mingw-w64-i686, Q_wine: wine }
|
|
- { container: 'ubuntu:24.04', target: g++-mingw-w64-x86-64, Q_wine: wine }
|
|
- { container: 'ubuntu:26.04', target: g++-mingw-w64-i686, Q_wine: wine }
|
|
- { container: 'ubuntu:26.04', target: g++-mingw-w64-x86-64, Q_wine: wine }
|
|
|
|
- { container: 'ubuntu:20.04', target: g++-alpha-linux-gnu, qemu: qemu-alpha }
|
|
# { container: 'ubuntu:20.04', target: g++-arc-linux-gnu }
|
|
- { container: 'ubuntu:20.04', target: g++-hppa-linux-gnu, qemu: qemu-hppa }
|
|
# { container: 'ubuntu:20.04', target: g++-loongarch64-linux-gnu, qemu: qemu-loongarch64 }
|
|
# { container: 'ubuntu:20.04', target: g++-m68k-linux-gnu, qemu: qemu-m68k }
|
|
- { container: 'ubuntu:20.04', target: g++-mips64-linux-gnuabi64, qemu: qemu-mips64 }
|
|
- { container: 'ubuntu:20.04', target: g++-mips64el-linux-gnuabi64, qemu: qemu-mips64el }
|
|
# { container: 'ubuntu:20.04', target: g++-riscv64-linux-gnu, qemu: qemu-riscv64 }
|
|
- { container: 'ubuntu:20.04', target: g++-s390x-linux-gnu, qemu: qemu-s390x }
|
|
# { container: 'ubuntu:20.04', target: g++-sh4-linux-gnu, qemu: qemu-sh4 }
|
|
# { container: 'ubuntu:20.04', target: g++-sparc64-linux-gnu, qemu: qemu-sparc64 }
|
|
|
|
- { container: 'ubuntu:22.04', target: g++-alpha-linux-gnu, qemu: qemu-alpha }
|
|
# { container: 'ubuntu:22.04', target: g++-arc-linux-gnu }
|
|
- { container: 'ubuntu:22.04', target: g++-hppa-linux-gnu, qemu: qemu-hppa }
|
|
# { container: 'ubuntu:22.04', target: g++-loongarch64-linux-gnu, qemu: qemu-loongarch64 }
|
|
# { container: 'ubuntu:22.04', target: g++-m68k-linux-gnu, qemu: qemu-m68k }
|
|
- { container: 'ubuntu:22.04', target: g++-mips64-linux-gnuabi64, qemu: qemu-mips64 }
|
|
- { container: 'ubuntu:22.04', target: g++-mips64el-linux-gnuabi64, qemu: qemu-mips64el }
|
|
- { container: 'ubuntu:22.04', target: g++-riscv64-linux-gnu, qemu: qemu-riscv64 }
|
|
- { container: 'ubuntu:22.04', target: g++-s390x-linux-gnu, qemu: qemu-s390x }
|
|
# { container: 'ubuntu:22.04', target: g++-sh4-linux-gnu, qemu: qemu-sh4 }
|
|
# { container: 'ubuntu:22.04', target: g++-sparc64-linux-gnu, qemu: qemu-sparc64 }
|
|
|
|
- { container: 'ubuntu:24.04', target: g++-alpha-linux-gnu, qemu: qemu-alpha }
|
|
- { container: 'ubuntu:24.04', target: g++-arc-linux-gnu }
|
|
- { container: 'ubuntu:24.04', target: g++-hppa-linux-gnu, qemu: qemu-hppa }
|
|
# { container: 'ubuntu:24.04', target: g++-loongarch64-linux-gnu, qemu: qemu-loongarch64 }
|
|
- { container: 'ubuntu:24.04', target: g++-m68k-linux-gnu, qemu: qemu-m68k }
|
|
- { container: 'ubuntu:24.04', target: g++-mips64-linux-gnuabi64, qemu: qemu-mips64 }
|
|
- { container: 'ubuntu:24.04', target: g++-mips64el-linux-gnuabi64, qemu: qemu-mips64el }
|
|
- { container: 'ubuntu:24.04', target: g++-riscv64-linux-gnu, qemu: qemu-riscv64 }
|
|
- { container: 'ubuntu:24.04', target: g++-s390x-linux-gnu, qemu: qemu-s390x }
|
|
- { container: 'ubuntu:24.04', target: g++-sh4-linux-gnu, qemu: qemu-sh4 }
|
|
- { container: 'ubuntu:24.04', target: g++-sparc64-linux-gnu, qemu: qemu-sparc64 }
|
|
|
|
- { container: 'ubuntu:26.04', target: g++-alpha-linux-gnu, qemu: qemu-alpha }
|
|
- { container: 'ubuntu:26.04', target: g++-arc-linux-gnu }
|
|
- { container: 'ubuntu:26.04', target: g++-hppa-linux-gnu, qemu: qemu-hppa }
|
|
- { container: 'ubuntu:26.04', target: g++-loongarch64-linux-gnu, qemu: qemu-loongarch64 }
|
|
- { container: 'ubuntu:26.04', target: g++-m68k-linux-gnu, qemu: qemu-m68k }
|
|
# { container: 'ubuntu:26.04', target: g++-mips64-linux-gnuabi64, qemu: qemu-mips64 }
|
|
# { container: 'ubuntu:26.04', target: g++-mips64el-linux-gnuabi64, qemu: qemu-mips64el }
|
|
- { container: 'ubuntu:26.04', target: g++-riscv64-linux-gnu, qemu: qemu-riscv64 }
|
|
- { container: 'ubuntu:26.04', target: g++-s390x-linux-gnu, qemu: qemu-s390x }
|
|
- { container: 'ubuntu:26.04', target: g++-sh4-linux-gnu, qemu: qemu-sh4 }
|
|
- { container: 'ubuntu:26.04', target: g++-sparc64-linux-gnu, qemu: qemu-sparc64 }
|
|
|
|
runs-on: ubuntu-latest
|
|
container: ${{ matrix.container }}
|
|
steps:
|
|
- run: uname -a; pwd; id; umask
|
|
- run: ulimit -a || true
|
|
- name: ${{ format('Install packages {0}', matrix.container) }}
|
|
run: |
|
|
apt-get update && apt-get upgrade -y
|
|
apt-get install -y --no-install-recommends bash ca-certificates cmake curl file git make parallel strace tar time tree util-linux xz-utils zstd
|
|
apt-get install -y qemu-user ${{ matrix.target }}
|
|
# make sure that we use posix-threads (pthread/winpthreads) and NOT win32-threads
|
|
for f in i686-w64-mingw32-g++ i686-w64-mingw32-gcc x86_64-w64-mingw32-g++ x86_64-w64-mingw32-gcc; do
|
|
if test -f /usr/bin/$f-posix; then update-alternatives --set $f /usr/bin/$f-posix; fi
|
|
ls -ldF /usr/bin/${f}* || true
|
|
done
|
|
ls -ldF /etc/alternatives/*mingw* || true
|
|
- run: dpkg -l
|
|
- name: ${{ format('Check out {0} source code', github.ref_name) }}
|
|
run: |
|
|
git config --global --add safe.directory '*' # needed when running in a container
|
|
git clone --branch "$GITHUB_REF_NAME" --depth 1 "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" .
|
|
git submodule update --init
|
|
- name: Check out test suite
|
|
run: git clone --depth=1 https://github.com/upx/upx-testsuite ../deps/upx-testsuite
|
|
|
|
- name: Make
|
|
run: |
|
|
toolchain="${{ matrix.target }}"
|
|
toolchain=${toolchain/-x86-64/-x86_64}
|
|
toolchain=${toolchain/#g++-/}
|
|
case $toolchain in
|
|
mingw-w64-i686) toolchain=i686-w64-mingw32 ;;
|
|
mingw-w64-x86_64) toolchain=x86_64-w64-mingw32 ;;
|
|
esac
|
|
echo "========== $toolchain"
|
|
echo "toolchain=$toolchain" >> $GITHUB_ENV
|
|
export CC=/usr/bin/${toolchain}-gcc
|
|
export CXX=/usr/bin/${toolchain}-g++
|
|
export CMAKE_AR=/usr/bin/${toolchain}-ar
|
|
export CMAKE_RANLIB=/usr/bin/${toolchain}-ranlib
|
|
ls -ldF $CC $CXX $CMAKE_AR $CMAKE_RANLIB
|
|
ls -ldF /usr/bin/*{gcc,g++,ar,ranlib}
|
|
ls -ldF /usr/bin/${toolchain}*
|
|
if [[ -n "${{ matrix.qemu }}" ]]; then true;
|
|
qemu="${{ matrix.qemu }} -L /usr/${toolchain}"
|
|
export CMAKE_CROSSCOMPILING_EMULATOR="${qemu// /;}"
|
|
echo "CMAKE_CROSSCOMPILING_EMULATOR=$CMAKE_CROSSCOMPILING_EMULATOR"
|
|
fi
|
|
case $toolchain in
|
|
# these old architectures do not support sanitize
|
|
alpha-linux-gnu) export UPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
hppa-linux-gnu) export UPX_CONFIG_DISABLE_SANITIZE=ON ;;
|
|
m68k-linux-gnu) export UPX_CONFIG_EXPECT_THREADS=OFF ;;
|
|
# avoid sanitize link errors with current MinGW-w64 versions; link libstdc++ statically
|
|
i686-w64-mingw32)
|
|
export UPX_CONFIG_DISABLE_SANITIZE=ON
|
|
export UPX_CONFIG_EXPECT_THREADS=OFF
|
|
export CMAKE_SYSTEM_NAME=Windows
|
|
export CMAKE_SYSTEM_PROCESSOR=X86
|
|
export CMAKE_CROSSCOMPILING_EMULATOR=wine
|
|
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
x86_64-w64-mingw32)
|
|
export UPX_CONFIG_DISABLE_SANITIZE=ON
|
|
export UPX_CONFIG_EXPECT_THREADS=OFF
|
|
export CMAKE_SYSTEM_NAME=Windows
|
|
export CMAKE_SYSTEM_PROCESSOR=AMD64
|
|
export CMAKE_CROSSCOMPILING_EMULATOR=wine
|
|
CC="$CC -static"; CXX="$CXX -static" ;;
|
|
# avoid warnings about arm libstdc++ ABI change in gcc-7
|
|
arm-linux-*) CXX="$CXX -Wno-psabi" ;;
|
|
armeb-linux-*) CXX="$CXX -Wno-psabi" ;;
|
|
esac
|
|
export UPX_CONFIG_DISABLE_SELF_PACK_TEST=ON
|
|
[[ $toolchain == aarch64-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == arm-linux-gnu* ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == armeb-linux-gnu* ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == i686-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == mips-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == mipsel-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == powerpc-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
#[[ $toolchain == powerpc64-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == powerpc64le-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == riscv64-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == x86_64-linux-gnu ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == i686-w64-mingw32 ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
[[ $toolchain == x86_64-w64-mingw32 ]] && export UPX_CONFIG_DISABLE_SELF_PACK_TEST=OFF
|
|
echo "UPX_CONFIG_DISABLE_SELF_PACK_TEST=$UPX_CONFIG_DISABLE_SELF_PACK_TEST" >> $GITHUB_ENV
|
|
echo -e "CC=$CC\nCXX=$CXX" >> $GITHUB_ENV
|
|
make UPX_XTARGET=xtarget/${toolchain} xtarget/all
|
|
|
|
- run: set -x; $CC --version; $CXX --version
|
|
- run: $CC -E -x c -dM /dev/null | LC_ALL=C sort
|
|
- run: $CXX -E -x c++ -dM /dev/null | LC_ALL=C sort
|
|
- run: ls -l build/*/*/*/upx* || true
|
|
- run: set -x; ${toolchain}-size build/*/*/*/upx* || true
|
|
- run: file build/*/*/*/upx* || true
|
|
|
|
- name: Make artifact
|
|
run: |
|
|
N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-${{ matrix.container }}-${{ matrix.target }}" | sed 's/[^0-9a-zA-Z_.+-]/-/g')
|
|
mkdir -p "tmp/artifact/$N"
|
|
(cd build && shopt -s nullglob && cp -v -ai --parents */upx{,.exe} */*/*/upx{,.exe} "../tmp/artifact/$N")
|
|
(cd build && shopt -s globstar && cp -v -ai --parents **/dt_cxxlib.* "../tmp/artifact/$N")
|
|
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@v7
|
|
with: { name: '${{ env.artifact_name }}', path: tmp/artifact }
|
|
|
|
- name: ${{ format('Inspect /usr/{0}', env.toolchain) }}
|
|
run: |
|
|
echo "/usr/${toolchain}"
|
|
[[ ! -d "/usr/${toolchain}" ]] && exit 1
|
|
set -x
|
|
ls -laF /usr
|
|
ls -laF /usr/${toolchain}
|
|
ls -laF /usr/${toolchain}/bin*
|
|
ls -laF /usr/${toolchain}/lib*
|
|
tree -sF -d --du /usr/${toolchain}
|
|
tree -sF --du /usr/${toolchain}
|
|
find /usr/${toolchain} -type f -print0 | LC_ALL=C sort -z | xargs -0r ls -ldF
|
|
|
|
- name: ${{ format('Run ctest tests with QEMU {0}', matrix.qemu) }}
|
|
if: ${{ matrix.qemu }}
|
|
run: |
|
|
jobs="${toolchain}/debug ${toolchain}/release"
|
|
[[ $toolchain == alpha-linux-gnu ]] && jobs="${toolchain}/release"
|
|
[[ $toolchain == arm-linux-gnueabihf ]] && jobs="${toolchain}/release"
|
|
[[ $toolchain == riscv64-linux-gnu ]] && exit 0
|
|
echo "===== parallel jobs: $jobs"
|
|
CTEST_JOBS=4 parallel -kv --lb 'make build/xtarget/{}+test' ::: $jobs
|
|
ls -ld ./build/*/*/*/XTesting/*/* || true
|
|
rm -rf ./build/*/*/*/XTesting/*/*
|
|
|
|
- name: ${{ format('Mimic ctest tests with QEMU {0}', matrix.qemu) }}
|
|
if: ${{ matrix.qemu }}
|
|
run: |
|
|
export upx_exe_runner="${{ matrix.qemu }}"
|
|
upx_exe_runner="$upx_exe_runner -L /usr/${toolchain}"
|
|
jobs="${toolchain}/debug ${toolchain}/release"
|
|
#[[ "${{ matrix.container }}" == "ubuntu:24.04" && $toolchain == alpha-linux-gnu ]] && jobs="${toolchain}/release"
|
|
[[ $toolchain == alpha-linux-gnu ]] && jobs="${toolchain}/release"
|
|
[[ $toolchain == arm-linux-gnueabihf ]] && jobs="${toolchain}/release"
|
|
echo "===== parallel jobs: $jobs"
|
|
parallel -kv --lb 'cd build/xtarget/{} && bash ../../../../misc/testsuite/mimic_ctest.sh' ::: $jobs
|
|
ls -ld ./build/*/*/*/upx-* || true
|
|
rm -rf ./build/*/*/*/upx-*
|
|
|
|
- name: ${{ format('Run test suite with QEMU {0}', matrix.qemu) }}
|
|
if: ${{ matrix.qemu }}
|
|
run: |
|
|
export upx_exe_runner="${{ matrix.qemu }}"
|
|
upx_exe_runner="$upx_exe_runner -L /usr/${toolchain}"
|
|
UPX_DEBUG_DOCTEST_VERBOSE=1 $upx_exe_runner ./build/xtarget/${toolchain}/debug/upx --sysinfo -vv || true
|
|
UPX_DEBUG_DOCTEST_VERBOSE=1 $upx_exe_runner ./build/xtarget/${toolchain}/release/upx --sysinfo -vv || true
|
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
|
jobs="${toolchain}/debug ${toolchain}/release"
|
|
[[ $toolchain == alpha-linux-gnu ]] && jobs="${toolchain}/release"
|
|
[[ $toolchain == arm-linux-gnueabihf ]] && jobs="${toolchain}/release"
|
|
echo "===== parallel jobs: $jobs"
|
|
parallel -kv --lb 'cd build/xtarget/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs
|
|
ls -ld ./build/*/*/*/tmp-upx-testsuite* || true
|
|
rm -rf ./build/*/*/*/tmp-upx-testsuite*
|
|
|
|
- name: ${{ format('Install Wine {0}', matrix.container) }}
|
|
if: ${{ matrix.wine || matrix.Q_wine }}
|
|
run: |
|
|
dpkg --add-architecture i386
|
|
apt-get update && apt-get upgrade -y
|
|
apt-get install -y wine wine32:i386 wine64
|
|
ls -ldF /usr/bin/wine* /etc/alternatives/*wine* || true
|
|
mkdir -p -v ~/.wine && wineboot --init
|
|
- run: dpkg -l
|
|
|
|
- name: ${{ format('Run ctest tests with Wine {0}', matrix.wine) }}
|
|
if: ${{ matrix.wine }}
|
|
run: |
|
|
jobs="${toolchain}/debug ${toolchain}/release"
|
|
echo "===== parallel jobs: $jobs"
|
|
CTEST_JOBS=4 parallel -kv --lb 'make build/xtarget/{}+test' ::: $jobs
|
|
ls -ld ./build/*/*/*/XTesting/*/* || true
|
|
rm -rf ./build/*/*/*/XTesting/*/*
|
|
|
|
- name: ${{ format('Run test suite with Wine {0}', matrix.wine) }}
|
|
if: ${{ matrix.wine }}
|
|
run: |
|
|
export upx_exe_runner="wine"
|
|
UPX_DEBUG_DOCTEST_VERBOSE=1 $upx_exe_runner ./build/xtarget/${toolchain}/debug/upx --sysinfo -vv || true
|
|
UPX_DEBUG_DOCTEST_VERBOSE=1 $upx_exe_runner ./build/xtarget/${toolchain}/release/upx --sysinfo -vv || true
|
|
export upx_exe=./upx.exe
|
|
export upx_testsuite_SRCDIR="$(readlink -en ../deps/upx-testsuite)"
|
|
jobs="${toolchain}/debug ${toolchain}/release"
|
|
echo "===== parallel jobs: $jobs"
|
|
parallel -kv --lb 'cd build/xtarget/{} && bash ../../../../misc/testsuite/upx_testsuite_1.sh' ::: $jobs
|
|
ls -ld ./build/*/*/*/tmp-upx-testsuite* || true
|
|
rm -rf ./build/*/*/*/tmp-upx-testsuite*
|