You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Upstream godot-cpp moved off "tag tracks the engine" (godot-4.5-stable) onto
its own version line, and 10.0.0-rc1 is the first of it. Which engine it
binds is in the api header rather than the tag:
"version_full_name": "Godot Engine v4.6.stable.official"
so the index now carries 4.5.0 (Godot 4.5) and 10.0.0-rc1 (Godot 4.6), each
with its own workspace member.
repack.sh dispatches on the actual signature and the actual files rather than
on the tag: generate_bindings() grew an `interface_filepath` parameter, and
gdextension_interface.h stopped being checked in -- it is generated from
gdextension_interface.json into gen/include/. Re-running the updated script
on godot-4.5-stable still reproduces b0c36e77..., so the change is backward
compatible; 10.0.0-rc1 hashes identically across two runs.
The descriptor takes the union of both layouts, catch2-style (a glob matching
nothing is skipped): 10.x adds one .cpp directly under gen/src/.
TYPED_METHOD_BIND is the second half of this change, and it is a bug fix.
Without it, method_bind.hpp reinterpret_casts member pointers through a
FORWARD-DECLARED `_gde_UnexistingClass`; under the MSVC ABI a
pointer-to-member's size depends on the class's inheritance model, so for an
incomplete class the cast is rejected:
error: cannot reinterpret_cast from member pointer type
'double (TestSprite::*)() const' to member pointer type
'double (_gde_UnexistingClass::*)() const' of different size
i.e. EVERY ClassDB::bind_method call failed to compile on Windows. Upstream's
cmake sets it PUBLIC on MSVC for exactly this reason. It rides on the default
feature unconditionally rather than per-OS: it is a header switch that
changes MethodBindT's template parameter list, so library and consumer must
agree, and the cost off MSVC is only extra template instantiation.
WINDOWS_ENABLED and NOMINMAX, which upstream sets alongside, are not needed --
neither appears anywhere in the shipped headers or sources.
Both members now build a GDCLASS subclass with bound methods, which is what
the Windows leg was missing: the old assertions were pure math and never
reached bind_method, so a guaranteed compile error went unseen. godot-cpp-v10
additionally asserts GODOT_VERSION_MAJOR/MINOR == 4/6 and the presence of
EditorDock (4.6-only), so the two members cannot be confused for each other.
Verified locally with the CI-pinned mcpp 2026.8.3.3:
godot-cpp -> bind=1 vec2=1 vec3=1 basis=1 color=1 aabb=1 gen=1 ... ok
godot-cpp-v10 -> version=1 bind=1 vec2=1 ... gen=1 ... ok
Co-authored-by: Sunrisepeak <x.d2learn.org@gmail.com>
| Runtime loader compat (pure sources, sidestepping upstream codegen/asm) |[`compat.vulkan`](pkgs/c/compat.vulkan.lua) (the Khronos loader: `loader/generated/` is checked in, and the assembly path degrades to plain C through `UNKNOWN_FUNCTIONS_SUPPORTED`, so no CMake/Python/assembler is needed; windows deferred) · [`compat.vulkan-headers`](pkgs/c/compat.vulkan-headers.lua)|
44
44
| Whole-source direct build + generated config (only where a platform lacks one) |[`compat.curl`](pkgs/c/compat.curl.lua) (win32 uses upstream's checked-in config, unix generates one) · [`compat.sdl2`](pkgs/c/compat.sdl2.lua) (win/mac use upstream's checked-in config; linux generates one and enables X11 by hand) |
45
-
| Upstream codegen frozen into the mirror archive |[`compat.godot-cpp`](pkgs/c/compat.godot-cpp.lua) (the ~1000 GDExtension classes under `gen/` exist in no upstream tag archive — upstream's `binding_generator.py` emits them at build time. Running it once offline and publishing upstream's tree byte-for-byte **plus**`gen/` keeps Python off the consumer side entirely; `tools/godot-cpp/repack.sh` reproduces the archive deterministically and refuses to publish if any upstream file differs) |
45
+
| Upstream codegen frozen into the mirror archive |[`compat.godot-cpp`](pkgs/c/compat.godot-cpp.lua) (two versions: `4.5.0` = the`godot-4.5-stable` bindings, `10.0.0-rc1` = godot-cpp's own 10.x line, whose bindings target Godot 4.6. The~1000 GDExtension classes under `gen/` exist in no upstream tag archive — upstream's `binding_generator.py` emits them at build time. Running it once offline and publishing upstream's tree byte-for-byte **plus**`gen/` keeps Python off the consumer side entirely; `tools/godot-cpp/repack.sh` reproduces the archive deterministically and refuses to publish if any upstream file differs) |
46
46
| Header package filling a gap in the index |[`compat.glx-headers`](pkgs/c/compat.glx-headers.lua) (libglvnd's `GL/glx.h`, absent from the Khronos registry and required by SDL's X11 backend) |
47
47
| C++ application framework compat (dependencies reuse packages already in the index) |[`compat.eui-neo`](pkgs/e/compat.eui-neo.lua) (upstream's `3rd/` ships 8 vendored dependencies; none of them is compiled here — all are redirected to the same-version `compat.*` packages in this index) |
48
48
| Mutually exclusive backends (one of several inside one package) |[`compat.eui-neo`](pkgs/e/compat.eui-neo.lua): `vulkan` / `sdl2` each **replace** the default OpenGL / GLFW, and the default backend is expressed by *naming no feature at all* — there is no `opengl`/`glfw` feature. A `default` feature cannot express exclusivity: its own `defines`/`sources`/`deps` have no effect whatsoever, while its `implies` always applies and cannot be overridden by a named feature (which is, conversely, exactly the solution for the "always-on interface define" row below). The workable answer is to read the `-DMCPP_FEATURE_<NAME>` mcpp passes anyway and decide up front in a force-included header. Note also that `cflags` only reaches C TUs — C++ needs `cxxflags`, so a backend define written only into `cflags` never reaches any `.cpp`|
0 commit comments