correct ls -l #202
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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-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 |