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