# Copyright (C) Markus Franz Xaver Johannes Oberhumer # CC CompilationCheck: test various clang and gcc versions # Build under various Alpine Linux versions with clang and gcc, and # also test building with C++20 and C++23. # And also uses a subdirectory "upx with space" that contains whitespace in order # to detect possible quoting issues. # info: Alpine Linux 3.9 (released Jan 2019) has clang-5, cmake-3.13.0 # and gcc-8, which nicely matches our minimal build requirements name: 'Weekly CI CC - Alpine Linux C++23' on: schedule: [cron: '00 2 * * 3'] # run weekly Wednesday 02:00 UTC workflow_dispatch: env: CMAKE_REQUIRED_QUIET: OFF DEBIAN_FRONTEND: noninteractive UPX_TESTSUITE_LEVEL: 4 jobs: job-alpine-cmake: # uses cmake + make if: github.repository_owner == 'upx' strategy: fail-fast: false matrix: { container: ['alpine:3.9','alpine:3.10','alpine:3.11','alpine:3.12','alpine:3.13','alpine:3.14','alpine:3.15','alpine:3.16','alpine:3.17','alpine:3.18','alpine:edge','i386/alpine:edge'] } name: ${{ format('container {0}', matrix.container) }} runs-on: ubuntu-latest container: ${{ matrix.container }} env: { UPX_CMAKE_CONFIG_FLAGS: '-DCMAKE_VERBOSE_MAKEFILE=ON' } steps: - name: ${{ format('Install packages {0}', matrix.container) }} run: | apk update && apk upgrade && apk add clang cmake g++ git make case ${{ matrix.container }} in # clang-dev is needed on older Alpine versions for clang headers like *:3.[0-9]|*:3.10|*:3.11) apk add clang-dev ;; esac - name: ${{ format('Check out UPX {0} source code', github.ref_name) }} run: | git clone --branch "$GITHUB_REF_NAME" --depth 1 https://github.com/upx/upx "upx with space" git -C "upx with space" submodule update --init x="$(apk list -I "$(apk info -Wq "$(which clang)")")"; echo "clang_package=${x%% *}" >> $GITHUB_ENV x="$(apk list -I "$(apk info -Wq "$(which gcc)")")"; echo "gcc_package=${x%% *}" >> $GITHUB_ENV N=$(echo "upx-${GITHUB_REF_NAME}-${GITHUB_SHA:0:7}-weekly-ci-alpine-${{ matrix.container }}" | sed 's/[^0-9a-zA-Z_.-]/-/g') echo "artifact_name=$N" >> $GITHUB_ENV # build with default C11 and C++17 - name: ${{ format('Build clang Release with {0}', env.clang_package) }} run: 'make -C "upx with space" UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static"' - name: ${{ format('Build clang Debug with {0}', env.clang_package) }} run: 'make -C "upx with space" UPX_XTARGET=clang-static CC="clang -static" CXX="clang++ -static" xtarget/debug' - name: ${{ format('Build gcc Release with {0}', env.gcc_package) }} run: 'make -C "upx with space" UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static"' - name: ${{ format('Build gcc Debug with {0}', env.gcc_package) }} run: 'make -C "upx with space" UPX_XTARGET=gcc-static CC="gcc -static" CXX="g++ -static" xtarget/debug' - name: 'Update environment' run: | echo "UPX_CONFIG_DISABLE_C_STANDARD=ON" >> $GITHUB_ENV echo "UPX_CONFIG_DISABLE_CXX_STANDARD=ON" >> $GITHUB_ENV # build with C17 and C++20 on alpine:edge - name: ${{ format('Build clang C++20 Release with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxx20-static CC="clang -std=gnu17 -static" CXX="clang++ -std=gnu++20 -static" - name: ${{ format('Build clang C++20 Debug with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxx20-static CC="clang -std=gnu17 -static" CXX="clang++ -std=gnu++20 -static" xtarget/debug - name: ${{ format('Build gcc C++20 Release with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxx20-static CC="gcc -std=gnu17 -static" CXX="g++ -std=gnu++20 -static" - name: ${{ format('Build gcc C++20 Debug with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxx20-static CC="gcc -std=gnu17 -static" CXX="g++ -std=gnu++20 -static" xtarget/debug # build with C23 and C++23 on alpine:edge - name: ${{ format('Build clang C++23 Release with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxx23-static CC="clang -std=gnu2x -static" CXX="clang++ -std=gnu++2b -static" - name: ${{ format('Build clang C++23 Debug with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxx23-static CC="clang -std=gnu2x -static" CXX="clang++ -std=gnu++2b -static" xtarget/debug - name: ${{ format('Build gcc C++23 Release with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxx23-static CC="gcc -std=gnu2x -static" CXX="g++ -std=gnu++23 -static" - name: ${{ format('Build gcc C++23 Debug with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxx23-static CC="gcc -std=gnu2x -static" CXX="g++ -std=gnu++23 -static" xtarget/debug # build with -flto=auto on alpine:edge - name: ${{ format('Build clang LTO Release with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxxlto-static CC="clang -flto=auto -static" CXX="clang++ -flto=auto -static" - name: ${{ format('Build clang LTO Debug with {0}', env.clang_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=clang-cxxlto-static CC="clang -flto=auto -static" CXX="clang++ -flto=auto -static" xtarget/debug - name: ${{ format('Build gcc LTO Release with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxxlto-static CC="gcc -flto=auto -static" CXX="g++ -flto=auto -static" - name: ${{ format('Build gcc LTO Debug with {0}', env.gcc_package) }} if: ${{ contains(matrix.container, ':edge') }} run: | make -C "upx with space" UPX_XTARGET=gcc-cxxlto-static CC="gcc -flto=auto -static" CXX="g++ -flto=auto -static" xtarget/debug - { name: 'Strip release binaries', run: 'strip -p --strip-unneeded "upx with space"/build/*/*/release/upx' } - name: ${{ format('Upload artifact {0}', env.artifact_name) }} if: ${{ !startsWith(matrix.container, 'i386/') }} # i386: missing nodejs on host uses: actions/upload-artifact@v3 with: name: ${{ env.artifact_name }} path: 'upx with space*/build/*/*/*/upx' - { name: 'Run basic tests clang Release', run: 'make -C "upx with space"/build/xtarget/clang-static/release test' } - { name: 'Run basic tests clang Debug', run: 'make -C "upx with space"/build/xtarget/clang-static/debug test' } - { name: 'Run basic tests gcc Release', run: 'make -C "upx with space"/build/xtarget/gcc-static/release test' } - { name: 'Run basic tests gcc Debug', run: 'make -C "upx with space"/build/xtarget/gcc-static/debug test' } - name: 'Run basic tests C++20, C++23 and LTO' if: ${{ contains(matrix.container, ':edge') }} run: | for dir in "upx with space"/build/xtarget/*-cxx*/*; do echo "===== $dir" make -C "$dir" test done - name: 'Run install tests' run: | (cd "upx with space"/build/xtarget/clang-static/debug && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd "upx with space"/build/xtarget/clang-static/debug && DESTDIR="$PWD/Install with make" make install) (cd "upx with space"/build/xtarget/clang-static/release && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd "upx with space"/build/xtarget/clang-static/release && DESTDIR="$PWD/Install with make" make install) (cd "upx with space"/build/xtarget/gcc-static/debug && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd "upx with space"/build/xtarget/gcc-static/debug && DESTDIR="$PWD/Install with make" make install) (cd "upx with space"/build/xtarget/gcc-static/release && DESTDIR="$PWD/Install with cmake" cmake --install .) (cd "upx with space"/build/xtarget/gcc-static/release && DESTDIR="$PWD/Install with make" make install) # test suite - name: ${{ format('Run test suite level {0}', env.UPX_TESTSUITE_LEVEL) }} run: | # testsuite needs bash and working "readlink -en" and "sha256sum -b" apk add bash coreutils # use a directory that contains whitespace to detect possible quoting issues git clone --depth=1 https://github.com/upx/upx-testsuite "upx-testsuite with space" export upx_testsuite_SRCDIR="$(readlink -fn "upx-testsuite with space")" testsuite_1="$(readlink -fn "upx with space"/misc/testsuite/upx_testsuite_1.sh)" (cd "upx with space"/build/xtarget/gcc-static/release && upx_exe=./upx bash "$testsuite_1")