Skip to content

Commit 5f68890

Browse files
committed
Replace godot bind versioning with redot bind versioning
Add godot bind versioning compatibility
1 parent d755f2f commit 5f68890

4 files changed

Lines changed: 68 additions & 14 deletions

File tree

binding_generator.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1976,11 +1976,20 @@ def generate_version_header(api, output_dir):
19761976
header.append(f"#define {header_guard}")
19771977
header.append("")
19781978

1979+
header.append(f"#define REDOT_VERSION_MAJOR {api['redot_header']['version_major']}")
1980+
header.append(f"#define REDOT_VERSION_MINOR {api['redot_header']['version_minor']}")
1981+
header.append(f"#define REDOT_VERSION_PATCH {api['redot_header']['version_patch']}")
1982+
header.append(f"#define REDOT_VERSION_STATUS \"{api['redot_header']['version_status']}\"")
1983+
header.append(f"#define REDOT_VERSION_STATUS_VERSION {api['redot_header']['version_status_version']}")
1984+
header.append(f"#define REDOT_VERSION_BUILD \"{api['redot_header']['version_build']}\"")
1985+
19791986
header.append(f"#define GODOT_VERSION_MAJOR {api['header']['version_major']}")
19801987
header.append(f"#define GODOT_VERSION_MINOR {api['header']['version_minor']}")
19811988
header.append(f"#define GODOT_VERSION_PATCH {api['header']['version_patch']}")
19821989
header.append(f"#define GODOT_VERSION_STATUS \"{api['header']['version_status']}\"")
1983-
header.append(f"#define GODOT_VERSION_STATUS_VERSION \"{api['header']['version_status_version']}\"")
1990+
header.append(
1991+
f"#define GODOT_VERSION_STATUS_VERSION {next(filter(str.isdigit, api['header']['version_status']), 0)}"
1992+
)
19841993
header.append(f"#define GODOT_VERSION_BUILD \"{api['header']['version_build']}\"")
19851994

19861995
header.append("")

gdextension/extension_api.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"header": {
2+
"redot_header": {
33
"version_major": 4,
44
"version_minor": 3,
55
"version_patch": 1,
@@ -8,6 +8,14 @@
88
"version_build": "official",
99
"version_full_name": "Redot Engine v4.3.1.rc.1.official"
1010
},
11+
"header": {
12+
"version_major": 4,
13+
"version_minor": 3,
14+
"version_patch": 1,
15+
"version_status": "dev",
16+
"version_build": "redot.custom_build",
17+
"version_full_name": "Godot Engine v4.3.1.dev.redot.custom_build"
18+
},
1119
"builtin_class_sizes": [
1220
{
1321
"build_configuration": "float_32",

include/godot_cpp/godot.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ extern "C" GDExtensionClassLibraryPtr library;
4444
extern "C" void *token;
4545

4646
extern "C" GDExtensionGodotVersion godot_version;
47+
extern "C" GDExtensionGodotVersion redot_version;
4748

4849
// All of the GDExtension interface functions.
4950
extern "C" GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version;
51+
extern "C" GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version;
5052
extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc;
5153
extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc;
5254
extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free;

src/godot.cpp

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ GDExtensionClassLibraryPtr library = nullptr;
5050
void *token = nullptr;
5151

5252
GDExtensionGodotVersion godot_version = { 0, 0, 0, nullptr };
53+
GDExtensionRedotVersion redot_version = { 0, 0, 0, 0, nullptr, 0, nullptr, nullptr, 0, nullptr };
5354

5455
// All of the GDExtension interface functions.
5556
GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version = nullptr;
57+
GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version = nullptr;
5658
GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr;
5759
GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr;
5860
GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr;
@@ -307,28 +309,61 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
307309
LOAD_PROC_ADDRESS(get_godot_version, GDExtensionInterfaceGetGodotVersion);
308310
internal::gdextension_interface_get_godot_version(&internal::godot_version);
309311

310-
// Check that godot-cpp was compiled using an extension_api.json older or at the
311-
// same version as the Godot that is loading it.
312+
internal::gdextension_interface_get_redot_version = (GDExtensionInterfaceGetRedotVersion)p_get_proc_address("get_redot_version");
313+
if (internal::gdextension_interface_get_redot_version) {
314+
internal::gdextension_interface_get_redot_version(&internal::redot_version);
315+
} else {
316+
internal::redot_version.major = internal::godot_version.major;
317+
internal::redot_version.minor = internal::godot_version.minor;
318+
internal::redot_version.patch = internal::godot_version.patch;
319+
internal::redot_version.string = internal::godot_version.string;
320+
}
321+
322+
// Check that redot-cpp was compiled using an extension_api.json older or at the
323+
// same version as the Redot that is loading it.
312324
bool compatible;
313-
if (internal::godot_version.major != GODOT_VERSION_MAJOR) {
314-
compatible = internal::godot_version.major > GODOT_VERSION_MAJOR;
315-
} else if (internal::godot_version.minor != GODOT_VERSION_MINOR) {
316-
compatible = internal::godot_version.minor > GODOT_VERSION_MINOR;
325+
if (internal::gdextension_interface_get_redot_version) {
326+
if (internal::redot_version.major != REDOT_VERSION_MAJOR) {
327+
compatible = internal::redot_version.major > REDOT_VERSION_MAJOR;
328+
} else if (internal::redot_version.minor != REDOT_VERSION_MINOR) {
329+
compatible = internal::redot_version.minor > REDOT_VERSION_MINOR;
330+
} else {
331+
#if GODOT_VERSION_PATCH > 0
332+
compatible = internal::redot_version.patch >= REDOT_VERSION_PATCH;
333+
#else
334+
// Prevent -Wtype-limits warning due to unsigned comparison.
335+
compatible = true;
336+
#endif
337+
}
317338
} else {
339+
// Check that godot-cpp was compiled using an extension_api.json older or at the
340+
// same version as the Redot that is loading it.
341+
if (internal::godot_version.major != GODOT_VERSION_MAJOR) {
342+
compatible = internal::godot_version.major > GODOT_VERSION_MAJOR;
343+
} else if (internal::godot_version.minor != GODOT_VERSION_MINOR) {
344+
compatible = internal::godot_version.minor > GODOT_VERSION_MINOR;
345+
} else {
318346
#if GODOT_VERSION_PATCH > 0
319-
compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
347+
compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
320348
#else
321-
// Prevent -Wtype-limits warning due to unsigned comparison.
322-
compatible = true;
349+
// Prevent -Wtype-limits warning due to unsigned comparison.
350+
compatible = true;
323351
#endif
352+
}
324353
}
325354
if (!compatible) {
326355
// We need to use snprintf() here because vformat() uses Variant, and we haven't loaded
327356
// the GDExtension interface far enough to use Variants yet.
328357
char msg[128];
329-
snprintf(msg, 128, "Cannot load a GDExtension built for Godot %d.%d.%d using an older version of Godot (%d.%d.%d).",
330-
GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH,
331-
internal::godot_version.major, internal::godot_version.minor, internal::godot_version.patch);
358+
if (internal::gdextension_interface_get_redot_version) {
359+
snprintf(msg, 128, "Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Redot (%d.%d.%d).",
360+
REDOT_VERSION_MAJOR, REDOT_VERSION_MINOR, REDOT_VERSION_PATCH,
361+
internal::redot_version.major, internal::redot_version.minor, internal::redot_version.patch);
362+
} else {
363+
snprintf(msg, 128, "Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Godot (%d.%d.%d).",
364+
GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH,
365+
internal::godot_version.major, internal::godot_version.minor, internal::godot_version.patch);
366+
}
332367
ERR_PRINT_EARLY(msg);
333368
return false;
334369
}

0 commit comments

Comments
 (0)