From 06d91a6280de974b752559e91e6c9e935d45600d Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 21 Oct 2026 16:17:02 +0100 Subject: [PATCH 1/9] python 3.15 and pypy 3.12 build --- .github/workflows/build.yml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 572fc91..2775fca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,9 @@ jobs: "3.12", "3.13", "3.14", + "3.15", "pypy-3.11", + "pypy-3.12", ] raylib-platform: ["Desktop", "SDL"] env: @@ -142,7 +144,7 @@ jobs: runs-on: macos-14 strategy: matrix: - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "pypy-3.11", "pypy-3.12"] raylib-platform: ["Desktop", "SDL"] env: MACOSX_DEPLOYMENT_TARGET: "11" @@ -259,7 +261,7 @@ jobs: - /tmp:/__e/node20 env: # Github Actions Checkout now wants Node 24. Maybe easier just to stop using Checkout than keep messing around with Node. - ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true strategy: # You can use PyPy versions in python-version. # For example, pypy2 and pypy3 @@ -274,7 +276,9 @@ jobs: "python3.12", "python3.13", "python3.14", + "python3.15", "pypy3.11", + "pypy3.12" ] raylib-platform: ["Desktop", "SDL", "DRM", "SDL_SOFT"] steps: @@ -406,7 +410,7 @@ jobs: - /tmp:/__e/node20 env: # Github Actions Checkout now wants Node 24. Maybe easier just to stop using Checkout than keep messing around with Node. - ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true strategy: # You can use PyPy versions in python-version. # For example, pypy2 and pypy3 @@ -421,6 +425,7 @@ jobs: "python3.12", "python3.13", "python3.14", + "python3.15" ] raylib-platform: ["Desktop", "SDL", "DRM", "SDL_SOFT"] steps: @@ -540,7 +545,7 @@ jobs: runs-on: ubuntu-22.04-arm strategy: matrix: - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] raylib-platform: ["Desktop", "SDL", "SDL_SOFT"] steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it @@ -676,6 +681,8 @@ jobs: docker-tag: "python3.13-bullseye" - python-version: "3.14" docker-tag: "python3.14-bookworm" + - python-version: "3.15" + docker-tag: "python3.15-bookworm" steps: - name: update cmake run: | @@ -778,7 +785,9 @@ jobs: "3.12", "3.13", "3.14", + "3.15", "pypy-3.11", + "pypy-3.12" ] raylib-platform: ["Desktop", "SDL", "SDL_SOFT"] steps: @@ -893,7 +902,7 @@ jobs: # For example, pypy2 and pypy3 matrix: python-version: - ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14", "3.15"] raylib-platform: ["Desktop", "SDL", "SDL_SOFT"] steps: - uses: actions/checkout@v4 From dbf0d29713ffede18b7a47bfb10d66aab03fa2fa Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 21 Oct 2026 17:10:32 +0100 Subject: [PATCH 2/9] update docs --- AGENTS.md | 2 +- README.md | 6 +++--- create_stub_static.py | 15 ++++++++++++--- docs/.buildinfo | 2 +- docs/README.html | 22 +++++++++++----------- docs/RPI.html | 4 ++-- docs/_sources/README.md.txt | 6 +++--- docs/objects.inv | Bin 26468 -> 26595 bytes docs/pyray.html | 6 +++--- docs/raylib.html | 8 ++++---- 10 files changed, 40 insertions(+), 31 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ea41560..66cb02c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -This is **raylib-python-cffi** (version 6.0.1.0), Python CFFI bindings for Raylib 6.0 game development library. It provides two main Python modules: +This is **raylib-python-cffi** (version 6.0.1.1), Python CFFI bindings for Raylib 6.0 game development library. It provides two main Python modules: - `raylib`: Direct C API bindings (exact copy of C functions) - `pyray`: More Pythonic API wrapper diff --git a/README.md b/README.md index 194fef5..7e8071b 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ original Raylib. # Quickstart -`pip3 install raylib==6.0.1.0 --break-system-packages` +`pip3 install raylib==6.0.1.1 --break-system-packages` ```python from pyray import * init_window(800, 450, "Hello") @@ -73,7 +73,7 @@ Then make sure you have the latest pip installed: Then install python3 -m pip install setuptools - python3 -m pip install raylib==6.0.1.0 + python3 -m pip install raylib==6.0.1.1 On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g. @@ -95,7 +95,7 @@ Older MacOS requires building from source but this is usually simple: brew install pkg-config brew install raylib - python3 -m pip install raylib==6.0.1.0 + python3 -m pip install raylib==6.0.1.1 ## Linux diff --git a/create_stub_static.py b/create_stub_static.py index a192262..1a5b8f5 100644 --- a/create_stub_static.py +++ b/create_stub_static.py @@ -137,17 +137,26 @@ class struct: ... # continue print(f"class {struct}:") # sig = "" - fields = ffi.typeof(struct).fields + # Opaque structs (e.g. GLFWcursor, GLFWmonitor, GLFWwindow, rAudioBuffer, + # rAudioProcessor) are never defined in the parsed headers. cffi >= 2.0.0 + # hard-aborts the process (C assert) when accessing .fields on an opaque + # struct, instead of returning None like cffi 1.x did. ffi.sizeof() raises + # a normal Python exception for opaque structs, so use it to test first. + fields = None + try: + ffi.sizeof(ffi.typeof(struct)) + fields = ffi.typeof(struct).fields + except Exception: + pass if fields is not None: #print(ffi.typeof(struct).fields) #print(f" {arg}: {arg}") # print(f" def __init__(self{sig}):") # - for arg in ffi.typeof(struct).fields: + for arg in fields: print(f" {arg[0]}: {ctype_to_python_type(arg[1].type.cname)}") else: print(" ...") - # print(f" self.{arg[0]}={arg[0]}") elif ffi.typeof(struct).kind == "enum": print(f"{struct} = int") diff --git a/docs/.buildinfo b/docs/.buildinfo index aea702f..b7ba68d 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: d2e698b9576bffb5afca021582567e2a +config: 2370c1c0c28e9a086ad498bde8b78861 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/README.html b/docs/README.html index 0c60141..2e0e70d 100644 --- a/docs/README.html +++ b/docs/README.html @@ -145,13 +145,13 @@

Platforms: Windows, Mac, Linux, Raspberry Pi, Web

Quickstart

-

pip3 install raylib==6.0.1.0 --break-system-packages

+

pip3 install raylib==6.0.1.1 --break-system-packages

from pyray import *
-init_window(800, 450, "Hello")
+init_window(800, 450, "Hello")
 while not window_should_close():
     begin_drawing()
     clear_background(WHITE)
-    draw_text("Hello world", 190, 200, 20, VIOLET)
+    draw_text("Hello world", 190, 200, 20, VIOLET)
     end_drawing()
 close_window()
 
@@ -192,7 +192,7 @@

Installation
python3 -m pip install setuptools
-python3 -m pip install raylib==6.0.1.0
+python3 -m pip install raylib==6.0.1.1
 

On most platforms it should install a binary wheel. If yours isn’t available then pip will attempt to build from @@ -213,7 +213,7 @@

MacOSOlder MacOS requires building from source but this is usually simple:

brew install pkg-config
 brew install raylib
-python3 -m pip install raylib==6.0.1.0
+python3 -m pip install raylib==6.0.1.1
 

@@ -288,8 +288,8 @@

Running in a web browsermy_project with a file main.py:

diff --git a/docs/RPI.html b/docs/RPI.html index ca17393..125e7aa 100644 --- a/docs/RPI.html +++ b/docs/RPI.html @@ -123,7 +123,7 @@

Option 2: Compile Raylib from source X11 modemkdir build rm -rf build/* cd build -cmake -DPLATFORM="Desktop" -DOPENGL_VERSION=2.1 -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_BUSY_WAIT_LOOP=OFF -DSUPPORT_CUSTOM_FRAME_CONTROL=OFF -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. +cmake -DPLATFORM="Desktop" -DOPENGL_VERSION=2.1 -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_BUSY_WAIT_LOOP=OFF -DSUPPORT_CUSTOM_FRAME_CONTROL=OFF -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DWITH_PIC=ON -DCMAKE_BUILD_TYPE=Release .. make sudo make install sudo cp -r ../src/external/glfw/include/GLFW /usr/local/include/ @@ -157,7 +157,7 @@

Option 3: Compile Raylib from source DRM modemkdir build rm rf build/* cd build -cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_BUSY_WAIT_LOOP=OFF -DSUPPORT_CUSTOM_FRAME_CONTROL=OFF -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr .. +cmake -DPLATFORM="DRM" -DBUILD_EXAMPLES=OFF -DCUSTOMIZE_BUILD=ON -DSUPPORT_BUSY_WAIT_LOOP=OFF -DSUPPORT_CUSTOM_FRAME_CONTROL=OFF -DSUPPORT_FILEFORMAT_JPG=ON -DSUPPORT_FILEFORMAT_FLAC=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX:PATH=/usr .. make sudo make install

diff --git a/docs/_sources/README.md.txt b/docs/_sources/README.md.txt index 194fef5..7e8071b 100644 --- a/docs/_sources/README.md.txt +++ b/docs/_sources/README.md.txt @@ -21,7 +21,7 @@ original Raylib. # Quickstart -`pip3 install raylib==6.0.1.0 --break-system-packages` +`pip3 install raylib==6.0.1.1 --break-system-packages` ```python from pyray import * init_window(800, 450, "Hello") @@ -73,7 +73,7 @@ Then make sure you have the latest pip installed: Then install python3 -m pip install setuptools - python3 -m pip install raylib==6.0.1.0 + python3 -m pip install raylib==6.0.1.1 On most platforms it should install a binary wheel. If yours isn't available then pip will attempt to build from source, in which case you will need to have Raylib development libs installed, e.g. @@ -95,7 +95,7 @@ Older MacOS requires building from source but this is usually simple: brew install pkg-config brew install raylib - python3 -m pip install raylib==6.0.1.0 + python3 -m pip install raylib==6.0.1.1 ## Linux diff --git a/docs/objects.inv b/docs/objects.inv index 7180871f14058d70082c75a09b8d1c9714d88f18..d0e6873a919fb081238e6b6bf4b7cbe61fdedcb8 100644 GIT binary patch literal 26595 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 literal 26468 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 ob5<#a38!d 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 diff --git a/docs/pyray.html b/docs/pyray.html index 1d51195..7d0dbe3 100644 --- a/docs/pyray.html +++ b/docs/pyray.html @@ -2539,7 +2539,7 @@

Examples

Example program:

@@ -2562,7 +2562,7 @@

Examples

You can also now import the functions with no prefix:

from pyray import *
 
-init_window(800, 450, "Raylib texture test")
+init_window(800, 450, "Raylib texture test")
 ...
 
diff --git a/docs/raylib.html b/docs/raylib.html index 9418527..6183772 100644 --- a/docs/raylib.html +++ b/docs/raylib.html @@ -2505,10 +2505,10 @@

C APIExample program:

from raylib import *
 
-InitWindow(800, 450, b"Hello Raylib")
+InitWindow(800, 450, b"Hello Raylib")
 SetTargetFPS(60)
 
-camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0])
+camera = ffi.new("struct Camera3D *", [[18.0, 16.0, 18.0], [0.0, 0.0, 0.0], [0.0, 1.0, 0.0], 45.0, 0])
 
 while not WindowShouldClose():
     UpdateCamera(camera, CAMERA_ORBITAL)
@@ -2517,7 +2517,7 @@ 

C APIBeginMode3D(camera[0]) DrawGrid(20, 1.0) EndMode3D() - DrawText(b"Hellow World", 190, 200, 20, VIOLET) + DrawText(b"Hellow World", 190, 200, 20, VIOLET) EndDrawing() CloseWindow()

@@ -2525,7 +2525,7 @@

C APIIf you want to be more portable (i.e. same code will work with dynamic bindings) you can prefix the functions like this:

from raylib import ffi, rl, colors
 
-rl.InitWindow(800, 450, b"Hello Raylib")
+rl.InitWindow(800, 450, b"Hello Raylib")
 rl.SetTargetFPS(60)
 
 ...

From 96559bcf1ef6ef9a6dfae799028ac78f420449d3 Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 17:22:17 +0100
Subject: [PATCH 3/9] cffi windows doesnt work with pypy3.12

---
 .github/workflows/build.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2775fca..1f64c41 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -786,8 +786,7 @@ jobs:
             "3.13",
             "3.14",
             "3.15",
-            "pypy-3.11",
-            "pypy-3.12"
+            "pypy-3.11"
           ]
         raylib-platform: ["Desktop", "SDL", "SDL_SOFT"]
     steps:

From 321107726acf714ebd3cf505881a0906df4e977a Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 17:37:22 +0100
Subject: [PATCH 4/9] remove workaround for missing node24 in docker images

---
 .github/workflows/build.yml | 41 ++++++++++++++++++++++---------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 1f64c41..82857a5 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -257,11 +257,10 @@ jobs:
       image: electronstudio/ubuntu16-modern:latest
       options: --user root
       volumes:
-        # override /__e/node20 because GitHub Actions uses a version that requires too-recent glibc
+        # override /__e/node20 with the image's own node because the node that GitHub Actions
+        # puts there requires too-recent glibc.  Still needed for node actions such as
+        # actions/upload-artifact (we no longer use actions/checkout, we just run git directly).
         - /tmp:/__e/node20
-    env:
-      # Github Actions Checkout now wants Node 24.  Maybe easier just to stop using Checkout than keep messing around with Node.
-      ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
     strategy:
       # You can use PyPy versions in python-version.
       # For example, pypy2 and pypy3
@@ -307,9 +306,12 @@ jobs:
           cmake --build . --config Release
           cmake --install .
 
-      - uses: actions/checkout@v2
-        with:
-          submodules: recursive
+      - name: Checkout
+        run: |
+          git clone ${{ github.server_url }}/${{ github.repository }} .
+          git fetch --force origin "${{ github.ref }}"
+          git checkout --force FETCH_HEAD
+          git submodule update --init --recursive
 
       - name: fix raygui bug
         run: |
@@ -406,11 +408,10 @@ jobs:
       image: electronstudio/ubuntu16-modern:i386
       options: --user root --platform=linux/386
       volumes:
-        # override /__e/node20 because GitHub Actions uses a version that requires too-recent glibc
+        # override /__e/node20 with the image's own node because the node that GitHub Actions
+        # puts there requires too-recent glibc.  Still needed for node actions such as
+        # actions/upload-artifact (we no longer use actions/checkout, we just run git directly).
         - /tmp:/__e/node20
-    env:
-      # Github Actions Checkout now wants Node 24.  Maybe easier just to stop using Checkout than keep messing around with Node.
-      ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
     strategy:
       # You can use PyPy versions in python-version.
       # For example, pypy2 and pypy3
@@ -449,9 +450,12 @@ jobs:
           cmake --build . --config Release
           cmake --install .
 
-      - uses: actions/checkout@v2
-        with:
-          submodules: recursive
+      - name: Checkout
+        run: |
+          git clone ${{ github.server_url }}/${{ github.repository }} .
+          git fetch --force origin "${{ github.ref }}"
+          git checkout --force FETCH_HEAD
+          git submodule update --init --recursive
 
       - name: fix raygui bug
         run: |
@@ -695,9 +699,12 @@ jobs:
           apt update
           apt -y install libdrm-dev libgbm-dev libegl-dev libgles2-mesa-dev libasound2-dev libedit2
 
-      - uses: actions/checkout@v2
-        with:
-          submodules: recursive
+      - name: Checkout
+        run: |
+          git clone ${{ github.server_url }}/${{ github.repository }} .
+          git fetch --force origin "${{ github.ref }}"
+          git checkout --force FETCH_HEAD
+          git submodule update --init --recursive
 
       - name: fix raygui bug
         run: |

From cd6638a9ccbbea75c2d3cb62561c4b30c61326fb Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 17:47:03 +0100
Subject: [PATCH 5/9] change macos arm deployment target from 11 to 12.0 since
 xcode doesnt seem to support 11.

---
 .github/workflows/build.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 82857a5..04b272a 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -147,7 +147,7 @@ jobs:
         python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15", "pypy-3.11", "pypy-3.12"]
         raylib-platform: ["Desktop", "SDL"]
     env:
-      MACOSX_DEPLOYMENT_TARGET: "11"
+      MACOSX_DEPLOYMENT_TARGET: "12.0"
     steps:
       # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
       - uses: actions/checkout@v4

From ad1a8506654c222811a14b708939b61670afa577 Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 17:52:32 +0100
Subject: [PATCH 6/9] fix checkout

---
 .github/workflows/build.yml | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 04b272a..9c01ea7 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -308,7 +308,10 @@ jobs:
 
       - name: Checkout
         run: |
-          git clone ${{ github.server_url }}/${{ github.repository }} .
+          # git init + fetch instead of actions/checkout (needs no node) and instead of
+          # git clone (earlier steps may have already put files in the workspace)
+          git init
+          git remote add origin ${{ github.server_url }}/${{ github.repository }}
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD
           git submodule update --init --recursive
@@ -452,7 +455,10 @@ jobs:
 
       - name: Checkout
         run: |
-          git clone ${{ github.server_url }}/${{ github.repository }} .
+          # git init + fetch instead of actions/checkout (needs no node) and instead of
+          # git clone (earlier steps may have already put files in the workspace)
+          git init
+          git remote add origin ${{ github.server_url }}/${{ github.repository }}
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD
           git submodule update --init --recursive
@@ -701,7 +707,10 @@ jobs:
 
       - name: Checkout
         run: |
-          git clone ${{ github.server_url }}/${{ github.repository }} .
+          # git init + fetch instead of actions/checkout (needs no node) and instead of
+          # git clone (earlier steps may have already put files in the workspace)
+          git init
+          git remote add origin ${{ github.server_url }}/${{ github.repository }}
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD
           git submodule update --init --recursive

From ca9377b95b23768b014a0a4d286b26752ea73182 Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 18:16:32 +0100
Subject: [PATCH 7/9] try again fix checkout

---
 .github/workflows/build.yml | 54 +++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 30 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 9c01ea7..c263632 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -281,6 +281,14 @@ jobs:
           ]
         raylib-platform: ["Desktop", "SDL", "DRM", "SDL_SOFT"]
     steps:
+      # Must be the first step so the workspace is empty and git clone works
+      - name: Checkout
+        run: |
+          git clone ${{ github.server_url }}/${{ github.repository }} .
+          git fetch --force origin "${{ github.ref }}"
+          git checkout --force FETCH_HEAD
+          git submodule update --init --recursive
+
       - name: fix node
         run: |
           ln -s /usr/local/bin /__e/node20/bin
@@ -306,16 +314,6 @@ jobs:
           cmake --build . --config Release
           cmake --install .
 
-      - name: Checkout
-        run: |
-          # git init + fetch instead of actions/checkout (needs no node) and instead of
-          # git clone (earlier steps may have already put files in the workspace)
-          git init
-          git remote add origin ${{ github.server_url }}/${{ github.repository }}
-          git fetch --force origin "${{ github.ref }}"
-          git checkout --force FETCH_HEAD
-          git submodule update --init --recursive
-
       - name: fix raygui bug
         run: |
           patch -p0 
Date: Wed, 21 Oct 2026 18:19:48 +0100
Subject: [PATCH 8/9] fix checkout again again

---
 .github/workflows/build.yml | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c263632..84df850 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -284,6 +284,9 @@ jobs:
       # Must be the first step so the workspace is empty and git clone works
       - name: Checkout
         run: |
+          # workspace dir is owned by the host runner user but we are root in the
+          # container, so tell git that is OK (avoids "dubious ownership" error)
+          git config --global --add safe.directory "$GITHUB_WORKSPACE"
           git clone ${{ github.server_url }}/${{ github.repository }} .
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD
@@ -434,6 +437,9 @@ jobs:
       # Must be the first step so the workspace is empty and git clone works
       - name: Checkout
         run: |
+          # workspace dir is owned by the host runner user but we are root in the
+          # container, so tell git that is OK (avoids "dubious ownership" error)
+          git config --global --add safe.directory "$GITHUB_WORKSPACE"
           git clone ${{ github.server_url }}/${{ github.repository }} .
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD
@@ -693,6 +699,9 @@ jobs:
       # Must be the first step so the workspace is empty and git clone works
       - name: Checkout
         run: |
+          # workspace dir is owned by the host runner user but we are root in the
+          # container, so tell git that is OK (avoids "dubious ownership" error)
+          git config --global --add safe.directory "$GITHUB_WORKSPACE"
           git clone ${{ github.server_url }}/${{ github.repository }} .
           git fetch --force origin "${{ github.ref }}"
           git checkout --force FETCH_HEAD

From b44103f4a8264b069fed676acdc13fa049048116 Mon Sep 17 00:00:00 2001
From: Richard Smith 
Date: Wed, 21 Oct 2026 18:33:57 +0100
Subject: [PATCH 9/9] node hack again

---
 .github/workflows/build.yml | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 84df850..d0a1fdd 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -257,10 +257,13 @@ jobs:
       image: electronstudio/ubuntu16-modern:latest
       options: --user root
       volumes:
-        # override /__e/node20 with the image's own node because the node that GitHub Actions
-        # puts there requires too-recent glibc.  Still needed for node actions such as
-        # actions/upload-artifact (we no longer use actions/checkout, we just run git directly).
+        # override /__e/node20 AND /__e/node24 with the image's own node because the nodes
+        # that GitHub Actions provides require too-recent glibc.  Still needed for node
+        # actions such as actions/upload-artifact (we no longer use actions/checkout, we
+        # just run git directly).  Since June 2026 the runner resolves ALL js actions to
+        # /__e/node24, so both paths must be overridden.
         - /tmp:/__e/node20
+        - /tmp:/__e/node24
     strategy:
       # You can use PyPy versions in python-version.
       # For example, pypy2 and pypy3
@@ -295,6 +298,7 @@ jobs:
       - name: fix node
         run: |
           ln -s /usr/local/bin /__e/node20/bin
+          ln -s /usr/local/bin /__e/node24/bin
 
       - name: setup wayland
         run: |
@@ -412,10 +416,13 @@ jobs:
       image: electronstudio/ubuntu16-modern:i386
       options: --user root --platform=linux/386
       volumes:
-        # override /__e/node20 with the image's own node because the node that GitHub Actions
-        # puts there requires too-recent glibc.  Still needed for node actions such as
-        # actions/upload-artifact (we no longer use actions/checkout, we just run git directly).
+        # override /__e/node20 AND /__e/node24 with the image's own node because the nodes
+        # that GitHub Actions provides require too-recent glibc.  Still needed for node
+        # actions such as actions/upload-artifact (we no longer use actions/checkout, we
+        # just run git directly).  Since June 2026 the runner resolves ALL js actions to
+        # /__e/node24, so both paths must be overridden.
         - /tmp:/__e/node20
+        - /tmp:/__e/node24
     strategy:
       # You can use PyPy versions in python-version.
       # For example, pypy2 and pypy3
@@ -448,6 +455,7 @@ jobs:
       - name: fix node
         run: |
           ln -s /usr/local/bin /__e/node20/bin
+          ln -s /usr/local/bin /__e/node24/bin
 
       - name: update cmake
         run: |