install wget on windows #76
Workflow file for this run
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
# 此脚本可以在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 }} |