🔌 GDExtension #107
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
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: All builds 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: All builds with debug symbols | |
type: boolean | |
default: false | |
# Global Settings | |
env: | |
SCONS_CACHE_LIMIT: 4096 | |
SCONSFLAGS: dev_build=no verbose=yes | |
EM_VERSION: 3.1.45 | |
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: windows-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: windows-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 (Web) | |
if: matrix.opts.platform == 'web' | |
uses: mymindstorm/setup-emsdk@v14 | |
with: | |
version: ${{env.EM_VERSION}} | |
no-cache: true | |
- name: Verify Emscripten setup (Web) | |
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 (Android) | |
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 MSVC problem matcher (Windows) | |
if: matrix.opts.platform == 'windows' | |
uses: ammaraskar/msvc-problem-matcher@1ebcb382869bfdc2cc645e8a2a43b6d319ea1cc0 # 0.3.0 | |
- name: Set up GCC problem matcher (Linux) | |
if: matrix.opts.platform == 'linux' | |
uses: ammaraskar/gcc-problem-matcher@0f9c86f9e693db67dacf53986e1674de5f2e5f28 # 0.3.0 | |
- 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: 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 (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 |