Skip to content

Fix indentation not being stripped when the line starts with an inter… #226

Fix indentation not being stripped when the line starts with an inter…

Fix indentation not being stripped when the line starts with an inter… #226

name: Build loreline
on:
push:
branches:
- '**'
tags:
- v**
jobs:
loreline-windows:
runs-on: windows-2022
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
$NEKOPATH = $(Convert-Path .)+'/git/haxe-binary/windows/neko'
$HAXEPATH = $(Convert-Path .)+'/git/haxe-binary/windows/haxe'
echo $NEKOPATH >> $GITHUB_PATH
echo $HAXEPATH >> $GITHUB_PATH
echo $NEKOPATH
echo $HAXEPATH
- name: Build loreline
working-directory: .
run: |
node ./setup --cpp
- name: Run loreline
working-directory: .
shell: cmd
run: |
loreline
- name: Check loreline version
if: startsWith(github.ref, 'refs/tags/')
working-directory: .
shell: cmd
run: |
loreline version --check-tag %GITHUB_REF:refs/tags/=%
- name: Run unit tests
shell: cmd
run: loreline.exe test ./test
- name: Setup MSVC
uses: ilammy/msvc-dev-cmd@v1
- name: Build C++ library
run: node ./setup --cpp-lib
- name: Run C++ library tests
run: node ./setup --cpp-lib-test
- name: Install scons
run: pip install scons
- name: Build GDExtension wrapper
run: node ./setup --godot
- name: Create zip archive
working-directory: .
run: |
New-Item -ItemType Directory -Force -Path loreline-windows-pkg/cpp/include
New-Item -ItemType Directory -Force -Path loreline-windows-pkg/cpp/lib
Copy-Item loreline.exe loreline-windows-pkg/
Copy-Item build/cpp-lib/windows/Loreline.dll loreline-windows-pkg/cpp/lib/
Copy-Item build/cpp-lib/windows/Loreline.lib loreline-windows-pkg/cpp/lib/
Copy-Item cpp/include/Loreline.h loreline-windows-pkg/cpp/include/
Compress-Archive -Path loreline-windows-pkg/* -DestinationPath loreline-windows.zip -CompressionLevel Optimal
- name: Create GDExtension zip archive
working-directory: .
run: |
New-Item -ItemType Directory -Force -Path loreline-godot-windows-pkg
Copy-Item godot/bin/loreline_godot.dll loreline-godot-windows-pkg/
Copy-Item build/cpp-lib/windows/Loreline.dll loreline-godot-windows-pkg/
Compress-Archive -Path loreline-godot-windows-pkg/* -DestinationPath loreline-godot-windows.zip -CompressionLevel Optimal
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-windows.zip
path: loreline-windows.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-windows.zip
path: loreline-godot-windows.zip
compression-level: 0
loreline-mac:
runs-on: macos-14
env:
CODESIGN: ${{ secrets.APPLE_CERTIFICATE_P12 != '' }}
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
set -ex
export NEKOPATH=$PWD'/git/haxe-binary/mac/neko'
export HAXEPATH=$PWD'/git/haxe-binary/mac/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.dylib /usr/local/lib/libneko.dylib
sudo ln -s $NEKOPATH/libneko.2.4.0.dylib /usr/local/lib/libneko.2.4.0.dylib
sudo ln -s $NEKOPATH/libneko.2.dylib /usr/local/lib/libneko.2.dylib
set +x
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Build loreline
working-directory: .
run: |
node ./setup --cpp
- name: Run loreline
working-directory: .
run: |
./loreline
- name: Check loreline version
if: startsWith(github.ref, 'refs/tags/')
working-directory: .
run: |
GIT_TAG=${GITHUB_REF/refs\/tags\//}
./loreline version --check-tag $GIT_TAG
- name: Run unit tests
working-directory: .
run: |
./loreline test ./test
- name: Build C++ library
run: node ./setup --cpp-lib
- name: Run C++ library tests
run: node ./setup --cpp-lib-test
- name: Install scons
run: brew install scons
- name: Build GDExtension wrapper
run: node ./setup --godot
- name: Assemble package
run: |
mkdir -p loreline-mac-pkg/cpp/include
mkdir -p loreline-mac-pkg/cpp/lib
cp loreline loreline-mac-pkg/
cp build/cpp-lib/mac/libLoreline.dylib loreline-mac-pkg/cpp/lib/
cp cpp/include/Loreline.h loreline-mac-pkg/cpp/include/
- name: Assemble GDExtension package
run: |
mkdir -p loreline-godot-mac-pkg
cp godot/bin/libloreline_godot.dylib loreline-godot-mac-pkg/
cp build/cpp-lib/mac/libLoreline.dylib loreline-godot-mac-pkg/
- name: Patch GDExtension dylib for Godot
run: |
install_name_tool -change @rpath/libLoreline.dylib @loader_path/libLoreline.dylib \
loreline-godot-mac-pkg/libloreline_godot.dylib
- name: Install Apple certificate
if: env.CODESIGN == 'true'
env:
APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
run: |
CERT_PATH=$RUNNER_TEMP/certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
KEYCHAIN_PASSWORD=$(openssl rand -hex 12)
echo -n "$APPLE_CERTIFICATE_P12" | base64 --decode -o $CERT_PATH
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security import $CERT_PATH -P "$APPLE_CERTIFICATE_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: \
-k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychains -d user -s $KEYCHAIN_PATH login.keychain
- name: Sign macOS binaries
if: env.CODESIGN == 'true'
run: |
IDENTITY="Developer ID Application"
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp \
loreline-mac-pkg/cpp/lib/libLoreline.dylib
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp \
loreline-mac-pkg/loreline
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp \
loreline-godot-mac-pkg/libloreline_godot.dylib
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp \
loreline-godot-mac-pkg/libLoreline.dylib
codesign -vvv loreline-mac-pkg/loreline
codesign -vvv loreline-mac-pkg/cpp/lib/libLoreline.dylib
codesign -vvv loreline-godot-mac-pkg/libloreline_godot.dylib
codesign -vvv loreline-godot-mac-pkg/libLoreline.dylib
- name: Create zip archive
run: |
cd loreline-mac-pkg && zip --symlinks -9 ../loreline-mac.zip -r .
- name: Create GDExtension zip archive
run: |
cd loreline-godot-mac-pkg && zip --symlinks -9 ../loreline-godot-mac.zip -r .
- name: Notarize
if: env.CODESIGN == 'true'
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: |
xcrun notarytool submit loreline-mac.zip \
--apple-id "$APPLE_ID" \
--password "$APPLE_ID_PASSWORD" \
--team-id "$APPLE_TEAM_ID" \
--wait --timeout 10m
xcrun notarytool submit loreline-godot-mac.zip \
--apple-id "$APPLE_ID" \
--password "$APPLE_ID_PASSWORD" \
--team-id "$APPLE_TEAM_ID" \
--wait --timeout 10m
- name: Cleanup keychain
if: ${{ always() }}
run: security delete-keychain $RUNNER_TEMP/app-signing.keychain-db 2>/dev/null || true
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-mac.zip
path: loreline-mac.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-mac.zip
path: loreline-godot-mac.zip
compression-level: 0
loreline-linux:
strategy:
matrix:
include:
- os: "ubuntu-22.04"
arch: "x86_64"
- os: "ubuntu-22.04-arm"
arch: "arm64"
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-${{ matrix.arch }}/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-${{ matrix.arch }}/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Build loreline
working-directory: .
run: |
node ./setup --cpp
- name: Run loreline
working-directory: .
run: |
./loreline
- name: Check loreline version
if: startsWith(github.ref, 'refs/tags/')
working-directory: .
run: |
GIT_TAG=${GITHUB_REF/refs\/tags\//}
./loreline version --check-tag $GIT_TAG
- name: Run unit tests
working-directory: .
run: |
./loreline test ./test
- name: Build C++ library
run: node ./setup --cpp-lib
- name: Run C++ library tests
run: node ./setup --cpp-lib-test
- name: Install scons
run: pip install scons
- name: Build GDExtension wrapper
run: node ./setup --godot
- name: Create zip archive
run: |
mkdir -p loreline-linux-pkg/cpp/include
mkdir -p loreline-linux-pkg/cpp/lib
cp loreline loreline-linux-pkg/
cp build/cpp-lib/linux/libLoreline.so loreline-linux-pkg/cpp/lib/
cp cpp/include/Loreline.h loreline-linux-pkg/cpp/include/
cd loreline-linux-pkg && zip --symlinks -9 ../loreline-linux-${{ matrix.arch }}.zip -r .
- name: Install patchelf
run: sudo apt-get install -y patchelf
- name: Create GDExtension zip archive
run: |
mkdir -p loreline-godot-linux-pkg
cp godot/bin/libloreline_godot.${{ matrix.arch }}.so loreline-godot-linux-pkg/
cp build/cpp-lib/linux/libLoreline.so loreline-godot-linux-pkg/libLoreline.${{ matrix.arch }}.so
# Fix RPATH to look for dependencies in the same directory
patchelf --set-rpath '$ORIGIN' loreline-godot-linux-pkg/libloreline_godot.${{ matrix.arch }}.so
# Update the NEEDED entry to match the arch-suffixed filename
patchelf --replace-needed libLoreline.so libLoreline.${{ matrix.arch }}.so \
loreline-godot-linux-pkg/libloreline_godot.${{ matrix.arch }}.so
cd loreline-godot-linux-pkg && zip --symlinks -9 ../loreline-godot-linux-${{ matrix.arch }}.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-linux-${{ matrix.arch }}.zip
path: loreline-linux-${{ matrix.arch }}.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-linux-${{ matrix.arch }}.zip
path: loreline-godot-linux-${{ matrix.arch }}.zip
compression-level: 0
loreline-neko:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup haxelib
run: |
mkdir -p .haxelib
haxelib dev hscript git/hscript --quiet
haxelib dev yaml git/yaml --quiet
- name: Run Neko tests
run: node run test ./test
loreline-js:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Install dependencies
run: npm install
- name: Build JS
working-directory: .
run: |
node ./setup --js
- name: Run JS tests
run: npx tsx js/test-runner.ts ./test
- name: Create zip archive
run: zip -9 'loreline-js.zip' js/loreline.js js/loreline.d.ts
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-js.zip
path: loreline-js.zip
compression-level: 0
loreline-csharp:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '8.0.x'
- name: Display dotnet version
run: dotnet --version
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Build loreline
working-directory: .
run: |
node ./setup --cs --cs-dll
- name: Run C# tests
run: dotnet run --project cs/TestRunner -- ./test
- name: Publish C# AOT
run: dotnet publish cs/TestRunner -c Release -r linux-x64 -p:AotBuild=true
- name: Run C# AOT tests
run: ./build/cs/bin/TestRunner/Release/net8.0/linux-x64/publish/TestRunner ./test
- name: Create zip archive
working-directory: cs
run: |
sed -i '/<Compile Remove="TestRunner/d' Loreline.csproj
zip -r '../loreline-csharp.zip' ./* -x './TestRunner/*'
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-csharp.zip
path: loreline-csharp.zip
compression-level: 0
loreline-python:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.12'
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup haxelib
run: |
mkdir -p .haxelib
haxelib dev hscript git/hscript --quiet
- name: Build Python
run: node ./setup --py
- name: Run Python tests
run: python3 py/test-runner.py ./test
- name: Assemble Python sample
run: node ./setup --sample python
- name: Create zip archive
run: |
mkdir loreline-python-pkg
cp -r py/loreline loreline-python-pkg/loreline
cp py/pyproject.toml loreline-python-pkg/
cp -r sample/loreline-python loreline-python-pkg/sample
cd loreline-python-pkg
zip -r ../loreline-python.zip .
- name: Upload loreline-python.zip
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-python.zip
path: loreline-python.zip
compression-level: 0
loreline-lua:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Lua
run: sudo apt-get install -y lua5.4
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup haxelib
run: |
mkdir -p .haxelib
haxelib dev hscript git/hscript --quiet
- name: Build Lua
run: node ./setup --lua
- name: Run Lua tests
run: lua5.4 lua/test-runner.lua ./test
- name: Assemble Lua sample
run: node ./setup --sample lua
- name: Create zip archive
run: |
mkdir loreline-lua-pkg
cp -r lua/loreline loreline-lua-pkg/loreline
cp -r sample/loreline-lua loreline-lua-pkg/sample
cd loreline-lua-pkg
zip -r ../loreline-lua.zip .
- name: Upload loreline-lua.zip
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-lua.zip
path: loreline-lua.zip
compression-level: 0
loreline-jvm:
runs-on: "ubuntu-22.04"
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 11
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup haxelib
run: |
mkdir -p .haxelib
haxelib dev hscript git/hscript --quiet
- name: Build JVM
run: node ./setup --jvm
- name: Run JVM tests
run: |
javac -cp jvm/loreline.jar -d build/jvm/test jvm/test/TestRunner.java
java -cp "jvm/loreline.jar:build/jvm/test" TestRunner ./test
- name: Assemble Java sample
run: node ./setup --sample java
- name: Create zip archive
run: |
mkdir loreline-jvm-pkg
cp jvm/loreline.jar loreline-jvm-pkg/loreline.jar
cp -r sample/loreline-java loreline-jvm-pkg/sample
cd loreline-jvm-pkg
zip -r ../loreline-jvm.zip .
- name: Upload loreline-jvm.zip
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-jvm.zip
path: loreline-jvm.zip
compression-level: 0
loreline-unity:
needs: [loreline-csharp]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download C# library
uses: actions/download-artifact@v7
with:
name: loreline-csharp.zip
path: .
- name: Assemble Unity sample
run: |
unzip loreline-csharp.zip -d cs-temp
mkdir -p cs/Loreline
cp -r cs-temp/Loreline/* cs/Loreline/
node ./setup --sample unity
node ./setup --unity-package
- name: Create zip archive
run: |
cp loreline.unitypackage sample/loreline-unity/
cd sample/loreline-unity
zip -r ../../loreline-unity.zip . \
-x 'Library/*' 'Temp/*' \
'Logs/*' 'UserSettings/*' \
'obj/*'
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-unity.zip
path: loreline-unity.zip
compression-level: 0
- name: Upload Unity Package
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline.unitypackage
path: loreline.unitypackage
compression-level: 0
loreline-web:
needs: [loreline-js]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download JS library
uses: actions/download-artifact@v7
with:
name: loreline-js.zip
path: .
- name: Assemble web sample
run: |
unzip loreline-js.zip -d js-temp
mkdir -p js
cp js-temp/js/loreline.js js/loreline.js
node ./setup --sample web
- name: Create zip archive
run: |
cd sample/loreline-web
zip -r ../../loreline-web.zip .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-web.zip
path: loreline-web.zip
compression-level: 0
loreline-cpp:
needs: [loreline-mac, loreline-windows, loreline-linux]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download platform artifacts
uses: actions/download-artifact@v7
with:
path: artifacts
- name: Assemble loreline-cpp package
run: |
PKG=loreline-cpp-pkg
mkdir -p $PKG/loreline/include
mkdir -p $PKG/loreline/mac
mkdir -p $PKG/loreline/linux-x86_64
mkdir -p $PKG/loreline/linux-arm64
mkdir -p $PKG/loreline/windows
mkdir -p $PKG/story
# Copy sample source + build scripts
cp sample/loreline-cpp/main.cpp $PKG/
cp sample/loreline-cpp/CMakeLists.txt $PKG/
cp sample/loreline-cpp/build-mac.sh $PKG/
cp sample/loreline-cpp/build-linux.sh $PKG/
cp sample/loreline-cpp/build-windows.bat $PKG/
chmod +x $PKG/build-mac.sh $PKG/build-linux.sh
# Copy story files
cp sample/CoffeeShop.lor $PKG/story/
cp sample/characters.lor $PKG/story/
# Copy header (same for all platforms)
cp cpp/include/Loreline.h $PKG/loreline/include/
# Extract platform libraries from artifacts
cd artifacts
unzip -o loreline-mac.zip/loreline-mac.zip -d mac-tmp
unzip -o loreline-windows.zip/loreline-windows.zip -d win-tmp
unzip -o loreline-linux-x86_64.zip/loreline-linux-x86_64.zip -d linux-x86_64-tmp
unzip -o loreline-linux-arm64.zip/loreline-linux-arm64.zip -d linux-arm64-tmp
cd ..
cp artifacts/mac-tmp/cpp/lib/libLoreline.dylib $PKG/loreline/mac/
cp artifacts/win-tmp/cpp/lib/Loreline.dll $PKG/loreline/windows/
cp artifacts/win-tmp/cpp/lib/Loreline.lib $PKG/loreline/windows/
cp artifacts/linux-x86_64-tmp/cpp/lib/libLoreline.so $PKG/loreline/linux-x86_64/
cp artifacts/linux-arm64-tmp/cpp/lib/libLoreline.so $PKG/loreline/linux-arm64/
- name: Create zip archive
run: cd loreline-cpp-pkg && zip -9 ../loreline-cpp.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-cpp.zip
path: loreline-cpp.zip
compression-level: 0
loreline-ios:
runs-on: macos-14
env:
CODESIGN: ${{ secrets.APPLE_CERTIFICATE_P12 != '' }}
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
set -ex
export NEKOPATH=$PWD'/git/haxe-binary/mac/neko'
export HAXEPATH=$PWD'/git/haxe-binary/mac/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.dylib /usr/local/lib/libneko.dylib
sudo ln -s $NEKOPATH/libneko.2.4.0.dylib /usr/local/lib/libneko.2.4.0.dylib
sudo ln -s $NEKOPATH/libneko.2.dylib /usr/local/lib/libneko.2.dylib
set +x
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Install LLVM (for static framework symbol renaming)
run: brew install llvm
- name: Build iOS xcframework
run: node ./setup --ios
- name: Install scons
run: brew install scons
- name: Build GDExtension wrapper for iOS
run: node ./setup --godot-ios
- name: Install Apple certificate
if: env.CODESIGN == 'true'
env:
APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
run: |
CERT_PATH=$RUNNER_TEMP/certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
KEYCHAIN_PASSWORD=$(openssl rand -hex 12)
echo -n "$APPLE_CERTIFICATE_P12" | base64 --decode -o $CERT_PATH
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security import $CERT_PATH -P "$APPLE_CERTIFICATE_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: \
-k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychains -d user -s $KEYCHAIN_PATH login.keychain
- name: Sign iOS framework slices
if: env.CODESIGN == 'true'
run: |
IDENTITY="Developer ID Application"
codesign --force --sign "$IDENTITY" --timestamp \
build/cpp-lib/ios/Loreline.xcframework/ios-arm64/Loreline.framework
codesign --force --sign "$IDENTITY" --timestamp \
build/cpp-lib/ios/Loreline.xcframework/ios-arm64_x86_64-simulator/Loreline.framework
codesign -vvv build/cpp-lib/ios/Loreline.xcframework/ios-arm64/Loreline.framework
codesign -vvv build/cpp-lib/ios/Loreline.xcframework/ios-arm64_x86_64-simulator/Loreline.framework
- name: Sign GDExtension iOS xcframework slices
if: env.CODESIGN == 'true'
run: |
IDENTITY="Developer ID Application"
XCFW=godot/bin/loreline_godot.xcframework
if [ -d "$XCFW" ]; then
for slice in "$XCFW"/*/*.framework; do
codesign --force --sign "$IDENTITY" --timestamp "$slice"
codesign -vvv "$slice"
done
fi
- name: Cleanup keychain
if: ${{ always() }}
run: security delete-keychain $RUNNER_TEMP/app-signing.keychain-db 2>/dev/null || true
- name: Create zip archive
run: |
mkdir -p loreline-ios-pkg/include
cp -r build/cpp-lib/ios/Loreline.xcframework loreline-ios-pkg/
cp -r build/cpp-lib/ios/Loreline-static.xcframework loreline-ios-pkg/
cp cpp/include/Loreline.h loreline-ios-pkg/include/
cd loreline-ios-pkg && zip --symlinks -9 ../loreline-ios.zip -r .
- name: Create GDExtension zip archive
run: |
mkdir -p loreline-godot-ios-pkg
cp -r godot/bin/loreline_godot.xcframework loreline-godot-ios-pkg/
cp -r build/cpp-lib/ios/Loreline.xcframework loreline-godot-ios-pkg/
cd loreline-godot-ios-pkg && zip --symlinks -9 ../loreline-godot-ios.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-ios.zip
path: loreline-ios.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-ios.zip
path: loreline-godot-ios.zip
compression-level: 0
loreline-android:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup Android SDK
uses: android-actions/setup-android@v2
- name: Install Android NDK
run: |
echo "y" | sdkmanager "ndk;27.3.13750724"
echo "ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk/27.3.13750724" >> $GITHUB_ENV
- name: Build Android AAR
run: node ./setup --android
- name: Install scons
run: pip install scons
- name: Build GDExtension wrapper for Android
run: node ./setup --godot-android
- name: Create zip archive
run: |
mkdir -p loreline-android-pkg/include
cp build/cpp-lib/android/loreline.aar loreline-android-pkg/
cp cpp/include/Loreline.h loreline-android-pkg/include/
cd loreline-android-pkg && zip -9 ../loreline-android.zip -r .
- name: Create GDExtension zip archive
run: |
mkdir -p loreline-godot-android-pkg/arm64-v8a
mkdir -p loreline-godot-android-pkg/x86_64
cp godot/bin/arm64-v8a/libloreline_godot.so loreline-godot-android-pkg/arm64-v8a/
cp godot/bin/x86_64/libloreline_godot.so loreline-godot-android-pkg/x86_64/
cd loreline-godot-android-pkg && zip -9 ../loreline-godot-android.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-android.zip
path: loreline-android.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-android.zip
path: loreline-godot-android.zip
compression-level: 0
loreline-wasm:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: 22
- name: Setup Haxe
working-directory: .
run: |
export NEKOPATH=$PWD'/git/haxe-binary/linux-x86_64/neko'
export HAXEPATH=$PWD'/git/haxe-binary/linux-x86_64/haxe'
echo 'neko path: '$NEKOPATH
echo 'haxe path: '$HAXEPATH
sudo mkdir -p /usr/local/bin
sudo mkdir -p /usr/local/lib
sudo mkdir -p /usr/local/share/haxe
sudo ln -s $HAXEPATH/haxe /usr/local/bin/haxe
sudo ln -s $HAXEPATH/haxelib /usr/local/bin/haxelib
sudo ln -s $HAXEPATH/haxe-bin /usr/local/bin/haxe-bin
sudo ln -s $HAXEPATH/haxelib-bin /usr/local/bin/haxelib-bin
sudo ln -s $HAXEPATH/std /usr/local/share/haxe/std
sudo ln -s $NEKOPATH/neko /usr/local/bin/neko
sudo ln -s $NEKOPATH/nekoc /usr/local/bin/nekoc
sudo ln -s $NEKOPATH/nekoml /usr/local/bin/nekoml
sudo ln -s $NEKOPATH/nekotools /usr/local/bin/nekotools
sudo ln -s $NEKOPATH /usr/local/lib/neko
sudo ln -s $NEKOPATH/libneko.so /usr/local/lib/libneko.so
sudo ln -s $NEKOPATH/libneko.so.2.4.0 /usr/local/lib/libneko.so.2.4.0
sudo ln -s $NEKOPATH/libneko.so.2 /usr/local/lib/libneko.so.2
sudo ldconfig
sudo ldconfig /usr/local/lib
echo 'neko: '$(neko -version)
echo 'haxe: '$(haxe --version)
- name: Setup Emscripten
uses: mymindstorm/setup-emsdk@v14
- name: Build WASM
run: node ./setup --wasm
- name: Install scons
run: pip install scons
- name: Install npm dependencies (esbuild for JS minification)
run: npm install
- name: Build loreline.js (needed for GDExtension web bridge)
run: node ./setup --js
- name: Build GDExtension wrapper for WASM
run: node ./setup --godot-wasm
- name: Create zip archive
run: |
mkdir -p loreline-wasm-pkg/include
mkdir -p loreline-wasm-pkg/lib
cp build/cpp-lib/wasm/libLoreline.nothreads.a loreline-wasm-pkg/lib/
cp build/cpp-lib/wasm/libLoreline.threads.a loreline-wasm-pkg/lib/
cp cpp/include/Loreline.h loreline-wasm-pkg/include/
cd loreline-wasm-pkg && zip -9 ../loreline-wasm.zip -r .
- name: Create GDExtension zip archive
run: |
mkdir -p loreline-godot-wasm-pkg
cp godot/bin/libloreline_godot.nothreads.wasm loreline-godot-wasm-pkg/ 2>/dev/null || true
cp godot/bin/libloreline_godot.wasm loreline-godot-wasm-pkg/ 2>/dev/null || true
cd loreline-godot-wasm-pkg && zip -9 ../loreline-godot-wasm.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-wasm.zip
path: loreline-wasm.zip
compression-level: 0
- name: Upload GDExtension Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot-wasm.zip
path: loreline-godot-wasm.zip
compression-level: 0
loreline-godot:
needs: [loreline-mac, loreline-windows, loreline-linux, loreline-wasm, loreline-ios, loreline-android]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download GDExtension artifacts
uses: actions/download-artifact@v7
with:
path: artifacts
pattern: loreline-godot-*.zip
- name: Download Android AAR artifact
uses: actions/download-artifact@v7
with:
path: artifacts
name: loreline-android.zip
- name: Assemble loreline-godot package
run: |
PKG=loreline-godot-pkg/addons/loreline
mkdir -p $PKG/bin/macos
mkdir -p $PKG/bin/windows
mkdir -p $PKG/bin/linux
mkdir -p $PKG/bin/web
mkdir -p $PKG/bin/ios
mkdir -p $PKG/bin/android/arm64-v8a
mkdir -p $PKG/bin/android/x86_64
# Copy .gdextension manifest
cp godot/loreline.gdextension $PKG/
# Extract GDExtension artifacts
cd artifacts
unzip -qo loreline-godot-mac.zip/loreline-godot-mac.zip -d godot-mac
unzip -qo loreline-godot-windows.zip/loreline-godot-windows.zip -d godot-win
unzip -qo loreline-godot-linux-x86_64.zip/loreline-godot-linux-x86_64.zip -d godot-linux-x86_64
unzip -qo loreline-godot-linux-arm64.zip/loreline-godot-linux-arm64.zip -d godot-linux-arm64
unzip -qo loreline-godot-wasm.zip/loreline-godot-wasm.zip -d godot-wasm
unzip -qo loreline-godot-ios.zip/loreline-godot-ios.zip -d godot-ios
unzip -qo loreline-godot-android.zip/loreline-godot-android.zip -d godot-android
unzip -qo loreline-android.zip -d android-temp
cd ..
# macOS
cp artifacts/godot-mac/libloreline_godot.dylib $PKG/bin/macos/
cp artifacts/godot-mac/libLoreline.dylib $PKG/bin/macos/
# Windows
cp artifacts/godot-win/loreline_godot.dll $PKG/bin/windows/
cp artifacts/godot-win/Loreline.dll $PKG/bin/windows/
# Linux x86_64
cp artifacts/godot-linux-x86_64/libloreline_godot.x86_64.so $PKG/bin/linux/
cp artifacts/godot-linux-x86_64/libLoreline.x86_64.so $PKG/bin/linux/
# Linux arm64
cp artifacts/godot-linux-arm64/libloreline_godot.arm64.so $PKG/bin/linux/
cp artifacts/godot-linux-arm64/libLoreline.arm64.so $PKG/bin/linux/
# WASM
cp artifacts/godot-wasm/libloreline_godot.nothreads.wasm $PKG/bin/web/ 2>/dev/null || true
cp artifacts/godot-wasm/libloreline_godot.wasm $PKG/bin/web/ 2>/dev/null || true
# iOS (Loreline is statically linked into the GDExtension)
cp -r artifacts/godot-ios/loreline_godot.xcframework $PKG/bin/ios/
# Android
cp artifacts/godot-android/arm64-v8a/libloreline_godot.so $PKG/bin/android/arm64-v8a/
cp artifacts/godot-android/x86_64/libloreline_godot.so $PKG/bin/android/x86_64/
unzip -qo artifacts/android-temp/loreline.aar -d artifacts/android-aar-temp
cp artifacts/android-aar-temp/jni/arm64-v8a/libloreline.so $PKG/bin/android/arm64-v8a/
cp artifacts/android-aar-temp/jni/x86_64/libloreline.so $PKG/bin/android/x86_64/
# Copy sample project into package
cp -r sample/loreline-godot loreline-godot-pkg/sample
# Remove generated/editor files
rm -rf loreline-godot-pkg/sample/.godot
rm -rf loreline-godot-pkg/sample/android/build
rm -rf loreline-godot-pkg/sample/addons/loreline/bin
rm -f loreline-godot-pkg/sample/.gitattributes
rm -f loreline-godot-pkg/sample/.gitignore
rm -f loreline-godot-pkg/sample/.editorconfig
find loreline-godot-pkg/sample -name "*.import" -delete
find loreline-godot-pkg/sample -name "*.uid" -delete
# Copy extension into sample so it's ready to use
cp -r loreline-godot-pkg/addons loreline-godot-pkg/sample/
# Copy story files into sample
mkdir -p loreline-godot-pkg/sample/story
cp sample/CoffeeShop.lor loreline-godot-pkg/sample/story/
cp sample/characters.lor loreline-godot-pkg/sample/story/
cd loreline-godot-pkg && zip --symlinks -9 ../loreline-godot.zip -r .
- name: Upload Files
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-godot.zip
path: loreline-godot.zip
compression-level: 0
loreline-sdl3:
needs: [loreline-mac, loreline-windows, loreline-linux, loreline-ios, loreline-android]
runs-on: macos-14
env:
CODESIGN: ${{ secrets.APPLE_CERTIFICATE_P12 != '' }}
steps:
- uses: actions/checkout@v6
- name: Download platform artifacts
uses: actions/download-artifact@v7
with:
path: artifacts
- name: Assemble loreline-sdl3 package
run: |
set -e
PKG=loreline-sdl3-pkg
# --- Copy tracked sample sources ---
cp -r sample/loreline-sdl3 $PKG
rm -f $PKG/.gitignore
# Story files (gitignored in sample, source is at sample/*.lor)
mkdir -p $PKG/story
cp sample/CoffeeShop.lor $PKG/story/
cp sample/characters.lor $PKG/story/
# Fonts (OFL-licensed, tracked in Unity sample)
mkdir -p $PKG/fonts
cp sample/loreline-unity/Assets/Resources/Fonts/*.ttf $PKG/fonts/
cp sample/loreline-unity/Assets/Resources/Fonts/*.txt $PKG/fonts/
# --- Download stb_truetype.h ---
curl -fsSL -o $PKG/stb_truetype.h \
https://raw.githubusercontent.com/nothings/stb/master/stb_truetype.h
# --- Download SDL3 prebuilt binaries ---
SDL3_URL="https://github.com/jeremyfa/build-sdl3/releases/download/sdl3-77f4a8e"
curl -fsSL -o /tmp/sdl3-mac.zip "$SDL3_URL/sdl3-mac-universal.zip"
mkdir -p $PKG/sdl3/mac && unzip -qo /tmp/sdl3-mac.zip -d $PKG/sdl3/mac
curl -fsSL -o /tmp/sdl3-linux-x64.tar.gz "$SDL3_URL/sdl3-linux-x64.tar.gz"
mkdir -p $PKG/sdl3/linux-x64 && tar xzf /tmp/sdl3-linux-x64.tar.gz -C $PKG/sdl3/linux-x64
curl -fsSL -o /tmp/sdl3-linux-arm64.tar.gz "$SDL3_URL/sdl3-linux-arm64.tar.gz"
mkdir -p $PKG/sdl3/linux-arm64 && tar xzf /tmp/sdl3-linux-arm64.tar.gz -C $PKG/sdl3/linux-arm64
curl -fsSL -o /tmp/sdl3-windows.zip "$SDL3_URL/sdl3-windows-x64.zip"
mkdir -p $PKG/sdl3/windows && unzip -qo /tmp/sdl3-windows.zip -d $PKG/sdl3/windows
curl -fsSL -o /tmp/sdl3-ios.zip "$SDL3_URL/sdl3-ios-universal.zip"
mkdir -p $PKG/sdl3/ios && unzip -qo /tmp/sdl3-ios.zip -d $PKG/sdl3/ios
curl -fsSL -o /tmp/sdl3-android.zip "$SDL3_URL/sdl3-android-r27.zip"
mkdir -p $PKG/sdl3/android && unzip -qo /tmp/sdl3-android.zip -d $PKG/sdl3/android
# Discard Android static libs (~71MB, not used)
rm -rf $PKG/sdl3/android/lib
# --- Download SDL3 Java sources for Android ---
SDL3_COMMIT="77f4a8e2b8066d3bc376eab1ce443e57bc04d4ee"
SDL3_JAVA_DIR="$PKG/android/app/src/main/java/org/libsdl/app"
mkdir -p "$SDL3_JAVA_DIR"
SDL3_JAVA_BASE="https://raw.githubusercontent.com/libsdl-org/SDL/$SDL3_COMMIT/android-project/app/src/main/java/org/libsdl/app"
for f in SDL.java SDLActivity.java SDLAudioManager.java \
SDLControllerManager.java SDLDummyEdit.java \
SDLInputConnection.java SDLSurface.java \
HIDDevice.java HIDDeviceBLESteamController.java \
HIDDeviceManager.java HIDDeviceUSB.java; do
curl -fsSL -o "$SDL3_JAVA_DIR/$f" "$SDL3_JAVA_BASE/$f"
done
# --- Extract Loreline binaries from CI artifacts ---
cd artifacts
unzip -qo loreline-mac.zip/loreline-mac.zip -d mac-tmp
unzip -qo loreline-windows.zip/loreline-windows.zip -d win-tmp
unzip -qo loreline-linux-x86_64.zip/loreline-linux-x86_64.zip -d linux-x86_64-tmp
unzip -qo loreline-linux-arm64.zip/loreline-linux-arm64.zip -d linux-arm64-tmp
unzip -qo loreline-ios.zip/loreline-ios.zip -d ios-tmp
unzip -qo loreline-android.zip/loreline-android.zip -d android-tmp
cd ..
# Header
mkdir -p $PKG/loreline/include
cp artifacts/mac-tmp/cpp/include/Loreline.h $PKG/loreline/include/
# Mac
mkdir -p $PKG/loreline/mac
cp artifacts/mac-tmp/cpp/lib/libLoreline.dylib $PKG/loreline/mac/
# Windows
mkdir -p $PKG/loreline/windows
cp artifacts/win-tmp/cpp/lib/Loreline.dll $PKG/loreline/windows/
cp artifacts/win-tmp/cpp/lib/Loreline.lib $PKG/loreline/windows/
# Linux x86_64
mkdir -p $PKG/loreline/linux-x86_64
cp artifacts/linux-x86_64-tmp/cpp/lib/libLoreline.so $PKG/loreline/linux-x86_64/
# Linux aarch64
mkdir -p $PKG/loreline/linux-aarch64
cp artifacts/linux-arm64-tmp/cpp/lib/libLoreline.so $PKG/loreline/linux-aarch64/
# iOS xcframework
mkdir -p $PKG/loreline/ios
cp -r artifacts/ios-tmp/Loreline.xcframework $PKG/loreline/ios/
# Android: extract jni/{abi}/libloreline.so from .aar
mkdir -p $PKG/loreline/android
unzip -qo artifacts/android-tmp/loreline.aar "jni/*" -d $PKG/loreline/android/
# Make build scripts executable
chmod +x $PKG/build-*.sh $PKG/run-*.sh 2>/dev/null || true
- name: Install Apple certificate
if: env.CODESIGN == 'true'
env:
APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
run: |
CERT_PATH=$RUNNER_TEMP/certificate.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
KEYCHAIN_PASSWORD=$(openssl rand -hex 12)
echo -n "$APPLE_CERTIFICATE_P12" | base64 --decode -o $CERT_PATH
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security import $CERT_PATH -P "$APPLE_CERTIFICATE_PASSWORD" \
-A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: \
-k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychains -d user -s $KEYCHAIN_PATH login.keychain
- name: Sign macOS and iOS binaries
if: env.CODESIGN == 'true'
run: |
PKG=loreline-sdl3-pkg
IDENTITY="Developer ID Application"
# Sign all macOS dylibs (SDL3 + Loreline)
find $PKG/sdl3/mac -name "*.dylib" -exec \
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp {} \;
codesign --force --options runtime \
--entitlements tpl/mac/entitlements.plist \
--sign "$IDENTITY" --timestamp \
$PKG/loreline/mac/libLoreline.dylib
# Sign iOS frameworks
find $PKG/sdl3/ios -name "*.framework" -exec \
codesign --force --sign "$IDENTITY" --timestamp {} \;
find $PKG/loreline/ios -name "*.framework" -exec \
codesign --force --sign "$IDENTITY" --timestamp {} \;
- name: Create zip archive
run: cd loreline-sdl3-pkg && zip --symlinks -9 ../loreline-sdl3.zip -r .
- name: Notarize SDL3 package
if: env.CODESIGN == 'true'
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
run: |
xcrun notarytool submit loreline-sdl3.zip \
--apple-id "$APPLE_ID" \
--password "$APPLE_ID_PASSWORD" \
--team-id "$APPLE_TEAM_ID" \
--wait --timeout 15m
- name: Cleanup keychain
if: ${{ always() }}
run: security delete-keychain $RUNNER_TEMP/app-signing.keychain-db 2>/dev/null || true
- name: Upload artifact
uses: actions/upload-artifact@v6
with:
retention-days: 1
name: loreline-sdl3.zip
path: loreline-sdl3.zip
compression-level: 0
loreline-sdl3-verify:
needs: [loreline-sdl3]
strategy:
matrix:
include:
- os: macos-14
script: ./build-mac.sh
- os: ubuntu-22.04
script: ./build-linux.sh
- os: ubuntu-22.04-arm
script: ./build-linux.sh
- os: ubuntu-22.04
script: ./build-android.sh
android: true
- os: windows-2022
script: ./build-windows.bat
runs-on: ${{ matrix.os }}
steps:
- name: Setup Java
if: matrix.android
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
- name: Setup Android SDK
if: matrix.android
uses: android-actions/setup-android@v2
- name: Install Android NDK
if: matrix.android
run: echo "y" | sdkmanager "ndk;27.3.13750724"
- name: Download loreline-sdl3.zip
uses: actions/download-artifact@v7
with:
name: loreline-sdl3.zip
path: .
- name: Unpack and build
shell: bash
run: |
unzip -qo loreline-sdl3.zip -d loreline-sdl3
cd loreline-sdl3
chmod +x build-*.sh 2>/dev/null || true
${{ matrix.script }}
create-release:
if: startsWith(github.ref, 'refs/tags/')
needs: [loreline-windows, loreline-mac, loreline-linux, loreline-ios, loreline-android, loreline-wasm, loreline-js, loreline-csharp, loreline-python, loreline-lua, loreline-unity, loreline-web, loreline-jvm, loreline-cpp, loreline-sdl3, loreline-sdl3-verify, loreline-godot]
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download loreline-windows.zip
uses: actions/download-artifact@v7
with:
name: loreline-windows.zip
path: .
- name: Download loreline-mac.zip
uses: actions/download-artifact@v7
with:
name: loreline-mac.zip
path: .
- name: Download loreline-linux-x86_64.zip
uses: actions/download-artifact@v7
with:
name: loreline-linux-x86_64.zip
path: .
- name: Download loreline-linux-arm64.zip
uses: actions/download-artifact@v7
with:
name: loreline-linux-arm64.zip
path: .
- name: Download loreline-js.zip
uses: actions/download-artifact@v7
with:
name: loreline-js.zip
path: .
- name: Download loreline-csharp.zip
uses: actions/download-artifact@v7
with:
name: loreline-csharp.zip
path: .
- name: Download loreline-unity.zip
uses: actions/download-artifact@v7
with:
name: loreline-unity.zip
path: .
- name: Download loreline.unitypackage
uses: actions/download-artifact@v7
with:
name: loreline.unitypackage
path: .
- name: Download loreline-web.zip
uses: actions/download-artifact@v7
with:
name: loreline-web.zip
path: .
- name: Download loreline-python.zip
uses: actions/download-artifact@v7
with:
name: loreline-python.zip
path: .
- name: Download loreline-lua.zip
uses: actions/download-artifact@v7
with:
name: loreline-lua.zip
path: .
- name: Download loreline-cpp.zip
uses: actions/download-artifact@v7
with:
name: loreline-cpp.zip
path: .
- name: Download loreline-jvm.zip
uses: actions/download-artifact@v7
with:
name: loreline-jvm.zip
path: .
- name: Download loreline-ios.zip
uses: actions/download-artifact@v7
with:
name: loreline-ios.zip
path: .
- name: Download loreline-android.zip
uses: actions/download-artifact@v7
with:
name: loreline-android.zip
path: .
- name: Download loreline-sdl3.zip
uses: actions/download-artifact@v7
with:
name: loreline-sdl3.zip
path: .
- name: Download loreline-wasm.zip
uses: actions/download-artifact@v7
with:
name: loreline-wasm.zip
path: .
- name: Download loreline-godot.zip
uses: actions/download-artifact@v7
with:
name: loreline-godot.zip
path: .
- name: Extract tag name
id: extract_tag
run: echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref }}
name: Loreline ${{ env.TAG_NAME }}
body: |
Loreline ${{ env.TAG_NAME }}
draft: false
prerelease: false
files: |
loreline-windows.zip
loreline-mac.zip
loreline-linux-x86_64.zip
loreline-linux-arm64.zip
loreline-ios.zip
loreline-android.zip
loreline-sdl3.zip
loreline-js.zip
loreline-csharp.zip
loreline-unity.zip
loreline.unitypackage
loreline-web.zip
loreline-python.zip
loreline-lua.zip
loreline-jvm.zip
loreline-cpp.zip
loreline-wasm.zip
loreline-godot.zip