diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ebf5c3..3dc90a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ env: # Only used for the cache key. Increment version to force clean build. GODOT_BASE_BRANCH: master # Used to select the version of Redot to run the tests with. - REDOT_TEST_VERSION: 4.3.1-alpha.1 + REDOT_TEST_VERSION: 4.3.1-rc.1 # Use UTF-8 on Linux. LANG: en_US.UTF-8 LC_ALL: en_US.UTF-8 diff --git a/binding_generator.py b/binding_generator.py index 6c9150a..6403060 100644 --- a/binding_generator.py +++ b/binding_generator.py @@ -1976,11 +1976,20 @@ def generate_version_header(api, output_dir): header.append(f"#define {header_guard}") header.append("") + header.append(f"#define REDOT_VERSION_MAJOR {api['redot_header']['version_major']}") + header.append(f"#define REDOT_VERSION_MINOR {api['redot_header']['version_minor']}") + header.append(f"#define REDOT_VERSION_PATCH {api['redot_header']['version_patch']}") + header.append(f"#define REDOT_VERSION_STATUS \"{api['redot_header']['version_status']}\"") + header.append(f"#define REDOT_VERSION_STATUS_VERSION {api['redot_header']['version_status_version']}") + header.append(f"#define REDOT_VERSION_BUILD \"{api['redot_header']['version_build']}\"") + header.append(f"#define GODOT_VERSION_MAJOR {api['header']['version_major']}") header.append(f"#define GODOT_VERSION_MINOR {api['header']['version_minor']}") header.append(f"#define GODOT_VERSION_PATCH {api['header']['version_patch']}") header.append(f"#define GODOT_VERSION_STATUS \"{api['header']['version_status']}\"") - header.append(f"#define GODOT_VERSION_STATUS_VERSION \"{api['header']['version_status_version']}\"") + header.append( + f"#define GODOT_VERSION_STATUS_VERSION {next(filter(str.isdigit, api['header']['version_status']), 0)}" + ) header.append(f"#define GODOT_VERSION_BUILD \"{api['header']['version_build']}\"") header.append("") diff --git a/gdextension/extension_api.json b/gdextension/extension_api.json index 0bf77a6..69b5c2a 100644 --- a/gdextension/extension_api.json +++ b/gdextension/extension_api.json @@ -1,5 +1,5 @@ { - "header": { + "redot_header": { "version_major": 4, "version_minor": 3, "version_patch": 1, @@ -8,6 +8,14 @@ "version_build": "official", "version_full_name": "Redot Engine v4.3.1.rc.1.official" }, + "header": { + "version_major": 4, + "version_minor": 3, + "version_patch": 1, + "version_status": "dev", + "version_build": "redot.custom_build", + "version_full_name": "Godot Engine v4.3.1.dev.redot.custom_build" + }, "builtin_class_sizes": [ { "build_configuration": "float_32", diff --git a/include/godot_cpp/godot.hpp b/include/godot_cpp/godot.hpp index b80cbd5..41836fe 100644 --- a/include/godot_cpp/godot.hpp +++ b/include/godot_cpp/godot.hpp @@ -44,9 +44,11 @@ extern "C" GDExtensionClassLibraryPtr library; extern "C" void *token; extern "C" GDExtensionGodotVersion godot_version; +extern "C" GDExtensionRedotVersion redot_version; // All of the GDExtension interface functions. extern "C" GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version; +extern "C" GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version; extern "C" GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc; extern "C" GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc; extern "C" GDExtensionInterfaceMemFree gdextension_interface_mem_free; diff --git a/src/godot.cpp b/src/godot.cpp index e92c198..36a86ca 100644 --- a/src/godot.cpp +++ b/src/godot.cpp @@ -50,9 +50,11 @@ GDExtensionClassLibraryPtr library = nullptr; void *token = nullptr; GDExtensionGodotVersion godot_version = { 0, 0, 0, nullptr }; +GDExtensionRedotVersion redot_version = { 0, 0, 0, 0, nullptr, 0, nullptr, nullptr, 0, nullptr }; // All of the GDExtension interface functions. GDExtensionInterfaceGetGodotVersion gdextension_interface_get_godot_version = nullptr; +GDExtensionInterfaceGetRedotVersion gdextension_interface_get_redot_version = nullptr; GDExtensionInterfaceMemAlloc gdextension_interface_mem_alloc = nullptr; GDExtensionInterfaceMemRealloc gdextension_interface_mem_realloc = nullptr; GDExtensionInterfaceMemFree gdextension_interface_mem_free = nullptr; @@ -307,16 +309,23 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge LOAD_PROC_ADDRESS(get_godot_version, GDExtensionInterfaceGetGodotVersion); internal::gdextension_interface_get_godot_version(&internal::godot_version); - // Check that godot-cpp was compiled using an extension_api.json older or at the - // same version as the Godot that is loading it. + internal::gdextension_interface_get_redot_version = (GDExtensionInterfaceGetRedotVersion)p_get_proc_address("get_redot_version"); + if (!internal::gdextension_interface_get_redot_version) { + ERR_PRINT_EARLY("Cannot load a GDExtension built for Redot using Godot or non-Redot derivative."); + return false; + } + internal::gdextension_interface_get_redot_version(&internal::redot_version); + + // Check that redot-cpp was compiled using an extension_api.json older or at the + // same version as the Redot that is loading it. bool compatible; - if (internal::godot_version.major != GODOT_VERSION_MAJOR) { - compatible = internal::godot_version.major > GODOT_VERSION_MAJOR; - } else if (internal::godot_version.minor != GODOT_VERSION_MINOR) { - compatible = internal::godot_version.minor > GODOT_VERSION_MINOR; + if (internal::redot_version.major != REDOT_VERSION_MAJOR) { + compatible = internal::redot_version.major > REDOT_VERSION_MAJOR; + } else if (internal::redot_version.minor != REDOT_VERSION_MINOR) { + compatible = internal::redot_version.minor > REDOT_VERSION_MINOR; } else { #if GODOT_VERSION_PATCH > 0 - compatible = internal::godot_version.patch >= GODOT_VERSION_PATCH; + compatible = internal::redot_version.patch >= REDOT_VERSION_PATCH; #else // Prevent -Wtype-limits warning due to unsigned comparison. compatible = true; @@ -326,9 +335,9 @@ GDExtensionBool GDExtensionBinding::init(GDExtensionInterfaceGetProcAddress p_ge // We need to use snprintf() here because vformat() uses Variant, and we haven't loaded // the GDExtension interface far enough to use Variants yet. char msg[128]; - snprintf(msg, 128, "Cannot load a GDExtension built for Godot %d.%d.%d using an older version of Godot (%d.%d.%d).", - GODOT_VERSION_MAJOR, GODOT_VERSION_MINOR, GODOT_VERSION_PATCH, - internal::godot_version.major, internal::godot_version.minor, internal::godot_version.patch); + snprintf(msg, 128, "Cannot load a GDExtension built for Redot %d.%d.%d using an older version of Redot (%d.%d.%d).", + REDOT_VERSION_MAJOR, REDOT_VERSION_MINOR, REDOT_VERSION_PATCH, + internal::redot_version.major, internal::redot_version.minor, internal::redot_version.patch); ERR_PRINT_EARLY(msg); return false; }