Skip to content

try host

try host #203

Workflow file for this run

name: main
on:
push:
branches:
- master
paths:
- .github/workflows/main.yml
- .github/workflows/factorial_gmp.c
workflow_dispatch:
jobs:
build:
strategy:
matrix:
include:
- { os: linux, arch: x64 }
- { os: linux, arch: x86 }
- { os: linux, arch: arm64 }
- { os: linux, arch: arm }
- { os: linux-musl, arch: x64 }
- { os: linux-musl, arch: arm64 }
- { os: win, arch: x64 }
- { os: win, arch: x86 }
- { os: android, arch: x64 }
- { os: android, arch: arm64 }
- { os: android, arch: x86 }
- { os: android, arch: arm }
- { os: osx, arch: arm64 }
- { os: osx, arch: x64 }
- { os: ios, arch: arm64 }
runs-on: ${{ (matrix.os == 'osx' || matrix.os == 'ios') && (matrix.arch == 'x64' && 'macos-13' || 'macos-latest') || 'ubuntu-latest' }}
env:
GMP_VERSION: 6.3.0
steps:
- uses: actions/checkout@v4
with:
show-progress: false
- name: Set environment variables
run: |
echo "TARGET=${{ matrix.os }}-${{ matrix.arch }}" >> $GITHUB_ENV
case "${{ matrix.os }}-${{ matrix.arch }}" in
"linux-x64")
echo "HOST=x86_64-pc-linux-gnu" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=gcc" >> $GITHUB_ENV
;;
"linux-x86")
echo "HOST=i686-pc-linux-gnu" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=gcc -m32" >> $GITHUB_ENV
;;
"linux-arm64")
echo "HOST=aarch64-linux-gnu" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=aarch64-linux-gnu-strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
;;
"linux-arm")
echo "HOST=arm-linux-gnueabihf" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=arm-linux-gnueabihf-strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=arm-linux-gnueabihf-gcc" >> $GITHUB_ENV
;;
"linux-musl-x64")
echo "HOST=x86_64-linux-musl" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=musl-gcc" >> $GITHUB_ENV
;;
"linux-musl-arm64")
echo "HOST=aarch64-unknown-linux-musl" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so.10.5.0" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so.4.7.0" >> $GITHUB_ENV
echo "STRIP=aarch64-unknown-linux-musl-strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=aarch64-unknown-linux-musl-gcc" >> $GITHUB_ENV
;;
"win-x64")
echo "HOST=x86_64-w64-mingw32" >> $GITHUB_ENV
echo "GMP_SO=libgmp-10.dll" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx-4.dll" >> $GITHUB_ENV
echo "STRIP=x86_64-w64-mingw32-strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=x86_64-w64-mingw32-gcc" >> $GITHUB_ENV
;;
"win-x86")
echo "HOST=i686-w64-mingw32" >> $GITHUB_ENV
echo "GMP_SO=libgmp-10.dll" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx-4.dll" >> $GITHUB_ENV
echo "STRIP=i686-w64-mingw32-strip --strip-unneeded" >> $GITHUB_ENV
echo "TEST_CC=i686-w64-mingw32-gcc" >> $GITHUB_ENV
;;
"android-x64")
echo "HOST=x86_64-linux-android" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so" >> $GITHUB_ENV
echo "STRIP=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip --strip-unneeded" >> $GITHUB_ENV
ARGS="--target=x86_64-linux-android21 \
--sysroot=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-fPIE -pie"
echo "TEST_CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CXX=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ ${ARGS}" >> $GITHUB_ENV
;;
"android-arm64")
echo "HOST=aarch64-linux-android" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so" >> $GITHUB_ENV
echo "STRIP=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip --strip-unneeded" >> $GITHUB_ENV
ARGS="--target=aarch64-linux-android21 \
--sysroot=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-fPIE -pie"
echo "TEST_CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CXX=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ ${ARGS}" >> $GITHUB_ENV
;;
"android-x86")
echo "HOST=i686-linux-android" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so" >> $GITHUB_ENV
echo "STRIP=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip --strip-unneeded" >> $GITHUB_ENV
ARGS="--target=i686-linux-android21 \
--sysroot=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-fPIE -pie"
echo "TEST_CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CXX=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ ${ARGS}" >> $GITHUB_ENV
;;
"android-arm")
echo "HOST=armv7a-linux-android" >> $GITHUB_ENV
echo "GMP_SO=libgmp.so" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.so" >> $GITHUB_ENV
echo "STRIP=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip --strip-unneeded" >> $GITHUB_ENV
ARGS="--target=armv7a-linux-android21 \
--sysroot=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
-fPIE -pie"
echo "TEST_CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CC=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang ${ARGS}" >> $GITHUB_ENV
echo "CXX=${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ ${ARGS}" >> $GITHUB_ENV
;;
"osx-arm64")
echo "HOST=aarch64-apple-darwin" >> $GITHUB_ENV
echo "GMP_SO=libgmp.dylib" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.dylib" >> $GITHUB_ENV
echo "STRIP=strip -x" >> $GITHUB_ENV
echo "TEST_CC=clang -arch arm64" >> $GITHUB_ENV
;;
"osx-x64")
echo "HOST=x86_64-apple-darwin" >> $GITHUB_ENV
echo "GMP_SO=libgmp.dylib" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.dylib" >> $GITHUB_ENV
echo "STRIP=strip -x" >> $GITHUB_ENV
echo "TEST_CC=clang" >> $GITHUB_ENV
echo "LDFLAGS=-ld_classic" >> $GITHUB_ENV # to fix: ld: branch8 out of range 362869 in ___gmpn_add_nc_x86_64
;;
"ios-arm64")
echo "HOST=aarch64-apple-ios" >> $GITHUB_ENV
echo "GMP_SO=libgmp.a" >> $GITHUB_ENV
echo "GMP_CPP_SO=libgmpxx.a" >> $GITHUB_ENV
echo "STRIP=strip -x" >> $GITHUB_ENV
echo "CFLAGS=-arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=12.0" >> $GITHUB_ENV
echo "LDFLAGS=-arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -miphoneos-version-min=12.0" >> $GITHUB_ENV
echo "TEST_CC=xcrun -sdk iphoneos clang -arch arm64 -isysroot \$(xcrun --sdk iphoneos --show-sdk-path)" >> $GITHUB_ENV
;;
*)
echo "Error: Unsupported OS-Architecture combination: ${{ matrix.os }}-${{ matrix.arch }}"
exit 1
;;
esac
- name: Install Toolchain (arch-specific)
run: |
case "$TARGET" in
"linux-x64")
;;
"linux-x86")
sudo apt-get update
sudo apt-get install -y gcc-multilib g++-multilib
;;
"linux-arm64")
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt-get install -y qemu-user
;;
"linux-arm")
sudo apt-get update
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
sudo apt-get install -y qemu-user
;;
"linux-musl-x64")
sudo apt-get update
sudo apt-get install -y musl-tools
;;
"linux-musl-arm64")
sudo apt-get update
sudo apt-get install -y musl-tools qemu-user
sudo mkdir -p /opt/x-tools
wget -nv https://github.com/musl-cross/musl-cross/releases/download/20241103/aarch64-unknown-linux-musl.tar.xz
sudo tar -xf aarch64-unknown-linux-musl.tar.xz -C /opt/x-tools
ls -l /opt/x-tools/aarch64-unknown-linux-musl/bin/
/opt/x-tools/aarch64-unknown-linux-musl/bin/aarch64-unknown-linux-musl-gcc --version
echo "/opt/x-tools/aarch64-unknown-linux-musl/bin" >> $GITHUB_PATH
;;
"win-x86")
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y mingw-w64
sudo apt-get install wine32:i386
;;
"win-x64")
sudo apt-get update
sudo apt-get install -y mingw-w64
sudo apt-get install --no-install-recommends -y wine
;;
"android-x64" | "android-arm64" | "android-x86" | "android-arm")
;;
"osx-arm64" | "osx-x64" | "ios-arm64")
echo "No toolchain installation needed on macOS/iOS."
;;
*)
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
;;
esac
- name: Download GMP Source
run: |
wget -nv https://mirrors.nju.edu.cn/gnu/gmp/gmp-${GMP_VERSION}.tar.xz
tar -xf gmp-${GMP_VERSION}.tar.xz
- name: Configure GMP
run: |
cd gmp-${GMP_VERSION}
GMP_CONFIGURE_ARGS="--enable-shared --disable-static --enable-fat --enable-cxx"
if [ "$TARGET" = "ios-arm64" ]; then
GMP_CONFIGURE_ARGS="--enable-static --disable-shared --enable-cxx --disable-assembly"
fi
./configure $GMP_CONFIGURE_ARGS --host=${{ env.HOST }}
- name: Build GMP
run: |
cd gmp-${GMP_VERSION}
make -j4
- name: Check .libs
run: |
cd gmp-${GMP_VERSION}/.libs
ls -l
file ${{ env.GMP_SO }}
- name: Generate .lib files(Windows only)
if: ${{ matrix.os == 'win' }}
run: |
cd gmp-${GMP_VERSION}/.libs
if [ "$TARGET" = "win-x86" ]; then
HOST_PREFIX=i686-w64-mingw32
elif [ "$TARGET" = "win-x64" ]; then
HOST_PREFIX=x86_64-w64-mingw32
else
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
fi
${HOST_PREFIX}-dlltool \
--input-def libgmp-3.dll.def \
--output-lib libgmp-10.lib \
--dllname ${{ env.GMP_SO }}
${HOST_PREFIX}-dlltool \
--input-def libgmpxx-3.dll.def \
--output-lib libgmpxx-4.lib \
--dllname ${{ env.GMP_CPP_SO }}
echo "Converted .def files to .lib for Windows."
- name: Dump lib dependencies
if: ${{ matrix.os != 'win' }}
run: |
cd gmp-${GMP_VERSION}/.libs
case "$TARGET" in
osx-*)
otool -L ${{ env.GMP_SO }}
;;
ios-*)
ar -t ${{ env.GMP_SO }}
;;
linux-* | android-*)
objdump -x ${{ env.GMP_SO }} | grep NEEDED
;;
*)
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
;;
esac
- name: Strip GMP Library
run: |
cd gmp-${GMP_VERSION}/.libs
${{ env.STRIP }} ${{ env.GMP_SO }}
${{ env.STRIP }} ${{ env.GMP_CPP_SO }}
ls -l
file ${{ env.GMP_SO }}
- name: Compile Test C Program
run: |
${{ env.TEST_CC }} -o factorial_gmp.exe \
.github/workflows/factorial_gmp.c \
-I${{ github.workspace }}/gmp-${GMP_VERSION} \
-L${{ github.workspace }}/gmp-${GMP_VERSION}/.libs \
-lgmp
file factorial_gmp.exe
- name: Run Test C Program
if: ${{ matrix.os != 'android' && matrix.os != 'ios' }}
run: |
case "$TARGET" in
win-*)
cp ${{ github.workspace }}/gmp-${GMP_VERSION}/.libs/${{ env.GMP_SO }} .
wine ${GITHUB_WORKSPACE}/factorial_gmp.exe
;;
"linux-x64" | "linux-x86")
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs ./factorial_gmp.exe
;;
"linux-arm64" | "linux-musl-arm64")
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs qemu-aarch64 -L /usr/aarch64-linux-gnu/ ./factorial_gmp.exe
;;
"linux-arm")
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs qemu-arm -L /usr/arm-linux-gnueabihf/ ./factorial_gmp.exe
;;
"linux-musl-x64")
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs ./factorial_gmp.exe
;;
osx-*)
DYLD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs ./factorial_gmp.exe
;;
*)
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
;;
esac
- name: Prepare Artifact folder
run: |
mkdir -p artifacts/bin artifacts/include artifacts/misc
cp gmp-${GMP_VERSION}/gmp.h ./artifacts/include
cp gmp-${GMP_VERSION}/gmpxx.h ./artifacts/include
cp gmp-${GMP_VERSION}/.libs/${{ env.GMP_SO }} ./artifacts/bin
cp gmp-${GMP_VERSION}/.libs/${{ env.GMP_CPP_SO }} ./artifacts/bin
cp gmp-${GMP_VERSION}/.libs/*.lib ./artifacts/misc || true
cp gmp-${GMP_VERSION}/.libs/*.def ./artifacts/misc || true
cp gmp-${GMP_VERSION}/.libs/*.lai ./artifacts/misc
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: gmp-${{ matrix.os }}-${{ matrix.arch }}
path: artifacts