Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Native MinGW toolchain #10

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
125 changes: 95 additions & 30 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: |
`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-gcc mingw-w64-x86_64-ccache' || ' ccache' }} \
${{ contains(inputs.packages_repository, 'MINGW')
&& 'mingw-w64-cross-mingwarm64-gcc mingw-w64-cross-mingwarm64-windows-default-manifest mingw-w64-x86_64-gcc-libs'
|| '' }} \
${{ 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
Loading