Skip to content

install wget on windows #76

install wget on windows

install wget on windows #76

Workflow file for this run

# 此脚本可以在github actions中编译多个平台的gmp库,并且编译/运行一个测试程序
name: main
on:
push:
branches:
- msvc
paths:
- .github/workflows/main.yml
workflow_dispatch:
jobs:
build:
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
# === 定义 os 和 arch 的组合 ===
- os: linux
arch: x64
runner: ubuntu-latest
- os: linux
arch: x86
runner: ubuntu-latest
- os: linux
arch: arm64
runner: ubuntu-latest
- os: linux
arch: arm
runner: ubuntu-latest
- os: win
arch: x64
runner: ubuntu-latest
- os: win
arch: x86
runner: ubuntu-latest
- os: win
arch: arm64
runner: windows-latest
env:
GMP_VERSION: 6.3.0
steps:
- name: Check out repository
uses: actions/checkout@v3
- name: Set Environment Variables
shell: bash
run: |
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" >> $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" >> $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" >> $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" >> $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" >> $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" >> $GITHUB_ENV
;;
"win-arm64")
echo "gmp_so=libgmp-10.dll" >> $GITHUB_ENV
echo "gmp_cpp_so=libgmpxx-4.dll" >> $GITHUB_ENV
echo "strip=echo" >> $GITHUB_ENV
;;
*)
echo "Error: Unsupported OS-Architecture combination"
exit 1
;;
esac
- name: Install Toolchain (arch-specific)
shell: bash
run: |
TARGET="${{ matrix.os }}-${{ matrix.arch }}"
if [ "${{ matrix.runner }}" = "windows-latest" ]; then
choco install wget -y
else
sudo apt-get update
case "$TARGET" in
"linux-x86")
sudo apt-get install -y gcc-multilib g++-multilib
;;
"linux-arm64")
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu qemu-user
;;
"linux-arm")
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf qemu-user
;;
"win-x86")
sudo apt-get install -y mingw-w64
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y wine32:i386
;;
"win-x64")
sudo apt-get install -y mingw-w64 wine
;;
"linux-x64")
# 如果有额外需要,可在此处安装
;;
*)
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
;;
esac
fi
- name: Download GMP Source
shell: bash
run: |
wget https://mirrors.nju.edu.cn/gnu/gmp/gmp-${GMP_VERSION}.tar.xz
tar -xf gmp-${GMP_VERSION}.tar.xz
- name: Configure GMP
shell: bash
run: |
cd gmp-${GMP_VERSION}
# Windows 下不启用 --enable-fat
if [ "${{ matrix.os }}" = "win" ]; then
CONFIGURE_OPTIONS="--enable-shared --disable-static --enable-cxx"
else
CONFIGURE_OPTIONS="--enable-shared --disable-static --enable-cxx --enable-fat"
fi
if [ "${{ matrix.os }}" = "win" ] && [ "${{ matrix.arch }}" = "arm64" ]; then
echo "Setting environment for MSVC/cl (Windows-ARM64)"
# 通常需要 source VS 的 vcvarsall.bat 或使用 actions/setup-msvc
export CC="cl"
export CXX="cl"
echo "MSVC 对 Autotools 支持不佳,可能需要自定义 nmake/makefile 方式编译。"
else
./configure --host="${{ env.host || '' }}" $CONFIGURE_OPTIONS
fi
- name: Build GMP
shell: bash
run: |
cd gmp-${GMP_VERSION}
if [ "${{ matrix.os }}" = "win" ] && [ "${{ matrix.arch }}" = "arm64" ]; then
echo "在 MSVC 下可能需要 nmake /f Makefile.msc"
nmake /f Makefile.msc
else
make MAKEINFO=true
fi
- name: Check .libs
shell: bash
run: |
cd gmp-${GMP_VERSION}
if [ -d ".libs" ]; then
cd .libs
ls -l
if [ -f "${{ env.gmp_so }}" ]; then
file ${{ env.gmp_so }}
fi
else
echo "No .libs directory found (MSVC 或 Makefile.msc 可能输出到别的目录)"
- name: Strip GMP Library
shell: bash
run: |
cd gmp-${GMP_VERSION}
if [ -d ".libs" ]; then
cd .libs
# 在 Windows-ARM64 (MSVC) 下没有 strip, 此处直接跳过
${{ env.strip }} --strip-unneeded ${{ env.gmp_so }} || echo "Skipping strip on MSVC build"
${{ env.strip }} --strip-unneeded ${{ env.gmp_cpp_so }} || echo "Skipping strip on MSVC build"
fi
- name: Compile C Program
shell: bash
run: |
cd "${{ github.workspace }}"
COMPILE_OPTIONS=".github/workflows/factorial_gmp.c -I${{ github.workspace }}/gmp-${GMP_VERSION} -L${{ github.workspace }}/gmp-${GMP_VERSION}/.libs -lgmp"
TARGET="${{ matrix.os }}-${{ matrix.arch }}"
case "$TARGET" in
"linux-x86")
gcc -m32 -o factorial_gmp $COMPILE_OPTIONS
;;
"linux-x64")
gcc -o factorial_gmp $COMPILE_OPTIONS
;;
"linux-arm64")
aarch64-linux-gnu-gcc -o factorial_gmp $COMPILE_OPTIONS
;;
"linux-arm")
arm-linux-gnueabihf-gcc -o factorial_gmp $COMPILE_OPTIONS
;;
"win-x86")
i686-w64-mingw32-gcc -o factorial_gmp.exe $COMPILE_OPTIONS
;;
"win-x64")
x86_64-w64-mingw32-gcc -o factorial_gmp.exe $COMPILE_OPTIONS
;;
"win-arm64")
echo "用 cl 编译 Windows-ARM64 下的测试程序(仅示例)"
cl /Fe:factorial_gmp.exe factorial_gmp.c /I gmp-${GMP_VERSION} /link /LIBPATH:gmp-${GMP_VERSION}/.libs
;;
*)
echo "Error: Unsupported OS-Architecture combination: $TARGET"
exit 1
;;
esac
- name: Run C Program
shell: bash
run: |
cd "${{ github.workspace }}"
if [ "${{ matrix.arch }}" = "arm64" ] && [ "${{ matrix.os }}" = "linux" ]; then
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs qemu-aarch64 -L /usr/aarch64-linux-gnu/ ./factorial_gmp
elif [ "${{ matrix.arch }}" = "arm" ] && [ "${{ matrix.os }}" = "linux" ]; then
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs qemu-arm -L /usr/arm-linux-gnueabihf/ ./factorial_gmp
elif [ "${{ matrix.os }}" = "win" ] && [ "${{ matrix.arch }}" != "arm64" ]; then
# 仅在 ubuntu-latest (wine) 上可执行 Win32/Win64 程序
cp ${{ github.workspace }}/gmp-${GMP_VERSION}/.libs/${{ env.gmp_so }} .
wine ./factorial_gmp.exe
elif [ "${{ matrix.os }}" = "win" ] && [ "${{ matrix.arch }}" = "arm64" ]; then
echo "Windows-ARM64 MSVC 编译产物无法直接在 GitHub Windows x64 Runner 上运行,需要 ARM64 环境或模拟器。跳过。"
else
LD_LIBRARY_PATH=${{ github.workspace }}/gmp-${GMP_VERSION}/.libs ./factorial_gmp
fi
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.os }}-${{ matrix.arch }}
path: |
${{ github.workspace }}/gmp-${{ env.GMP_VERSION }}/gmp.h
${{ github.workspace }}/gmp-${{ env.GMP_VERSION }}/gmpxx.h
${{ github.workspace }}/gmp-${{ env.GMP_VERSION }}/.libs/${{ env.gmp_so }}
${{ github.workspace }}/gmp-${{ env.GMP_VERSION }}/.libs/${{ env.gmp_cpp_so }}