limboai/.github/workflows/gdextension.yml

477 lines
16 KiB
YAML

name: 🔌 GDExtension
on:
workflow_call:
inputs:
godot-cpp-ref:
description: A tag, branch or commit hash in the godot-cpp repository.
type: string
default: godot-4.3-stable
limboai-ref:
description: A tag, branch or commit hash in the LimboAI repository.
type: string
default: master
test-build:
description: Limit to pre-defined test builds
type: boolean
default: false
debug-symbols:
description: Build with debug symbols
type: boolean
default: false
workflow_dispatch:
inputs:
godot-cpp-ref:
description: A tag, branch or commit hash in the godot-cpp repository.
type: string
default: godot-4.3-stable
limboai-ref:
description: A tag, branch or commit hash in the LimboAI repository.
type: string
default: master
test-build:
description: Limit to pre-defined test builds
type: boolean
default: false
debug-symbols:
description: Build with debug symbols
type: boolean
default: false
# Global Settings
env:
SCONS_CACHE_LIMIT: 4096
SCONSFLAGS: use_mingw=yes dev_build=no verbose=yes
EM_VERSION: 3.1.45
EM_CACHE_FOLDER: "emsdk-cache"
GODOT_VERSION: 4.3-stable
jobs:
gdextension:
runs-on: ${{ matrix.opts.runner }}
name: ${{ matrix.opts.name }}
outputs:
name-prefix: ${{ steps.output-name-prefix.outputs.name-prefix }}
strategy:
fail-fast: false
matrix:
opts:
- name: 🐧 Linux (x86_64, release)
runner: ubuntu-20.04
platform: linux
target: template_release
arch: x86_64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.linux.template_release.x86_64.so
should-build: true
- name: 🐧 Linux (x86_64, debug)
runner: ubuntu-20.04
platform: linux
target: editor
arch: x86_64
debug-symbols: true
bin: liblimboai.linux.editor.x86_64.so
should-build: true
- name: 🪟 Windows (x86_64, release)
runner: ubuntu-latest
platform: windows
target: template_release
arch: x86_64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.windows.template_release.x86_64.dll
should-build: true
- name: 🪟 Windows (x86_64, debug)
runner: ubuntu-latest
platform: windows
target: editor
arch: x86_64
debug-symbols: true
bin: liblimboai.windows.editor.x86_64.dll
should-build: true
- name: 🍎 macOS (universal, release)
runner: macos-latest
platform: macos
target: template_release
arch: universal
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.macos.template_release
should-build: true
- name: 🍎 macOS (universal, debug)
runner: macos-latest
platform: macos
target: editor
arch: universal
debug-symbols: true
bin: liblimboai.macos.editor
should-build: true
- name: 🌐 Web (wasm32, release)
runner: ubuntu-20.04
platform: web
target: template_release
arch: wasm32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.web.template_release.wasm32.wasm
should-build: ${{ !inputs.test-build }}
- name: 🌐 Web (wasm32, debug)
runner: ubuntu-20.04
platform: web
target: template_debug
arch: wasm32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.web.template_debug.wasm32.wasm
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (arm64, release)
runner: ubuntu-20.04
platform: android
target: template_release
arch: arm64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_release.arm64.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (arm64, debug)
runner: ubuntu-20.04
platform: android
target: template_debug
arch: arm64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_debug.arm64.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (arm32, release)
runner: ubuntu-20.04
platform: android
target: template_release
arch: arm32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_release.arm32.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (arm32, debug)
runner: ubuntu-20.04
platform: android
target: template_debug
arch: arm32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_debug.arm32.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (x86_64, release)
runner: ubuntu-20.04
platform: android
target: template_release
arch: x86_64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_release.x86_64.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (x86_64, debug)
runner: ubuntu-20.04
platform: android
target: template_debug
arch: x86_64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_debug.x86_64.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (x86_32, release)
runner: ubuntu-20.04
platform: android
target: template_release
arch: x86_32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_release.x86_32.so
should-build: ${{ !inputs.test-build }}
- name: 🤖 Android (x86_32, debug)
runner: ubuntu-20.04
platform: android
target: template_debug
arch: x86_32
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.android.template_debug.x86_32.so
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (arm64, release)
runner: macos-latest
platform: ios
target: template_release
arch: arm64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.ios.template_release.arm64.dylib
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (arm64, debug)
runner: macos-latest
platform: ios
target: template_debug
arch: arm64
debug-symbols: ${{ inputs.debug-symbols }}
bin: liblimboai.ios.template_debug.arm64.dylib
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (simulator, release)
runner: macos-latest
platform: ios
target: template_release
arch: universal
debug-symbols: ${{ inputs.debug-symbols }}
scons-flags: ios_simulator=yes
bin: liblimboai.ios.template_release.universal.simulator.dylib
should-build: ${{ !inputs.test-build }}
- name: 🍏 iOS (simulator, debug)
runner: macos-latest
platform: ios
target: template_debug
arch: universal
debug-symbols: ${{ inputs.debug-symbols }}
scons-flags: ios_simulator=yes
bin: liblimboai.ios.template_debug.universal.simulator.dylib
should-build: ${{ !inputs.test-build }}
exclude:
- { opts: { should-build: false } }
steps:
- name: Clone LimboAI module
uses: actions/checkout@v4
with:
fetch-tags: true
ref: ${{ inputs.limboai-ref }}
- name: Clone godot-cpp
uses: actions/checkout@v4
with:
repository: godotengine/godot-cpp
fetch-tags: true
path: godot-cpp
ref: ${{ inputs.godot-cpp-ref }}
# Inits GDEXTENSION_VERSION, LIMBOAI_VERSION and NAME_PREFIX environment variables.
- uses: ./.github/actions/init-version-gdext
- name: Output NAME_PREFIX
id: output-name-prefix
run: echo "name-prefix=${NAME_PREFIX}" >> $GITHUB_OUTPUT
- name: Setup Linux toolchain
if: matrix.opts.platform == 'linux'
uses: ./.github/actions/setup-linux-toolchain
with:
arch: ${{matrix.opts.arch}}
- name: Set up Python 3.x
if: matrix.opts.platform == 'windows' || matrix.opts.platform == 'macos'
uses: actions/setup-python@v5
with:
python-version: "3.x"
architecture: "x64"
- name: Set up Emscripten cache
if: matrix.opts.platform == 'web'
uses: actions/cache@v4
with:
path: ${{env.EM_CACHE_FOLDER}}
key: ${{env.EM_VERSION}}-${{runner.os}}-libs
- name: Set up Emscripten
if: matrix.opts.platform == 'web'
uses: mymindstorm/setup-emsdk@v14
with:
version: ${{env.EM_VERSION}}
actions-cache-folder: ${{env.EM_CACHE_FOLDER}}
- name: Verify Emscripten setup
if: matrix.opts.platform == 'web'
run: |
emcc -v
- name: Set up scons
if: matrix.opts.platform != 'linux'
run: |
python -c "import sys; print(sys.version)"
python -m pip install scons==4.4.0
python --version
scons --version
- name: Set up Java 17
if: matrix.opts.platform == 'android'
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- uses: nttld/setup-ndk@v1
if: matrix.opts.platform == 'android'
id: setup-ndk
with:
ndk-version: r23c
link-to-sdk: true
- name: Set up scons cache
if: inputs.test-build # ! Only cache test/PR builds
uses: actions/cache@v4
with:
path: ${{github.workspace}}/.scons_cache/
key: ${{matrix.opts.bin}}-${{matrix.opts.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
restore-keys: |
${{matrix.opts.bin}}-${{matrix.opts.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}-${{env.LIMBOAI_VERSION}}
${{matrix.opts.bin}}-${{matrix.opts.debug-symbols}}-${{inputs.godot-cpp-ref}}-${{inputs.limboai-ref}}
${{matrix.opts.bin}}-${{matrix.opts.debug-symbols}}-${{inputs.godot-cpp-ref}}
- name: Set up MinGW
if: matrix.opts.platform == 'windows'
run: |
sudo apt update
sudo apt install g++-mingw-w64-x86-64-posix
- name: Compilation
shell: bash
env:
SCONS_CACHE: ${{github.workspace}}/.scons_cache/
DEBUG_FLAGS: ${{ matrix.opts.debug-symbols && 'debug_symbols=yes symbols_visibility=visible' || 'debug_symbols=no' }}
run: |
PATH=${GITHUB_WORKSPACE}/buildroot/bin:$PATH
scons platform=${{matrix.opts.platform}} target=${{matrix.opts.target}} arch=${{matrix.opts.arch}} ${{env.DEBUG_FLAGS}} ${{matrix.opts.scons-flags}} ${{env.SCONSFLAGS}}
- name: Split debug symbols (Linux)
if: matrix.opts.debug-symbols && matrix.opts.platform == 'linux'
shell: bash
run: |
cd demo/addons/limboai/bin/
objcopy --only-keep-debug ${{matrix.opts.bin}} ${{matrix.opts.bin}}.debug
objcopy --add-gnu-debuglink ${{matrix.opts.bin}}.debug ${{matrix.opts.bin}}
strip --strip-debug ${{matrix.opts.bin}}
readelf --debug-dump=links ${{matrix.opts.bin}}
nm ${{matrix.opts.bin}}
- name: Split debug symbols (Windows)
if: matrix.opts.debug-symbols && matrix.opts.platform == 'windows'
shell: bash
run: |
cd demo/addons/limboai/bin/
x86_64-w64-mingw32-objcopy --only-keep-debug ${{matrix.opts.bin}} ${{matrix.opts.bin}}.debug
x86_64-w64-mingw32-objcopy --add-gnu-debuglink ${{matrix.opts.bin}}.debug ${{matrix.opts.bin}}
x86_64-w64-mingw32-strip --strip-debug ${{matrix.opts.bin}}
x86_64-w64-mingw32-nm ${{matrix.opts.bin}}
- name: Split debug symbols (macOS & iOS)
if: matrix.opts.debug-symbols && (matrix.opts.platform == 'macos' || matrix.opts.platform == 'ios')
shell: bash
run: |
cd demo/addons/limboai/bin/
if [ "${{matrix.opts.platform}}" == "macos" ]; then
cd liblimboai.*.framework/
fi
dsymutil ${{matrix.opts.bin}}
strip -x ${{matrix.opts.bin}}
nm ${{matrix.opts.bin}}
- name: Prepare artifact
shell: bash
run: |
ls -R demo/addons/limboai/
mkdir out
mv demo/addons/ out/
cp {README,LICENSE,LOGO_LICENSE}.md out/addons/limboai/
cp -R demo/demo/ out/demo/
cp demo/LICENSE_ASSETS.md out/demo/
rm -f out/addons/limboai/bin/*.{exp,lib}
echo "${LIMBOAI_VERSION}" > out/addons/limboai/version.txt
echo "---"
ls -R out/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: tmp-gdextension.${{matrix.opts.platform}}.${{matrix.opts.target}}.${{matrix.opts.arch}}
path: |
out/*
!out/**/*.debug
!out/**/*.pdb
!out/**/*.dSYM
- name: Upload debug symbols
if: matrix.opts.debug-symbols
uses: actions/upload-artifact@v4
with:
name: tmp-gdextension-symbols.${{matrix.opts.platform}}.${{matrix.opts.target}}.${{matrix.opts.arch}}
path: |
out/**/*.debug
out/**/*.pdb
out/**/*.dSYM
package-extension:
name: 📦 Package extension
runs-on: ubuntu-latest
needs: gdextension
steps:
- name: Merge artifacts
uses: actions/upload-artifact/merge@v4
with:
name: ${{needs.gdextension.outputs.name-prefix}}
pattern: tmp-gdextension.*
delete-merged: true
- name: Merge debug symbols artifacts
uses: actions/upload-artifact/merge@v4
with:
name: ${{needs.gdextension.outputs.name-prefix}}.debug-symbols
pattern: tmp-gdextension-symbols.*
delete-merged: true
- name: Download artifact
uses: actions/download-artifact@v4
with:
name: ${{needs.gdextension.outputs.name-prefix}}
path: out/
- name: Setup Godot
shell: bash
run: |
echo "Downloading Godot ${GODOT_VERSION}"
mkdir bin
cd bin
wget "https://github.com/godotengine/godot/releases/download/${GODOT_VERSION}/Godot_v${GODOT_VERSION}_linux.x86_64.zip" -O godot.zip
unzip godot.zip
rm godot.zip
mv Godot_* godot
chmod u+x godot
ls -l
cd ..
./bin/godot --version
- name: Generate icon .import files
shell: bash
run: |
touch out/project.godot
timeout 20s ./bin/godot --headless --editor --path ./out/ || /bin/true
rm out/project.godot
rm -rf out/.godot/
- name: Change editor icon import settings
shell: bash
run: |
echo "--- Listing icons dir:"
ls out/addons/limboai/icons/
echo "--- (end of listing)"
sed -i 's|editor/scale_with_editor_scale=false|editor/scale_with_editor_scale=true|' out/addons/limboai/icons/*.import
sed -i 's|editor/convert_colors_with_editor_theme=false|editor/convert_colors_with_editor_theme=true|' out/addons/limboai/icons/*.import
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{needs.gdextension.outputs.name-prefix}}
path: out/*
overwrite: true