Skip to content

Commit

Permalink
Build native MinGW toolchain packages
Browse files Browse the repository at this point in the history
  • Loading branch information
Blackhex committed Oct 8, 2024
1 parent 916a5c8 commit 336a5f3
Show file tree
Hide file tree
Showing 24 changed files with 1,306 additions and 413 deletions.
20 changes: 13 additions & 7 deletions .github/scripts/build-package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,18 @@ ARGUMENTS="--syncdeps \
$([ "$CLEAN_BUILD" = 1 ] && echo "--cleanbuild" || echo "") \
$([ "$INSTALL_PACKAGE" = 1 ] && echo "--install" || echo "")"

ccache -svv || true
echo "::group::Ccache statistics before build"
ccache -svv || true
echo "::endgroup::"

if [[ "$PACKAGE_REPOSITORY" == *MINGW* ]]; then
makepkg-mingw $ARGUMENTS
else
makepkg $ARGUMENTS
fi
echo "::group::Build package"
if [[ "$PACKAGE_REPOSITORY" == *MINGW* ]]; then
makepkg-mingw $ARGUMENTS
else
makepkg $ARGUMENTS
fi
echo "::endgroup::"

ccache -svv || true
echo "::group::Ccache statistics after build"
ccache -svv || true
echo "::endgroup::"
19 changes: 19 additions & 0 deletions .github/scripts/create-repository.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/bin/bash

set -e # exit on error
set -x # echo on
set -o pipefail # fail of any command in pipeline is an error

echo "::group::Create MSYS2 packages repository"
mkdir -p repository/msys/x86_64
mv -f mingw-w64-cross-*.pkg.* repository/msys/x86_64/
pushd repository/msys/x86_64
repo-add woarm64-cross.db.tar.gz *.pkg.*
popd

mkdir -p repository/mingw/aarch64
mv -f mingw-w64-aarch64-*.pkg.* repository/mingw/aarch64/
pushd repository/mingw/aarch64
repo-add woarm64-native.db.tar.gz *.pkg.*
popd
echo "::endgroup::"
10 changes: 6 additions & 4 deletions .github/scripts/download-artifacts.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ set -x # echo on
set -o pipefail # fail of any command in pipeline is an error

RUN_ID=$1
NEEDS=`echo "$2" | /mingw64/bin/jq 'keys|join(" ")' | sed 's/"//g'`

for NEED in $NEEDS; do
echo "Downloading $NEED artifact."
/mingw64/bin/gh run download $RUN_ID -n $NEED
for ARG in "${@:2}"; do
NEEDS=`echo "$ARG" | /mingw64/bin/jq 'keys|join(" ")' | sed 's/"//g'`
for NEED in $NEEDS; do
echo "Downloading $NEED artifact."
/mingw64/bin/gh run download $RUN_ID -n $NEED
done
done
17 changes: 16 additions & 1 deletion .github/scripts/enable-ccache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ set -o pipefail # fail of any command in pipeline is an error

DIR="`dirname ${BASH_SOURCE[0]}`/../.."
DIR=`realpath $DIR`
CCACHE_DIR=$DIR/ccache
if [[ -n "$GITHUB_WORKSPACE" ]]; then
echo "CCACHE_DIR=$DIR/ccache" >> "$GITHUB_ENV"
echo "CCACHE_DIR=$CCACHE_DIR" >> "$GITHUB_ENV"
echo timestamp=$(date -u --iso-8601=seconds) >> "$GITHUB_OUTPUT"
fi

mkdir -p $CCACHE_DIR

pushd /
echo "::group::/etc/makepkg.conf"
patch -p1 -b -i "$DIR/patches/ccache/0001-makepkg.patch"
Expand All @@ -22,3 +25,15 @@ pushd /
cat /etc/makepkg_mingw.conf
echo "::endgroup::"
popd

pacman -S --noconfirm ccache

pushd /usr/lib/ccache/bin
echo "::group::Add aarch64 toolchain to ccache"
export MSYS=winsymlinks
ln -sf /usr/bin/ccache aarch64-w64-mingw32-c++
ln -sf /usr/bin/ccache aarch64-w64-mingw32-g++
ln -sf /usr/bin/ccache aarch64-w64-mingw32-gcc
ln -sf /usr/bin/true makeinfo
echo "::endgroup::"
popd
32 changes: 32 additions & 0 deletions .github/scripts/pacman-workaround.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash

set -e # exit on error
set -x # echo on
set -o pipefail # fail of any command in pipeline is an error

if [ -z "$GITHUB_WORKSPACE" ]; then
DIR=`pwd`
else
DIR=`cygpath "$GITHUB_WORKSPACE"`
fi

echo "::group::Pacman hang workaround"
while ! timeout -k 15s 10s pacman -U --noconfirm "$DIR/patches/pacman/pacman-6.1.0-4-x86_64.pkg.tar.zst"
do
echo "Command failed, retrying..."
done
echo "::endgroup::"

echo "::group::Install patch"
pacman -S --noconfirm patch
echo "::endgroup::"

pushd /
echo "::group::Pin pacman packages"
patch -p1 -b -i "$DIR/patches/pacman/0001-pin-packages.patch"
echo "::endgroup::"

echo "::group::/etc/pacman.conf"
cat /etc/pacman.conf
echo "::endgroup::"
popd
39 changes: 39 additions & 0 deletions .github/scripts/setup-mingwarm64.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

set -e # exit on error
set -x # echo on
set -o pipefail # fail of any command in pipeline is an error

if [ -z "$GITHUB_WORKSPACE" ]; then
DIR=`pwd`
else
DIR=`cygpath "$GITHUB_WORKSPACE"`
fi

echo "::group::Install patch"
pacman -S --noconfirm patch
echo "::endgroup::"

pushd /
echo "::group::Patch MSYS2 environment"
patch -p1 -b -i "$DIR/patches/makepkg/0001-mingwarm64.patch"
if [[ "$CROSS_BUILD" = "1" ]]; then
patch -p1 -b -i "$DIR/patches/makepkg/0002-mingwarm64-cross-build.patch"
fi
if [[ "$DEBUG_BUILD" = "1" ]]; then
patch -p1 -b -i "$DIR/patches/makepkg/0003-enable-debug.patch"
fi
echo "::endgroup::"

echo "::group::/etc/makepkg_mingw.conf"
cat /etc/makepkg_mingw.conf
echo "::endgroup::"

echo "::group::/etc/profile"
cat /etc/profile
echo "::endgroup::"

echo "::group::/usr/share/makepkg/tidy/strip.sh"
cat /usr/share/makepkg/tidy/strip.sh
echo "::endgroup::"
popd
2 changes: 1 addition & 1 deletion .github/scripts/setup-repository.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ pushd /
echo "::endgroup::"

echo "::group::Add WoArm64 repository"
patch -p1 -b -i "$DIR/patches/pacman/0001-add-woarm64-repository.patch"
patch -p1 -b -i "$DIR/patches/pacman/0002-add-woarm64-repositories.patch"
echo "::endgroup::"

echo "::group::Update packages database"
Expand Down
135 changes: 100 additions & 35 deletions .github/workflows/build-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@ on:
package_name:
description: "Package name to build"
type: string
needs:
description: "Parent workflow job dependencies"
type: string
dependencies:
description: "Install additional dependencies"
type: string
default: ""
packages_repository:
description: "MSYS2 packages repository to build from"
type: string
Expand All @@ -21,37 +14,114 @@ on:
description: "MSYS2 packages branch to build from"
type: string
default: "woarm64"
runner_arch:
description: "Architecture to build on"
type: string
default: "x86_64"
needs:
description: "Parent workflow job dependencies"
type: string
dependencies:
description: "Install additional dependencies"
type: string
default: ""

defaults:
run:
shell: msys2 {0}

env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROSS_BUILD: ${{ inputs.runner_arch == 'aarch64' && '1' || '0' }}
CLEAN_BUILD: 1

jobs:
build:
name: Build ${{ inputs.package_name }}
runs-on: windows-latest
runs-on: >-
${{ fromJson(inputs.runner_arch == 'aarch64'
&& '["Windows", "ARM64", "Blackhex"]'
|| '["windows-latest"]') }}
steps:
- uses: msys2/setup-msys2@v2
- name: Kill hanging processes
if: ${{ inputs.runner_arch == 'aarch64' }}
shell: powershell
run: |
tasklist
taskkill /F /FI 'MODULES eq msys-2.0.dll'
tasklist
Set-Location "${{ github.workspace }}"
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue -Path packages
exit 0
- name: Fix Git long paths
if: ${{ inputs.runner_arch == 'aarch64' }}
shell: powershell
run: |
git config --global core.longpaths true
- name: Fix $PATH
if: ${{ inputs.runner_arch == 'aarch64' }}
shell: powershell
run: |
Write-Output "GITHUB_PATH: $env:GITHUB_PATH"
Write-Output "C:\Program Files\Git\usr\bin\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- uses: Windows-on-ARM-Experiments/setup-msys2@main
timeout-minutes: 10
with:
msystem: ${{ contains(inputs.packages_repository, 'MINGW') && 'MINGW64' || 'MSYS' }}
update: true
cache: true
msystem: >-
${{ contains(inputs.packages_repository, 'MINGW')
&& ((inputs.runner_arch == 'aarch64') && 'MINGWARM64' || 'MINGW64')
|| 'MSYS' }}
update: ${{ inputs.runner_arch == 'x86_64' }}
cache: ${{ inputs.runner_arch == 'x86_64' }}

- name: Checkout repository
uses: actions/checkout@v4

- name: Install dependencies
- name: Checkout ${{ inputs.packages_repository }} repository
uses: actions/checkout@v4
with:
repository: ${{ inputs.packages_repository }}
ref: ${{ inputs.packages_branch }}
sparse-checkout: ${{ inputs.package_name }}
path: ${{ github.workspace }}/packages

- name: Pacman hang workaround
if: ${{ inputs.runner_arch == 'aarch64' }}
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/pacman-workaround.sh
- name: First MSYS2 update
if: ${{ inputs.runner_arch == 'aarch64' }}
shell: powershell
run: |
msys2 -c 'pacman -Syuu --noconfirm'
exit 0
- name: Second MSYS2 update
if: ${{ inputs.runner_arch == 'aarch64' }}
shell: powershell
run: |
msys2 -c 'pacman -Syuu --noconfirm'
- name: Setup packages repository
if: ${{ inputs.runner_arch == 'aarch64' }}
run: |
pacman -S --noconfirm \
git \
mingw-w64-x86_64-github-cli \
mingw-w64-x86_64-jq \
base-devel \
${{ contains(inputs.packages_repository, 'MINGW') && 'mingw-w64-cross-gcc mingw-w64-x86_64-ccache' || ' ccache' }} \
`cygpath "${{ github.workspace }}"`/.github/scripts/setup-repository.sh
- name: Install dependencies
run: >-
pacman -S --noconfirm
git
mingw-w64-x86_64-github-cli
mingw-w64-x86_64-jq
base-devel
${{ contains(inputs.packages_repository, 'MINGW')
&& 'mingw-w64-cross-mingwarm64-gcc mingw-w64-cross-mingwarm64-windows-default-manifest mingw-w64-x86_64-gcc-libs'
|| 'mingw-w64-aarch64-gcc' }}
${{ inputs.dependencies }}
- name: Download artifacts
Expand All @@ -69,51 +139,46 @@ jobs:
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/pthread-headers-hack-before.sh
- name: Checkout ${{ inputs.packages_repository }} repository
uses: actions/checkout@v4
with:
repository: ${{ inputs.packages_repository }}
ref: ${{ inputs.packages_branch }}
sparse-checkout: ${{ inputs.package_name }}
path: ${{ github.workspace }}/packages
- name: Setup MINGWARM64 environment
if: ${{ inputs.runner_arch == 'aarch64' }}
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/setup-mingwarm64.sh
- name: Enable Ccache
id: enable-ccache
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/enable-ccache.sh
- name: Restore Ccache
uses: actions/cache/restore@v4
uses: actions/cache/restore@v4
with:
path: ${{ github.workspace }}/ccache
key: main-ccache-${{ steps.enable-ccache.outputs.timestamp }}
restore-keys: main-ccache-
key: ${{ inputs.package_name }}-ccache-${{ steps.enable-ccache.outputs.timestamp }}
restore-keys: ${{ inputs.package_name }}-

- name: Build ${{ inputs.package_name }}
working-directory: ${{ github.workspace }}/packages/${{ inputs.package_name }}
run: |
ccache -svv || true
`cygpath "${{ github.workspace }}"`/.github/scripts/build-package.sh ${{ inputs.packages_repository }}
ccache -svv || true
- name: Save Ccache
if: always()
uses: actions/cache/save@v4
uses: actions/cache/save@v4
with:
path: ${{ github.workspace }}/ccache
key: main-ccache-${{ steps.enable-ccache.outputs.timestamp }}
key: ${{ inputs.package_name }}-ccache-${{ steps.enable-ccache.outputs.timestamp }}

- name: Upload ${{ inputs.package_name }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.package_name }}
retention-days: 1
retention-days: 7
path: ${{ github.workspace }}/packages/${{ inputs.package_name }}/*.pkg.tar.zst

- name: Upload build folder
if: failure()
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.package_name }}-build
retention-days: 1
retention-days: 3
path: ${{ github.workspace }}/packages/${{ inputs.package_name }}/src
Loading

0 comments on commit 336a5f3

Please sign in to comment.