Skip to content

Merge pull request #30 from goatchurchprime/exposemixrate #106

Merge pull request #30 from goatchurchprime/exposemixrate

Merge pull request #30 from goatchurchprime/exposemixrate #106

name: 🛠️ GDExtension Build
on:
push:
paths:
[
src/**,
.github/**,
"!.github/**/util_*",
"patches/**",
lib_utils.py,
lib_utils_external.py,
SConstruct,
]
pull_request:
paths:
[
src/**,
.github/**,
"!.github/**/util_*",
"patches/**",
lib_utils.py,
lib_utils_external.py,
SConstruct,
]
workflow_dispatch:
inputs:
#production_build:
# description: Production build
# default: true
# type: boolean
use_cache:
description: Use Cache
default: true
type: boolean
# Stop the same workflow actions
concurrency:
group: ${{github.workflow}}-${{github.event.pull_request.number || github.ref}}
cancel-in-progress: true
permissions:
actions: write
env:
PROJECT_NAME: TwoVoIP
LIBRARY_NAME: twovoip
SCONS_CACHE: ${{github.workspace}}/.scons-cache/
USE_CACHE: ${{!format('{0}', inputs.use_cache) && 'true' || format('{0}', inputs.use_cache)}} # Default true
#PRODUCTION_BUILD: ${{!format('{0}', inputs.production_build) && 'false' || format('{0}', inputs.production_build)}} # Default false
OUTPUT_LIBS_PATH: bin
FORCE_DISABLE_UNITY: yes
GH_TOKEN: ${{ github.token }}
jobs:
windows-gdextension:
name: 🏁 Windows
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [x86_64]
target: [template_debug, template_release]
lipsync: [yes, no] # If necessary, you can simply remove the `yes` from here
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: windows
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: windows.${{matrix.target}}.${{matrix.arch}}.${{contains(matrix.lipsync, 'yes') && '-lipsync' || '-base'}}
additional: lto=yes lipsync=${{matrix.lipsync}}
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
linux-gdextension:
name: 🐧 Linux
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
arch: [x86_64]
target: [template_debug, template_release]
lipsync: [yes, no] # does not actually have lipsync, but having the stub version running is required to android from linux
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: linux
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: linux.${{matrix.target}}.${{matrix.arch}}.${{contains(matrix.lipsync, 'yes') && '-lipsync' || '-base'}}
additional: lto=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
macos-gdextension:
name: 🍏 MacOS
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
arch: [universal, x86_64]
target: [template_debug, template_release]
lipsync: [yes, no]
exclude:
- arch: universal
lipsync: yes
- arch: x86_64
lipsync: no
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: macos
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: macos.${{matrix.target}}.${{matrix.arch}}${{contains(matrix.lipsync, 'yes') && '-lipsync' || '-base'}}
additional: lto=yes lipsync=${{matrix.lipsync}} macos_deployment_target=10.15
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
ios-gdextension:
name: 🍏 Ios
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
arch: [universal]
target: [template_debug, template_release]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: ios
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: ios.${{matrix.target}}.${{matrix.arch}}-base
additional: lto=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
android-gdextension:
name: 🤖 Android
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: [arm32, arm64, x86_32, x86_64]
target: [template_debug, template_release]
lipsync: [yes, no]
exclude:
- arch: x86_32
lipsync: yes
- arch: x86_64
lipsync: yes
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Android NDK r23c
uses: nttld/setup-ndk@v1.4.1
id: setup-ndk
with:
ndk-version: r23c
link-to-sdk: true
local-cache: true
# TODO revisit after some updates of nttld/setup-ndk
- name: Restore Android Symlinks
run: |
directory="${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin"
find "$directory" -type l | while read link; do
current_target=$(readlink "$link")
new_target="$directory/$(basename "$current_target")"
ln -sf "$new_target" "$link"
echo "Changed $(basename "$link") from $current_target to $new_target"
done
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: android
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: android.${{matrix.target}}.${{matrix.arch}}${{contains(matrix.lipsync, 'yes') && '-lipsync' || '-base'}}
additional: lto=yes lipsync=${{matrix.lipsync}}
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
web-gdextension:
name: 🕸 Web
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: [wasm32]
target: [template_debug, template_release]
threads: [yes, no]
env:
EM_VERSION: 3.1.63
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Download Emscripten
uses: mymindstorm/setup-emsdk@v14
# Continue if failed to cache
# https://github.com/mymindstorm/setup-emsdk/issues/20
continue-on-error: true
with:
version: ${{env.EM_VERSION}}
actions-cache-folder: obj/emsdk_cache
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: web
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: web.${{matrix.target}}.${{matrix.arch}}.threads_${{matrix.threads}}-base
additional: lto=yes threads=${{matrix.threads}}
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
collect-gdextension:
needs:
[
windows-gdextension,
linux-gdextension,
macos-gdextension,
android-gdextension,
web-gdextension,
ios-gdextension,
]
name: 📦 Collect GDExtension binaries
runs-on: ubuntu-latest
outputs:
is_base_compiled: ${{steps.check_compiled_files.outputs.is_base_compiled}}
is_lipsync_compiled: ${{steps.check_compiled_files.outputs.is_lipsync_compiled}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Base
uses: actions/download-artifact@v4
with:
path: extracted_base
pattern: "*-base"
merge-multiple: true
- name: Download LipSync
uses: actions/download-artifact@v4
with:
path: extracted_lipsync
pattern: "*-lipsync"
merge-multiple: true
- name: Check compiled files
id: check_compiled_files
run: |
if find extracted_base/ -type f | grep -q .; then
echo "is_base_compiled=true" >> $GITHUB_OUTPUT
else
echo "is_base_compiled=false" >> $GITHUB_OUTPUT
fi
if find extracted_lipsync/ -type f | grep -q .; then
echo "is_lipsync_compiled=true" >> $GITHUB_OUTPUT
else
echo "is_lipsync_compiled=false" >> $GITHUB_OUTPUT
fi
- name: List all base libs
if: steps.check_compiled_files.outputs.is_base_compiled == 'true'
run: |
echo "Files structure Base:"
find extracted_base -mindepth 1
cd extracted_base
touch .gdignore
echo "Total size Base: $(du -ch -b | grep total | cut -f1 | awk '{printf "%.2f", $1/1048576}') MB, Total number of files: $(find . -type f | wc -l)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
- name: List all LipSync libs
if: steps.check_compiled_files.outputs.is_lipsync_compiled == 'true'
run: |
echo "Files structure LipSync:"
find extracted_lipsync -mindepth 1
cd extracted_lipsync
touch .gdignore
echo "Total size LipSync: $(du -ch -b | grep total | cut -f1 | awk '{printf "%.2f", $1/1048576}') MB, Total number of files: $(find . -type f | wc -l)" >> $GITHUB_STEP_SUMMARY
- name: Upload GDExtension Base
if: steps.check_compiled_files.outputs.is_base_compiled == 'true'
uses: actions/upload-artifact@v4
with:
name: .gdextension_libs_base
retention-days: 7
path: extracted_base/*
- name: Upload GDExtension LipSync
if: steps.check_compiled_files.outputs.is_lipsync_compiled == 'true'
uses: actions/upload-artifact@v4
with:
name: .gdextension_libs_lipsync
retention-days: 7
path: extracted_lipsync/*
# ============================================
pack-release:
needs:
[collect-gdextension]
name: 🏁 Pack release archive
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Download Base
if: needs.collect-gdextension.outputs.is_base_compiled == 'true'
uses: actions/download-artifact@v4
with:
path: addons/${{env.LIBRARY_NAME}}/libs
name: .gdextension_libs_base
merge-multiple: true
- name: Download LipSync
if: needs.collect-gdextension.outputs.is_lipsync_compiled == 'true'
uses: actions/download-artifact@v4
with:
path: addons/${{env.LIBRARY_NAME}}_lipsync/libs
name: .gdextension_libs_lipsync
merge-multiple: true
- name: Setup OVRLipSync
if: needs.collect-gdextension.outputs.is_lipsync_compiled == 'true'
uses: ./.github/actions/setup_ovrlipsync
with:
extract_directory: "addons/${{env.LIBRARY_NAME}}_lipsync"
- name: Move base addon to the new root folders
if: needs.collect-gdextension.outputs.is_base_compiled == 'true'
run: |
mkdir -p upload_base/project/addons
mv addons/${{env.LIBRARY_NAME}} upload_base/project/addons/${{env.LIBRARY_NAME}}
- name: Move LipSync addon to the new root folders
if: needs.collect-gdextension.outputs.is_lipsync_compiled == 'true'
run: |
pushd addons/${{env.LIBRARY_NAME}}_lipsync/OVRLipSyncNative
find -type f \( -name '*.a' -o -name '*.lib' -o -wholename '*/Include/*' -o -wholename '*/Sample/*' \) -delete
find -type d -empty -delete
touch .gdignore
popd
mkdir -p upload_lipsync/project/addons
mv addons/${{env.LIBRARY_NAME}}_lipsync upload_lipsync/project/addons/${{env.LIBRARY_NAME}}_lipsync
- name: Upload GDExtension Base
if: needs.collect-gdextension.outputs.is_base_compiled == 'true'
uses: actions/upload-artifact@v4
with:
name: ".${{env.PROJECT_NAME}}"
retention-days: 7
path: upload_base/*
- name: Upload GDExtension LipSync
if: needs.collect-gdextension.outputs.is_lipsync_compiled == 'true'
uses: actions/upload-artifact@v4
with:
name: ".${{env.PROJECT_NAME}}_With_LipSync"
retention-days: 7
path: upload_lipsync/*