Skip to content

Commit befbf0d

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

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ env:
66
# Only used for the cache key. Increment version to force clean build.
77
GODOT_BASE_BRANCH: master
88
# Used to select the version of Redot to run the tests with.
9-
REDOT_TEST_VERSION: 4.3.1-alpha.1
9+
REDOT_TEST_VERSION: 4.3.1-rc.1
1010
# Use UTF-8 on Linux.
1111
LANG: en_US.UTF-8
1212
LC_ALL: en_US.UTF-8

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" GDExtensionRedotVersion 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: 19 additions & 10 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,16 +309,23 @@ 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+
ERR_PRINT_EARLY("Cannot load a GDExtension built for Redot using Godot or non-Redot derivative.");
315+
return false;
316+
}
317+
internal::gdextension_interface_get_redot_version(&internal::redot_version);
318+
319+
// Check that redot-cpp was compiled using an extension_api.json older or at the
320+
// same version as the Redot that is loading it.
312321
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;
322+
if (internal::redot_version.major != REDOT_VERSION_MAJOR) {
323+
compatible = internal::redot_version.major > REDOT_VERSION_MAJOR;
324+
} else if (internal::redot_version.minor != REDOT_VERSION_MINOR) {
325+
compatible = internal::redot_version.minor > REDOT_VERSION_MINOR;
317326
} else {
318327
#if GODOT_VERSION_PATCH > 0
319-
compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH;
328+
compatible = internal::redot_version.patch >= REDOT_VERSION_PATCH;
320329
#else
321330
// Prevent -Wtype-limits warning due to unsigned comparison.
322331
compatible = true;
@@ -326,9 +335,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge
326335
// We need to use snprintf() here because vformat() uses Variant, and we haven't loaded
327336
// the GDExtension interface far enough to use Variants yet.
328337
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);
338+
snprintf(msg, 128, "Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Redot (%d.%d.%d).",
339+
REDOT_VERSION_MAJOR, REDOT_VERSION_MINOR, REDOT_VERSION_PATCH,
340+
internal::redot_version.major, internal::redot_version.minor, internal::redot_version.patch);
332341
ERR_PRINT_EARLY(msg);
333342
return false;
334343
}

0 commit comments

Comments
 (0)