Skip to content
This repository has been archived by the owner on Aug 4, 2024. It is now read-only.

CI

CI #383

Workflow file for this run

name: CI
on:
workflow_dispatch:
inputs:
debug-build:
type: boolean
description: "Build in debug mode instead of release"
full-lto:
type: boolean
description: "Whether to enable full LTO"
push:
branches-ignore:
- main
paths-ignore:
- '.github/workflows/release.yaml'
- '.github/ISSUE_TEMPLATE/**'
- 'patches-contrib/**'
- 'LICENSE'
- '**/*.md'
- 'README.md'
pull_request:
paths-ignore:
- '.github/workflows/release.yaml'
- '.github/__release_template.txt'
- 'patches-contrib/**'
- 'LICENSE'
- '**/*.md'
- 'README.md'
env:
progname: "magiskboot"
permissions:
contents: read
jobs:
vars:
name: Prepare (variables)
runs-on: ubuntu-latest
permissions:
contents: none
outputs:
short_sha: ${{ steps.get_short_sha.outputs.SHORT_SHA }}
cmake_build_type: ${{ steps.detect_build_type.outputs.CMAKE_BUILD_TYPE }}
build_type: ${{ steps.detect_build_type.outputs.BUILD_TYPE }}
full_lto: ${{ steps.determine_lto_type.outputs.FULL_LTO }}
lto_ldflags: ${{ steps.determine_lto_type.outputs.LTO_LDFLAGS }}
steps:
- name: Determine short Git commit SHA
id: get_short_sha
run: |
echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c 1-7`" | tee -a $GITHUB_OUTPUT
- name: Detect build types
id: detect_build_type
run: |
CMAKE_BUILD_TYPE=Release
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [[ "${{ github.event.inputs.debug-build }}" == "true" ]]; then
CMAKE_BUILD_TYPE=Debug
fi
fi
echo "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" | tee -a $GITHUB_OUTPUT
echo "BUILD_TYPE=${CMAKE_BUILD_TYPE,,}" | tee -a $GITHUB_OUTPUT
- name: Determine LTO type
id: determine_lto_type
run: |
FULL_LTO=OFF
LTO_LDFLAGS=""
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [[ "${{ github.event.inputs.full-lto }}" == "true" ]]; then
FULL_LTO=ON
LTO_LDFLAGS="-lto"
fi
fi
echo "FULL_LTO=${FULL_LTO}" | tee -a $GITHUB_OUTPUT
echo "LTO_LDFLAGS=${LTO_LDFLAGS}" | tee -a $GITHUB_OUTPUT
src:
name: Prepare (source)
runs-on: ubuntu-latest
steps:
- name: Prepare
run: |
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends --no-install-suggests patch cmake ninja-build
- name: Prepare (Git)
run: |
git config --global user.email "[email protected]"
git config --global user.name "Example user"
- name: Prepare (checkout)
uses: actions/checkout@v4
- name: Prepare (submodule)
run: |
./scripts/clone_submodules.sh
for _repo in $(git submodule foreach --recursive --quiet 'env'); do
git config --global --add safe.directory "$_repo"
done
unset _repo
- name: Package source
run: |
CC=true cmake -B build -G Ninja -DCMAKE_C_COMPILER_WORKS=YES -DWITHOUT_BUILD=ON
cmake --build build -t package_source -v
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: srcpkg
if-no-files-found: error
path: ${{ github.workspace }}/build/magiskboot_*-src.tar.xz
build-android:
name: Build (Android)
runs-on: ubuntu-latest
permissions:
actions: write
needs: [vars]
env:
api_level: 24
target_arch: arm64-v8a
ondk_url: https://github.com/topjohnwu/ondk/releases/download
ondk_ver: 'r26.4'
vcpkg_triplet: arm64-android
rust_target: aarch64-linux-android
steps:
- name: Prepare (Host)
run: |
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y wget tar file \
build-essential pkg-config cmake ninja-build
- name: Cache (ONDK)
id: cache-ondk
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/${{ env.progname }}-ondk
key: ondk-${{ env.ondk_ver }}-${{ runner.os }}
- name: Prepare (ONDK)
if: steps.cache-ondk.outputs.cache-hit != 'true'
run: |
rm -rf ${{ env.progname }}-ondk.tar.xz $GITHUB_WORKSPACE/${{ env.progname }}-ondk
wget ${{ env.ondk_url }}/${{ env.ondk_ver }}/ondk-${{ env.ondk_ver }}-linux.tar.xz \
-O ${{ env.progname }}-ondk.tar.xz
mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-ondk
tar -x -f ${{ env.progname }}-ondk.tar.xz -C $GITHUB_WORKSPACE/${{ env.progname }}-ondk --strip-components=1
rm -f ${{ env.progname }}-ondk.tar.xz
- name: Prepare (Environment)
run: |
echo "vcpkg_root=$VCPKG_INSTALLATION_ROOT" | tee -a $GITHUB_ENV
echo "ANDROID_NDK_HOME=$GITHUB_WORKSPACE/${{ env.progname }}-ondk" | tee -a $GITHUB_ENV
echo "$GITHUB_WORKSPACE/${{ env.progname }}-ondk/toolchains/rust/bin" | tee -a $GITHUB_PATH
- name: Cache (Cross)
id: cache-cross-vcpkgs
uses: actions/cache@v4
with:
path: ${{ env.vcpkg_root }}/installed
key: cross-vcpkgs-${{ env.vcpkg_triplet }}-ondk-${{ env.ondk_ver }}
- name: Prepare (liblzma)
if: steps.cache-cross-vcpkgs.outputs.cache-hit != 'true'
run: |
# SECURITY: Git tarballs are currently not affected by the vulnerability
# TODO: remove 5.6.0 when vcpkg and github runner image updates
# TODO: remove this workaround when the repo is back
mkdir -p $VCPKG_INSTALLATION_ROOT/downloads
for xz_ver in 5.4.4 5.6.0; do
wget https://github.com/bminor/xz/archive/refs/tags/v${xz_ver}.tar.gz \
-O $VCPKG_INSTALLATION_ROOT/downloads/tukaani-project-xz-v${xz_ver}.tar.gz
done
- name: Prepare (Cross)
run: |
vcpkg install --host-triplet=${{ env.vcpkg_triplet }} zlib liblzma lz4 bzip2
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DRust_CARGO_TARGET=${{ env.rust_target }} -DRUST_BUILD_STD=ON \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ needs.vars.outputs.lto_ldflags }}" \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DANDROID_PLATFORM=${{ env.api_level }} -DANDROID_ABI=${{ env.target_arch }} \
-DVCPKG_TARGET_TRIPLET=${{ env.vcpkg_triplet }} \
-DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
file build/magiskboot*
readelf -d build/magiskboot* || true
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-linux:
name: Build (Linux)
runs-on: ubuntu-latest
permissions:
actions: write
needs: [vars]
strategy:
matrix:
include:
- os: "ubuntu"
tag: "jammy"
# XXX: llvm ver is older than rust
full_lto: "OFF"
lto_ldflags: ""
- os: "alpine"
tag: "edge"
full_lto: ${{ needs.vars.outputs.full_lto }}
lto_ldflags: ${{ needs.vars.outputs.lto_ldflags }}
container:
image: ${{ matrix.os }}:${{ matrix.tag }}
volumes:
- ${{ github.workspace }}:/magiskboot_workspace
# New versions of glibc use the new clone3() syscall which has not
# yet been whitelisted in GitHub's secomp profile. To prevent jobs
# using these distros from failing (e.g. openSUSE) change the
# secomp policy.
#
# See https://github.com/nmeum/android-tools/pull/48#issuecomment-944893176
options: --security-opt seccomp=unconfined
steps:
- name: Prepare (Ubuntu)
if: matrix.os == 'ubuntu'
run: |
apt update
DEBIAN_FRONTEND=noninteractive apt install -y wget tar file xxd \
build-essential liblzma-dev liblz4-dev libbz2-dev zlib1g-dev pkg-config clang-15 \
lld-15 libc++-15-dev libc++abi-15-dev cmake ninja-build rustc cargo
ln -s $(which clang-15) $(dirname $(which clang-15))/clang
ln -s $(which clang++-15) $(dirname $(which clang-15))/clang++
- name: Prepare (Alpine Linux)
if: matrix.os == 'alpine'
run: |
apk update
apk add build-base linux-headers bash wget file xxd xz-dev lz4-dev bzip2-dev zlib-dev \
pkgconf clang lld libc++-dev cmake samurai rust cargo
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
CC=clang CXX=clang++ cmake -G Ninja -B build \
-DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ matrix.lto_ldflags }}" \
-DFULL_RUST_LTO=${{ matrix.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
file build/magiskboot*
ldd build/magiskboot* || true
./build/magiskboot* || true
rm -rf /magiskboot_workspace/${{ env.progname }}-out
mkdir -p /magiskboot_workspace/${{ env.progname }}-out
cp -afv build/magiskboot* /magiskboot_workspace/${{ env.progname }}-out
- name: Check
run: |
cd magiskboot_*-src/
./scripts/magiskboot_test.sh /magiskboot_workspace/${{ env.progname }}-out/magiskboot*
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-macos:
name: Build (macOS)
strategy:
matrix:
os_release: [12, 14]
runs-on: macos-${{ matrix.os_release }}
permissions:
actions: write
needs: [vars]
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
upload_suffix: "standalone"
steps:
- name: Prepare
run: |
brew update
# HACK: ignore werid symlink conflict
brew install --overwrite coreutils wget file xz lz4 pkg-config cmake ninja llvm rust || true
brew install --overwrite coreutils wget file xz lz4 pkg-config cmake ninja llvm rust
echo "$(brew --prefix)/opt/llvm/bin" | tee -a $GITHUB_PATH
- name: Prepare (Detect)
id: detect-runner
run: |
echo "uname_mach=$(uname -m)" | tee -a $GITHUB_OUTPUT
- name: Fix up Rust
if: matrix.os_release == 13
run: |
rm -rf ~/.cargo/registry/index
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
CC=clang CXX=clang++ cmake -G Ninja -B build -DCMAKE_AR=llvm-ar -DCMAKE_RANLIB=llvm-ranlib \
-DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ needs.vars.outputs.lto_ldflags }}" \
-DPREFER_STATIC_LINKING=ON -DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
strip build/magiskboot*
file build/magiskboot*
otool -L build/magiskboot*
./build/magiskboot* || true
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-out && mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-out
cp -afv build/magiskboot* $GITHUB_WORKSPACE/${{ env.progname }}-out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.progname }}-${{ needs.vars.outputs.short_sha }}-${{ needs.vars.outputs.build_type }}-macos-${{ matrix.os_release }}-${{ steps.detect-runner.outputs.uname_mach }}-${{ env.upload_suffix }}
path: ${{ github.workspace }}/${{ env.progname }}-out/magiskboot*
- name: Check
run: |
cd magiskboot_*-src/
./scripts/magiskboot_test.sh $GITHUB_WORKSPACE/${{ env.progname }}-out/magiskboot*
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-macos-cross:
name: Build (macOS) (Cross)
strategy:
matrix:
include:
- os_release: 14
# yeah crossing x86_64 from arm64 host now...
arch: "x86_64"
cmake_arch: "x86_64"
clang_target: "x86_64-apple-darwin"
vcpkg_triplet: "x64-osx"
rust_target: "x86_64-apple-darwin"
runs-on: macos-${{ matrix.os_release }}
permissions:
actions: write
needs: [vars]
env:
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK: 1
# only used on ARM64 runners,
# since there is no preinstalled Vcpkg on them
vcpkg_ver: 2024.01.12
upload_suffix: "standalone"
steps:
- name: Prepare (Host)
run: |
brew update
# HACK: ignore werid symlink conflict
brew install --overwrite coreutils file pkg-config cmake ninja llvm || true
brew install --overwrite coreutils file pkg-config cmake ninja llvm
- name: Prepare (Detect)
id: detect-runner
run: |
if [[ -z "${VCPKG_INSTALLATION_ROOT}" ]]; then
echo "has_vcpkg=false" | tee -a $GITHUB_OUTPUT
else
echo "has_vcpkg=true" | tee -a $GITHUB_OUTPUT
fi
- name: Cache (Vcpkg Bootstrap)
id: cache-vcpkg-boot
if: steps.detect-runner.outputs.has_vcpkg != 'true'
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/${{ env.progname }}-vcpkg-strap
key: vcpkg-${{ env.vcpkg_ver }}-${{ runner.os }}-${{ matrix.os_release }}-${{ runner.arch }}
- name: Prepare (Vcpkg source)
if: steps.detect-runner.outputs.has_vcpkg != 'true' && steps.cache-vcpkg-boot.outputs.cache-hit != 'true'
uses: actions/checkout@v4
with:
repository: microsoft/vcpkg
ref: ${{ env.vcpkg_ver }}
path: ${{ env.progname }}-vcpkg-strap
- name: Prepare (Vcpkg Bootstrap)
if: steps.detect-runner.outputs.has_vcpkg != 'true' && steps.cache-vcpkg-boot.outputs.cache-hit != 'true'
run: |
cd ${{ env.progname }}-vcpkg-strap
./bootstrap-vcpkg.sh
- name: Prepare (Vcpkg)
if: steps.detect-runner.outputs.has_vcpkg != 'true'
run: |
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-vcpkg/
cp -af $GITHUB_WORKSPACE/${{ env.progname }}-vcpkg-strap/ \
$GITHUB_WORKSPACE/${{ env.progname }}-vcpkg/
VCPKG_INSTALLATION_ROOT="${GITHUB_WORKSPACE}/${{ env.progname }}-vcpkg"
echo "${VCPKG_INSTALLATION_ROOT}" | tee -a $GITHUB_PATH
echo "VCPKG_INSTALLATION_ROOT=${VCPKG_INSTALLATION_ROOT}" | tee -a $GITHUB_ENV
- name: Prepare (Environment)
run: |
echo "vcpkg_root=$VCPKG_INSTALLATION_ROOT" | tee -a $GITHUB_ENV
- name: Cache (Cross)
id: cache-cross-vcpkgs
uses: actions/cache@v4
with:
path: ${{ env.vcpkg_root }}/installed
key: cross-vcpkgs-v2-${{ matrix.vcpkg_triplet }}-appleclang-macos-${{ matrix.os_release }}
- name: Prepare (liblzma)
if: steps.cache-cross-vcpkgs.outputs.cache-hit != 'true'
run: |
# SECURITY: Git tarballs are currently not affected by the vulnerability
# TODO: remove 5.6.0 when vcpkg and github runner image updates
# TODO: remove this workaround when the repo is back
mkdir -p $VCPKG_INSTALLATION_ROOT/downloads
for xz_ver in 5.4.4 5.6.0; do
wget https://github.com/bminor/xz/archive/refs/tags/v${xz_ver}.tar.gz \
-O $VCPKG_INSTALLATION_ROOT/downloads/tukaani-project-xz-v${xz_ver}.tar.gz
done
- name: Prepare (Cross)
run: |
vcpkg install --host-triplet=${{ matrix.vcpkg_triplet }} liblzma lz4
- name: Prepare (PATH)
run: |
echo "$(brew --prefix)/opt/llvm/bin" | tee -a $GITHUB_PATH
- name: Prepare (Rust)
run: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
. "$HOME/.cargo/env"
rustup target add ${{ matrix.rust_target }}
- name: Fix up Rust
if: matrix.os_release == 13
run: |
rm -rf ~/.cargo/registry/index
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
. "$HOME/.cargo/env"
CC=clang CXX=clang++ cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DCMAKE_SYSTEM_PROCESSOR=${{ matrix.cmake_arch }} -DCMAKE_SYSTEM_NAME=Darwin \
-DCMAKE_C_COMPILER_TARGET=${{ matrix.clang_target }} -DCMAKE_CXX_COMPILER_TARGET=${{ matrix.clang_target }} \
-DCMAKE_AR=llvm-ar -DCMAKE_RANLIB=llvm-ranlib \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ needs.vars.outputs.lto_ldflags }}" \
-DRust_CARGO_TARGET=${{ matrix.rust_target }} -DPREFER_STATIC_LINKING=ON \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_triplet }} \
-DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
strip build/magiskboot*
file build/magiskboot*
otool -L build/magiskboot*
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-out && mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-out
cp -afv build/magiskboot* $GITHUB_WORKSPACE/${{ env.progname }}-out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.progname }}-${{ needs.vars.outputs.short_sha }}-${{ needs.vars.outputs.build_type }}-macos-${{ matrix.os_release }}-${{ matrix.arch }}-${{ env.upload_suffix }}
path: ${{ github.workspace }}/${{ env.progname }}-out/magiskboot*
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-windows:
name: Build (Windows)
runs-on: windows-latest
permissions:
actions: write
needs: [vars]
env:
MSYS: "winsymlinks:native"
msystem: CLANG64
note: "ucrt-x86_64-standalone"
upload_prefix: "windows-mingw-w64"
steps:
- name: Prepare
uses: msys2/setup-msys2@v2
with:
msystem: ${{ env.msystem }}
update: true
# installing vim for xxd
install: >-
base-devel file wget vim
pacboy: >-
xz:p lz4:p bzip2:p zlib:p pkgconf:p clang:p
lld:p cmake:p libc++:p ninja:p rust:p
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
shell: msys2 {0}
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
CC=clang CXX=clang++ cmake -G Ninja -B build \
-DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ needs.vars.outputs.lto_ldflags }}" \
-DPREFER_STATIC_LINKING=ON -DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
strip build/magiskboot*.exe
file build/magiskboot*.exe
ldd build/magiskboot*.exe
./build/magiskboot*.exe || true
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-out && mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-out
cp -afv build/magiskboot*.exe $GITHUB_WORKSPACE/${{ env.progname }}-out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.progname }}-${{ needs.vars.outputs.short_sha }}-${{ needs.vars.outputs.build_type }}-${{ env.upload_prefix }}-${{ env.note }}
path: ${{ github.workspace }}/${{ env.progname }}-out/magiskboot*.exe
- name: Check
shell: msys2 {0}
run: |
cd magiskboot_*-src/
find $GITHUB_WORKSPACE/${{ env.progname }}-out -name magiskboot\*.exe -exec ./scripts/magiskboot_test.sh {} +
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-windows-cross:
name: Build (Windows) (Cross)
runs-on: ubuntu-latest
permissions:
actions: write
needs: [vars]
strategy:
matrix:
include:
- crt: msvcrt
upload_suffix: "i686-standalone"
cmake_arch: x86
cc: i686-w64-mingw32-clang
cxx: i686-w64-mingw32-clang++
strip: i686-w64-mingw32-strip
vcpkg_triplet: x86-mingw-static
rust_target: i686-pc-windows-gnu
build_rust_std: "OFF"
- crt: ucrt
upload_suffix: "arm64-standalone"
cmake_arch: aarch64
cc: aarch64-w64-mingw32-clang
cxx: aarch64-w64-mingw32-clang++
strip: aarch64-w64-mingw32-strip
# XXX: what? why this wasn't detected by Corrosion automatically?
ldlibs: "-lbcrypt"
vcpkg_triplet: arm64-mingw-static
rust_target: aarch64-pc-windows-gnullvm
build_rust_std: "ON"
env:
toolchain_url: https://github.com/mstorsjo/llvm-mingw/releases/download
toolchain_ver: 20240404
upload_prefix: "windows-mingw-w64"
steps:
- name: Prepare (Host)
run: |
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y curl wget tar file \
build-essential pkg-config cmake ninja-build
- name: Cache (LLVM MinGW)
id: cache-llvm-mingw
uses: actions/cache@v4
with:
path: ${{ github.workspace }}/${{ env.progname }}-llvm-mingw
key: llvm-mingw-${{ env.toolchain_ver }}-${{ matrix.crt }}-${{ runner.os }}
- name: Prepare (LLVM MinGW)
if: steps.cache-llvm-mingw.outputs.cache-hit != 'true'
run: |
rm -rf ${{ env.progname }}-llvm-mingw.tar.xz $GITHUB_WORKSPACE/${{ env.progname }}-llvm-mingw
wget ${{ env.toolchain_url }}/${{ env.toolchain_ver }}/llvm-mingw-${{ env.toolchain_ver }}-${{ matrix.crt }}-ubuntu-20.04-x86_64.tar.xz \
-O ${{ env.progname }}-llvm-mingw.tar.xz
mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-llvm-mingw
tar -x -f ${{ env.progname }}-llvm-mingw.tar.xz -C $GITHUB_WORKSPACE/${{ env.progname }}-llvm-mingw --strip-components=1
rm -f ${{ env.progname }}-llvm-mingw.tar.xz
- name: Prepare (PATH)
run: |
echo "$GITHUB_WORKSPACE/${{ env.progname }}-llvm-mingw/bin" | tee -a $GITHUB_PATH
- name: Prepare (Environment)
run: |
echo "vcpkg_root=$VCPKG_INSTALLATION_ROOT" | tee -a $GITHUB_ENV
- name: Cache (Cross)
id: cache-cross-vcpkgs
uses: actions/cache@v4
with:
path: ${{ env.vcpkg_root }}/installed
key: cross-vcpkgs-${{ matrix.vcpkg_triplet }}-llvm-mingw-${{ env.toolchain_ver }}-${{ matrix.crt }}
- name: Prepare (liblzma)
if: steps.cache-cross-vcpkgs.outputs.cache-hit != 'true'
run: |
# SECURITY: Git tarballs are currently not affected by the vulnerability
# TODO: remove 5.6.0 when vcpkg and github runner image updates
# TODO: remove this workaround when the repo is back
mkdir -p $VCPKG_INSTALLATION_ROOT/downloads
for xz_ver in 5.4.4 5.6.0; do
wget https://github.com/bminor/xz/archive/refs/tags/v${xz_ver}.tar.gz \
-O $VCPKG_INSTALLATION_ROOT/downloads/tukaani-project-xz-v${xz_ver}.tar.gz
done
- name: Prepare (Cross)
run: |
vcpkg install --host-triplet=${{ matrix.vcpkg_triplet }} zlib liblzma lz4 bzip2
- name: Prepare (Rust)
if: matrix.build_rust_std == 'OFF'
run: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
- name: Prepare (Nightly Rust)
if: matrix.build_rust_std == 'ON'
run: |
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly
- name: Prepare (Rust STD)
if: matrix.build_rust_std == 'OFF'
run: |
. "$HOME/.cargo/env"
rustup target add ${{ matrix.rust_target }}
- name: Prepare (Rust source)
if: matrix.build_rust_std == 'ON'
run: |
. "$HOME/.cargo/env"
rustup component add rust-src
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
. "$HOME/.cargo/env"
CC=${{ matrix.cc }} CXX=${{ matrix.cxx }} cmake -G Ninja -B build -DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} \
-DCMAKE_SYSTEM_PROCESSOR=${{ matrix.cmake_arch }} -DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_EXE_LINKER_FLAGS=" ${{ matrix.ldlibs }} ${{ needs.vars.outputs.lto_ldflags }}" \
-DRust_CARGO_TARGET=${{ matrix.rust_target }} -DRUST_BUILD_STD=${{ matrix.build_rust_std }} -DPREFER_STATIC_LINKING=ON \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=${{ matrix.vcpkg_triplet }} -DMINGW=TRUE \
-DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }}
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
${{ matrix.strip }} build/magiskboot*.exe
file build/magiskboot*.exe
strings build/magiskboot*.exe | grep -iE '^(\w|[-.])*\.dll$'
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-out && mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-out
cp -afv build/magiskboot*.exe $GITHUB_WORKSPACE/${{ env.progname }}-out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.progname }}-${{ needs.vars.outputs.short_sha }}-${{ needs.vars.outputs.build_type }}-${{ env.upload_prefix }}-${{ matrix.crt }}-${{ matrix.upload_suffix }}
path: ${{ github.workspace }}/${{ env.progname }}-out/magiskboot*.exe
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]
build-wasm:
name: Build (WebAssembly)
runs-on: ubuntu-latest
permissions:
actions: write
needs: [vars]
env:
vcpkg_triplet: "wasm32-emscripten"
emsdk_ver: 3.1.56
emsdk_cache_dir: "emsdk-cache"
rust_target: "wasm32-unknown-emscripten"
upload_suffix: "emscripten-wasm32-noderawfs-static"
steps:
- name: Prepare (Host)
run: |
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y curl tar file \
build-essential pkg-config cmake ninja-build nodejs
- name: Cache (Emscripten)
id: cache-emsdk-system-libs
uses: actions/cache@v4
with:
path: ${{ env.emsdk_cache_dir }}
key: emsdk-${{ env.emsdk_ver }}-${{ runner.os }}
- name: Prepare (Emscripten)
uses: mymindstorm/setup-emsdk@v13
with:
version: ${{ env.emsdk_ver }}
actions-cache-folder: ${{ env.emsdk_cache_dir }}
- name: Prepare (Environment)
run: |
echo "vcpkg_root=$VCPKG_INSTALLATION_ROOT" | tee -a $GITHUB_ENV
- name: Cache (Cross)
id: cache-cross-vcpkgs
uses: actions/cache@v4
with:
path: ${{ env.vcpkg_root }}/installed
key: cross-vcpkgs-${{ env.vcpkg_triplet }}-emsdk-${{ env.emsdk_ver }}
- name: Prepare (liblzma)
if: steps.cache-cross-vcpkgs.outputs.cache-hit != 'true'
run: |
# SECURITY: Git tarballs are currently not affected by the vulnerability
# TODO: remove 5.6.0 when vcpkg and github runner image updates
# TODO: remove this workaround when the repo is back
mkdir -p $VCPKG_INSTALLATION_ROOT/downloads
for xz_ver in 5.4.4 5.6.0; do
wget https://github.com/bminor/xz/archive/refs/tags/v${xz_ver}.tar.gz \
-O $VCPKG_INSTALLATION_ROOT/downloads/tukaani-project-xz-v${xz_ver}.tar.gz
done
- name: Prepare (Cross)
run: |
vcpkg install --host-triplet=${{ env.vcpkg_triplet }} \
zlib liblzma lz4 bzip2
# rust from ubuntu is quite old so use rustup
- name: Prepare (Rust)
run: |
curl https://sh.rustup.rs -sSf | sh -s -- -y
. "$HOME/.cargo/env"
rustup component add rust-src
- name: Synchronize (source)
uses: yogeshlonkar/[email protected]
with:
jobs: 'Prepare (source)'
- name: Prepare (source)
uses: actions/download-artifact@v4
with:
name: srcpkg
- name: Build
run: |
echo -e "\n### extract source ###\n"
tar -xf magiskboot_*-src.tar.xz
cd magiskboot_*-src/
echo -e "\n### configure ###\n"
. "$HOME/.cargo/env"
emcmake cmake -G Ninja -B build -DCMAKE_EXE_LINKER_FLAGS=" ${{ needs.vars.outputs.lto_ldflags }} -sNODERAWFS" \
-DRust_CARGO_TARGET=${{ env.rust_target }} -DRUST_BUILD_STD=ON -DRUSTC_BOOTSTRAP=1 \
-DFULL_RUST_LTO=${{ needs.vars.outputs.full_lto }} \
-DCMAKE_BUILD_TYPE=${{ needs.vars.outputs.cmake_build_type }} -DPREFER_STATIC_LINKING=ON \
-DCMAKE_TOOLCHAIN_FILE=$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=${{ env.vcpkg_triplet }} \
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE="$(dirname $(which emcc))/cmake/Modules/Platform/Emscripten.cmake"
echo -e "\n### build ###\n"
cmake --build build -j $(nproc) -v
emstrip build/magiskboot*.wasm
file build/magiskboot*
node ./build/magiskboot*.js || true
rm -rf $GITHUB_WORKSPACE/${{ env.progname }}-out && mkdir -p $GITHUB_WORKSPACE/${{ env.progname }}-out
cp -afv build/magiskboot* $GITHUB_WORKSPACE/${{ env.progname }}-out
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
if-no-files-found: error
name: ${{ env.progname }}-${{ needs.vars.outputs.short_sha }}-${{ needs.vars.outputs.build_type }}-${{ env.upload_suffix }}
path: ${{ github.workspace }}/${{ env.progname }}-out/magiskboot*
- name: Check
run: |
cd magiskboot_*-src/
./scripts/magiskboot_test.sh $GITHUB_WORKSPACE/${{ env.progname }}-out/magiskboot*.js
# Fail fast
- name: Cancel other jobs
if: failure()
uses: andymckay/[email protected]