Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
325 changes: 205 additions & 120 deletions .github/workflows/libvni.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,22 @@ on:
push:
pull_request:

permissions:
contents: write

defaults:
run:
shell: bash

jobs:
version:
name: Detect version
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
outputs:
tag: ${{ steps.version.outputs.tag }}
vniversion: ${{ steps.version.outputs.vniversion }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
fetch-depth: 0
- id: version
Expand Down Expand Up @@ -46,142 +49,224 @@ jobs:
fail-fast: false
matrix:
include:
- os: windows-latest
platform: win
arch: x64
- os: windows-latest
platform: win
arch: x86
- os: macos-latest
platform: macos
arch: arm64
- os: macos-latest
platform: macos
arch: x64
- os: ubuntu-24.04
platform: linux
arch: x64
- os: ubuntu-24.04-arm
platform: linux
arch: aarch64
- os: ubuntu-24.04
platform: android
arch: arm64-v8a
- os: macos-latest
platform: ios
arch: arm64
- os: macos-latest
platform: ios-simulator
arch: arm64
- os: macos-latest
platform: tvos
arch: arm64
- { os: windows-2025, platform: win, arch: x64 }
- { os: windows-2025, platform: win, arch: x86 }
- { os: windows-2025, platform: win-mingw, arch: x64 }
- { os: macos-15, platform: macos, arch: arm64 }
- { os: macos-15, platform: macos, arch: x64 }
- { os: ubuntu-24.04, platform: linux, arch: x64 }
- { os: ubuntu-24.04-arm, platform: linux, arch: aarch64 }
- { os: ubuntu-24.04, platform: android, arch: arm64-v8a }
- { os: macos-15, platform: ios, arch: arm64 }
- { os: macos-15, platform: ios-simulator, arch: arm64 }
- { os: macos-15, platform: tvos, arch: arm64 }
steps:
- uses: actions/checkout@v4
- name: Build libvni-${{ matrix.platform }}-${{ matrix.arch }}
run: |
if [[ "${{ matrix.platform }}" == "win" ]]; then
if [[ "${{ matrix.arch }}" == "x86" ]]; then
cmake -G "Visual Studio 17 2022" -A Win32 -DPLATFORM=${{ matrix.platform }} -DARCH=${{ matrix.arch }} -B build
else
cmake -G "Visual Studio 17 2022" -DPLATFORM=${{ matrix.platform }} -DARCH=${{ matrix.arch }} -B build
fi
cmake --build build --config Release
- uses: actions/checkout@v6
#
# install dependencies
#
- if: (matrix.platform == 'win')
uses: microsoft/setup-msbuild@v2
- if: (matrix.platform == 'win-mingw')
run: |
/c/msys64/usr/bin/bash.exe -l -c "pacman -S --noconfirm \
mingw-w64-ucrt-x86_64-gcc \
mingw-w64-ucrt-x86_64-cmake"
#
# build (win)
#
- if: (matrix.platform == 'win')
name: Build (win)
run: |
if [[ "${{ matrix.arch }}" == "x64" ]]; then
cmake \
-G "Visual Studio 17 2022" \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
else
if [[ "$(uname)" == "Darwin" ]]; then
NUM_PROCS=$(sysctl -n hw.ncpu)
else
NUM_PROCS=$(nproc)
fi
cmake -DCMAKE_BUILD_TYPE=Release -DPLATFORM=${{ matrix.platform }} -DARCH=${{ matrix.arch }} -B build
cmake --build build -- -j${NUM_PROCS}
cmake \
-G "Visual Studio 17 2022" \
-A Win32 \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
fi
- name: Prepare artifacts
id: artifacts
cmake --build build --config Release
#
# build (win-mingw)
#
- if: (matrix.platform == 'win-mingw')
name: Build (win-mingw)
run: |
CURRENT_DIR="$(pwd)"
MSYSTEM=UCRT64 /c/msys64/usr/bin/bash.exe -l -c "
cd \"${CURRENT_DIR}\" &&
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build &&
cmake --build build -- -j\$(nproc)
"
#
# build (macos)
#
- if: (matrix.platform == 'macos')
name: Build (macos)
run: |
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
cmake --build build -- -j$(sysctl -n hw.ncpu)
#
# build (linux)
#
- if: (matrix.platform == 'linux')
name: Build (linux)
run: |
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
cmake --build build -- -j$(nproc)
#
# build (ios/tvos)
#
- if: (matrix.platform == 'ios' || matrix.platform == 'ios-simulator' || matrix.platform == 'tvos')
name: Build (ios/tvos)
run: |
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
cmake --build build -- -j$(sysctl -n hw.ncpu)
#
# build (android)
#
- if: (matrix.platform == 'android')
name: Build (android)
run: |
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DPLATFORM=${{ matrix.platform }} \
-DARCH=${{ matrix.arch }} \
-B build
cmake --build build -- -j$(nproc)
#
# prepare artifacts
#
- if: (matrix.platform == 'win')
name: Prepare artifacts (win)
run: |
mkdir tmp
if [[ "${{ matrix.platform }}" == "win" ]]; then
ARTIFACT_PATH="tmp"
if [[ "${{ matrix.arch }}" == "x86" ]]; then
cp build/Release/vni.lib tmp
cp build/Release/vni.dll tmp
else
cp build/Release/vni64.lib tmp
cp build/Release/vni64.dll tmp
fi
cp build/Release/vni_static.lib tmp
else
ARTIFACT_PATH="libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz"
if [[ "${{ matrix.platform }}" == "macos" ]]; then
cp build/libvni.a tmp
cp build/libvni.*.dylib tmp
elif [[ "${{ matrix.platform }}" == "linux" ]]; then
cp build/libvni.a tmp
cp build/libvni.so.* tmp
elif [[ "${{ matrix.platform }}" == "ios" || "${{ matrix.platform }}" == "ios-simulator" || "${{ matrix.platform }}" == "tvos" ]]; then
cp build/libvni.a tmp
cp build/libvni.*.dylib tmp
elif [[ "${{ matrix.platform }}" == "android" ]]; then
cp build/libvni.a tmp
cp build/libvni.so tmp
fi
cd tmp
tar -czvf ../${ARTIFACT_PATH} *
fi
echo "artifact_path=${ARTIFACT_PATH}" >> $GITHUB_OUTPUT
- name: Upload artifacts
uses: actions/upload-artifact@v4
cp build/Release/*.lib tmp/
cp build/Release/*.dll tmp/
cd tmp && 7z a -r ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.zip *
- if: (matrix.platform == 'win-mingw')
name: Prepare artifacts (win-mingw)
run: |
mkdir tmp
cp build/*.dll tmp/
cp build/*.dll.a tmp/
cp build/vni_static.a tmp/
UCRT64_BIN="/c/msys64/ucrt64/bin"
cp "${UCRT64_BIN}/libgcc_s_seh-1.dll" tmp/
cp "${UCRT64_BIN}/libstdc++-6.dll" tmp/
cd tmp && 7z a -r ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.zip *
- if: (matrix.platform == 'macos')
name: Prepare artifacts (macos)
run: |
mkdir tmp
cp build/libvni.a tmp/
cp -a build/*.dylib tmp/
cd tmp && tar -czvf ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz *
- if: (matrix.platform == 'linux')
name: Prepare artifacts (linux)
run: |
mkdir tmp
cp build/libvni.a tmp/
cp -a build/*.so tmp/
cp -a build/*.so.* tmp/
cd tmp && tar -czvf ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz *
- if: (matrix.platform == 'ios' || matrix.platform == 'ios-simulator' || matrix.platform == 'tvos')
name: Prepare artifacts (ios/tvos)
run: |
mkdir tmp
cp build/libvni.a tmp/
cp -a build/*.dylib tmp/
cd tmp && tar -czvf ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz *
- if: (matrix.platform == 'android')
name: Prepare artifacts (android)
run: |
mkdir tmp
cp build/libvni.a tmp/
cp build/libvni.so tmp/
cd tmp && tar -czvf ../libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz *
#
# upload artifacts
#
- if: (matrix.platform == 'win' || matrix.platform == 'win-mingw')
uses: actions/upload-artifact@v7
with:
name: libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.zip
path: libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.zip
archive: false
- if: (matrix.platform != 'win' && matrix.platform != 'win-mingw')
uses: actions/upload-artifact@v7
with:
name: libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}
path: ${{ steps.artifacts.outputs.artifact_path }}
name: libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz
path: libvni-${{ needs.version.outputs.tag }}-${{ matrix.platform }}-${{ matrix.arch }}.tar.gz
archive: false

post-build:
runs-on: macos-latest
runs-on: macos-15
needs: [ version, build ]
name: Build libvni-macos
steps:
- uses: actions/download-artifact@v4
- name: Unpack artifacts
run: |
cd libvni-${{ needs.version.outputs.tag }}-macos-x64
tar -xzvf libvni-${{ needs.version.outputs.tag }}-macos-x64.tar.gz
cd ..
cd libvni-${{ needs.version.outputs.tag }}-macos-arm64
tar -xzvf libvni-${{ needs.version.outputs.tag }}-macos-arm64.tar.gz
- uses: actions/download-artifact@v8
with:
name: libvni-${{ needs.version.outputs.tag }}-macos-x64.tar.gz
skip-decompress: true
- uses: actions/download-artifact@v8
with:
name: libvni-${{ needs.version.outputs.tag }}-macos-arm64.tar.gz
skip-decompress: true
- name: Combine macos architectures
run: |
mkdir macos-x64 macos-arm64
tar -xzvf libvni-${{ needs.version.outputs.tag }}-macos-x64.tar.gz -C macos-x64
tar -xzvf libvni-${{ needs.version.outputs.tag }}-macos-arm64.tar.gz -C macos-arm64
mkdir tmp
lipo -create -output tmp/libvni-${{ needs.version.outputs.tag }}.dylib \
libvni-${{ needs.version.outputs.tag }}-macos-arm64/libvni.${{ needs.version.outputs.vniversion }}.dylib \
libvni-${{ needs.version.outputs.tag }}-macos-x64/libvni.${{ needs.version.outputs.vniversion }}.dylib
- name: Prepare artifacts
run: |
cd tmp
tar -czvf ../libvni-${{ needs.version.outputs.tag }}-macos.tar.gz *
find macos-arm64 -name "*.dylib" | while read -r file; do
if [ -L "$file" ]; then
cp -a "$file" "tmp/"
elif [ -f "$file" ]; then
filename=$(basename "$file")
lipo -create -output "tmp/$filename" \
"macos-arm64/$filename" \
"macos-x64/$filename"
fi
done
cd tmp && tar -czvf ../libvni-${{ needs.version.outputs.tag }}-macos.tar.gz * && cd ..
- name: Upload artifacts
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: libvni-${{ needs.version.outputs.tag }}-macos
name: libvni-${{ needs.version.outputs.tag }}-macos.tar.gz
path: libvni-${{ needs.version.outputs.tag }}-macos.tar.gz
- name: Package
if: startsWith(github.ref, 'refs/tags/')
run: |
zip -r libvni-${{ needs.version.outputs.tag }}-win-x64.zip libvni-${{ needs.version.outputs.tag }}-win-x64
zip -r libvni-${{ needs.version.outputs.tag }}-win-x86.zip libvni-${{ needs.version.outputs.tag }}-win-x86
archive: false
- if: startsWith(github.ref, 'refs/tags/')
uses: actions/download-artifact@v8
with:
path: release
skip-decompress: true
- name: Release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
files: |
libvni-${{ needs.version.outputs.tag }}-win-x64.zip
libvni-${{ needs.version.outputs.tag }}-win-x86.zip
libvni-${{ needs.version.outputs.tag }}-macos-arm64/libvni-${{ needs.version.outputs.tag }}-macos-arm64.tar.gz
libvni-${{ needs.version.outputs.tag }}-macos-x64/libvni-${{ needs.version.outputs.tag }}-macos-x64.tar.gz
libvni-${{ needs.version.outputs.tag }}-macos.tar.gz
libvni-${{ needs.version.outputs.tag }}-linux-x64/libvni-${{ needs.version.outputs.tag }}-linux-x64.tar.gz
libvni-${{ needs.version.outputs.tag }}-linux-aarch64/libvni-${{ needs.version.outputs.tag }}-linux-aarch64.tar.gz
libvni-${{ needs.version.outputs.tag }}-ios-arm64/libvni-${{ needs.version.outputs.tag }}-ios-arm64.tar.gz
libvni-${{ needs.version.outputs.tag }}-ios-simulator-arm64/libvni-${{ needs.version.outputs.tag }}-ios-simulator-arm64.tar.gz
libvni-${{ needs.version.outputs.tag }}-tvos-arm64/libvni-${{ needs.version.outputs.tag }}-tvos-arm64.tar.gz
libvni-${{ needs.version.outputs.tag }}-android-arm64-v8a/libvni-${{ needs.version.outputs.tag }}-android-arm64-v8a.tar.gz
files: release/**/*
Loading
Loading