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 Jun 10, 2024
1 parent 3d2bf1e commit f3bdc5c
Show file tree
Hide file tree
Showing 10 changed files with 234 additions and 24 deletions.
2 changes: 1 addition & 1 deletion .github/scripts/build-package.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ ARGUMENTS="--syncdeps \
--force"

if [[ "$PACKAGE_REPOSITORY" == *MINGW* ]]; then
MINGW_ARCH=mingw64 makepkg-mingw $ARGUMENTS --skippgpcheck
makepkg-mingw $ARGUMENTS
else
makepkg $ARGUMENTS
fi
19 changes: 19 additions & 0 deletions .github/scripts/setup-cross-compilation.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

while ! timeout -k 15s 10s pacman -U --noconfirm `cygpath "$GITHUB_WORKSPACE"`/patches/pacman/pacman-6.1.0-4-x86_64.pkg.tar.zst
do
echo "Command failed, retrying..."
done

pushd /
pacman -S --noconfirm patch
patch -p1 -i `cygpath "$GITHUB_WORKSPACE"`/patches/makepkg/0001-cross-compilation.patch
cat /etc/pacman.conf
cat /etc/makepkg_mingw.conf
cat /etc/profile
cat /usr/share/makepkg/tidy/strip.sh
popd
2 changes: 1 addition & 1 deletion .github/scripts/setup-repository.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set -e # exit on error
set -x # echo on
set -o pipefail # fail of any command in pipeline is an error

pacman -Syuu --noconfirm
#pacman -Syuu --noconfirm

# Add WoArm64 custom repository.
REPO='[woarm64]
Expand Down
27 changes: 18 additions & 9 deletions .github/workflows/build-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ on:
description: "MSYS2 packages branch to build from"
type: string
default: "woarm64"
runs_on_arm64:
description: "Whether Arm64 runner is required"
type: boolean
default: false

defaults:
run:
Expand All @@ -31,17 +35,24 @@ env:

jobs:
build:
runs-on: windows-latest
runs-on: [Windows, ARM64, Blackhex]

steps:
- uses: msys2/setup-msys2@v2
with:
msystem: MSYS
update: true

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

- name: Kill hanging processes
shell: powershell
run: |
taskkill /t /f /im pacman.exe | Out-Null
taskkill /t /f /im make.exe | Out-Null
taskkill /t /f /im sh.exe | Out-Null
- name: Setup cross-compilation environment
if: ${{ inputs.runs_on_arm64 }}
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/setup-cross-compilation.sh
- name: Setup packages repository
run: |
`cygpath "${{ github.workspace }}"`/.github/scripts/setup-repository.sh
Expand All @@ -53,11 +64,9 @@ jobs:
git \
mingw-w64-x86_64-github-cli \
mingw-w64-x86_64-jq \
${{ inputs.runs_on_arm64 && 'mingw-w64-cross-gcc' || '' }} \
${{ inputs.dependencies }}
- name: Checkout repository
uses: actions/checkout@v4

- name: Checkout ${{ inputs.packages_repository }} repository
uses: actions/checkout@v4
with:
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- main
pull_request:
workflow_dispatch:
inputs:
msys2_packages_branch:
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/mingw-toolchain.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Build MinGW toolchain

on:
pull_request:
workflow_dispatch:
inputs:
mingw_packages_branch:
description: "MINGW-packages branch to build"
type: string
required: false
default: "woarm64"

jobs:
mingw-w64-binutils:
uses: ./.github/workflows/build-package.yml
with:
package_name: mingw-w64-binutils
packages_repository: Windows-on-ARM-Experiments/MINGW-packages
packages_branch: ${{ github.event.inputs.mingw_packages_branch || 'woarm64' }}
dependencies: mingw-w64-cross-gcc
runs_on_arm64: true
82 changes: 82 additions & 0 deletions build-native.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#!/bin/bash

set -e # exit on error
set -x # echo on

CLEAN_BUILD=${CLEAN_BUILD:-0}

MAKEPKG_OPTIONS="--syncdeps --rmdeps --noconfirm --noprogressbar --nocheck --skippgpcheck --force --install"
if [ "$CLEAN_BUILD" = 1 ] ; then
MAKEPKG_OPTIONS="$MAKEPKG_OPTIONS --cleanbuild"
fi

pacman -S --noconfirm base-devel

echo "::group::Build mingw-w64-headers-git"
pushd ../MINGW-packages/mingw-w64-headers-git
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-libiconv"
pushd ../MINGW-packages/mingw-w64-libiconv
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-gettext"
pushd ../MINGW-packages/mingw-w64-gettext
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-binutils"
pushd ../MINGW-packages/mingw-w64-binutils
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

exit 1

echo "::group::Build mingw-w64-gcc-stage1"
pushd ../MINGW-packages/mingw-w64-gcc-stage1
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-windows-default-manifest"
pushd ../MINGW-packages/mingw-w64-windows-default-manifest
makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-crt"
pushd ../MINGW-packages/mingw-w64-crt
pacman -S --noconfirm mingw-w64-winpthreads
cp /opt/x86_64-w64-mingw32/include/pthread_signal.h /opt/aarch64-w64-mingw32/include/
cp /opt/x86_64-w64-mingw32/include/pthread_unistd.h /opt/aarch64-w64-mingw32/include/
cp /opt/x86_64-w64-mingw32/include/pthread_time.h /opt/aarch64-w64-mingw32/include/

makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

fi

echo "::group::Build mingw-w64-winpthreads"
pushd ../MINGW-packages/mingw-w64-winpthreads
rm -f /opt/aarch64-w64-mingw32/include/pthread_signal.h
rm -f /opt/aarch64-w64-mingw32/include/pthread_unistd.h
rm -f /opt/aarch64-w64-mingw32/include/pthread_time.h

makepkg-mingw $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-gcc"
pushd ../MINGW-packages/mingw-w64-gcc
makepkg-mingw ${MAKEPKG_OPTIONS//--install/}
pacman -R --noconfirm mingw-w64-gcc-stage1 || true
pacman -U --noconfirm *.pkg.tar.zst
popd
echo "::endgroup::"
26 changes: 14 additions & 12 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ if [ "$CLEAN_BUILD" = 1 ] ; then
MAKEPKG_OPTIONS="$MAKEPKG_OPTIONS --cleanbuild"
fi

pacman -R mingw-w64-cross-gcc --noconfirm || true
pacman -R mingw-w64-cross-winpthreads --noconfirm || true
pacman -R mingw-w64-cross-crt --noconfirm || true
pacman -R mingw-w64-cross-windows-default-manifest --noconfirm || true
pacman -R mingw-w64-cross-gcc-stage1 --noconfirm || true
pacman -R mingw-w64-cross-binutils --noconfirm || true
pacman -R mingw-w64-cross-headers --noconfirm || true
pacman -R --noconfirm mingw-w64-cross-gcc || true
pacman -R --noconfirm mingw-w64-cross-winpthreads || true
pacman -R --noconfirm mingw-w64-cross-crt || true
pacman -R --noconfirm mingw-w64-cross-windows-default-manifest || true
pacman -R --noconfirm mingw-w64-cross-gcc-stage1 || true
pacman -R --noconfirm mingw-w64-cross-binutils || true
pacman -R --noconfirm mingw-w64-cross-headers || true

pacman -S --noconfirm base-devel

Expand Down Expand Up @@ -47,24 +47,26 @@ echo "::endgroup::"
echo "::group::Build mingw-w64-cross-crt"
pushd ../MSYS2-packages/mingw-w64-cross-crt
pacman -S --noconfirm mingw-w64-cross-winpthreads
cp /opt/x86_64-w64-mingw32/include/pthread_signal.h /opt/aarch64-w64-mingw32/include/
cp /opt/x86_64-w64-mingw32/include/pthread_unistd.h /opt/aarch64-w64-mingw32/include/
cp /opt/x86_64-w64-mingw32/include/pthread_time.h /opt/aarch64-w64-mingw32/include/
.github/scripts/pthread-header-fix.sh

makepkg $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-cross-winpthreads"
pushd ../MSYS2-packages/mingw-w64-cross-winpthreads
rm -f /opt/aarch64-w64-mingw32/include/pthread_signal.h
rm -f /opt/aarch64-w64-mingw32/include/pthread_unistd.h
rm -f /opt/aarch64-w64-mingw32/include/pthread_time.h

makepkg $MAKEPKG_OPTIONS
popd
echo "::endgroup::"

echo "::group::Build mingw-w64-cross-gcc"
pushd ../MSYS2-packages/mingw-w64-cross-gcc
makepkg ${MAKEPKG_OPTIONS//--install/}
pacman -R mingw-w64-cross-gcc-stage1 --noconfirm || true
pacman -U *.pkg.tar.zst --noconfirm
pacman -R --noconfirm mingw-w64-cross-gcc-stage1 || true
pacman -U --noconfirm *.pkg.tar.zst
popd
echo "::endgroup::"
78 changes: 78 additions & 0 deletions patches/makepkg/0001-cross-compilation.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
diff --git a/etc/makepkg_mingw.conf b/etc/makepkg_mingw.conf
--- a/etc/makepkg_mingw.conf
+++ b/etc/makepkg_mingw.conf
@@ -34,15 +34,17 @@
#

if [[ "$MSYSTEM" == "MINGW64" ]]; then
- CARCH="x86_64"
+ CARCH="aarch64"
CHOST="x86_64-w64-mingw32"
MINGW_CHOST="x86_64-w64-mingw32"
MINGW_PREFIX="/mingw64"
MINGW_PACKAGE_PREFIX="mingw-w64-x86_64"
- CC="gcc"
- CXX="g++"
+ CC="aarch64-w64-mingw32-gcc"
+ CXX="aarch64-w64-mingw32-g++"
+ STRIP="aarch64-w64-mingw32-strip"
+ OBJDUMP="aarch64-w64-mingw32-objdump"
CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=1"
- CFLAGS="-march=nocona -msahf -mtune=generic -O2 -pipe -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong"
+ CFLAGS="-O2 -pipe -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector-strong"
CXXFLAGS="$CFLAGS"
LDFLAGS=""
elif [[ "$MSYSTEM" == "MINGW32" ]]; then
--- /etc/pacman.conf
+++ /etc/pacman.conf
@@ -21,7 +21,7 @@
Architecture = auto

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
-#IgnorePkg =
+IgnorePkg = pacman
#IgnoreGroup =

#NoUpgrade =
diff --git a/etc/profile b/etc/profile
--- a/etc/profile
+++ b/etc/profile
@@ -49,7 +49,7 @@
case "${MSYSTEM}" in
MINGW*|CLANG*|UCRT*)
MINGW_MOUNT_POINT="${MINGW_PREFIX}"
- PATH="${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
+ PATH="/opt/bin:${MINGW_MOUNT_POINT}/bin:${MSYS2_PATH}${ORIGINAL_PATH:+:${ORIGINAL_PATH}}"
PKG_CONFIG_PATH="${MINGW_MOUNT_POINT}/lib/pkgconfig:${MINGW_MOUNT_POINT}/share/pkgconfig"
PKG_CONFIG_SYSTEM_INCLUDE_PATH="${MINGW_MOUNT_POINT}/include"
PKG_CONFIG_SYSTEM_LIBRARY_PATH="${MINGW_MOUNT_POINT}/lib"
diff --git a/usr/share/makepkg/tidy/strip.sh b/usr/share/makepkg/tidy/strip.sh
--- a/usr/share/makepkg/tidy/strip.sh
+++ b/usr/share/makepkg/tidy/strip.sh
@@ -85,7 +85,7 @@
strip_file(){
local binary=$1; shift
local tempfile=$(mktemp "$binary.XXXXXX")
- if strip "$@" "$binary" -o "$tempfile"; then
+ if $STRIP "$@" "$binary" -o "$tempfile"; then
cat "$tempfile" > "$binary"
fi
rm -f "$tempfile"
@@ -95,7 +95,7 @@
local binary=$1;

local tempfile=$(mktemp "$binary.XXXXXX")
- if strip -R .gnu.lto_* -R .gnu.debuglto_* -N __gnu_lto_v1 "$binary" -o "$tempfile"; then
+ if $STRIP -R .gnu.lto_* -R .gnu.debuglto_* -N __gnu_lto_v1 "$binary" -o "$tempfile"; then
cat "$tempfile" > "$binary"
fi
rm -f "$tempfile"
@@ -176,7 +176,7 @@
case "${binary##*/}" in
*.dll|*.exe|*.sfx|*.so|*.so.[0-9]*|*.oct|*.cmxs) ;;
# make sure this isn't some oddly named DLL
- *) if LANG=en_US.UTF-8 LC_ALL=C objdump -f "${binary}" | grep -Eq '^start address 0x(0000000[01])?00401[0-9a-e][0-9a-e]0'
+ *) if LANG=en_US.UTF-8 LC_ALL=C $OBJDUMP -f "${binary}" | grep -Eq '^start address 0x(0000000[01])?00401[0-9a-e][0-9a-e]0'
then
mv "${binary}" "${binary}.exe"
binary+=.exe
Binary file added patches/pacman/pacman-6.1.0-4-x86_64.pkg.tar.zst
Binary file not shown.

0 comments on commit f3bdc5c

Please sign in to comment.