Print expected `os.arch` tuple for current platform in GDExtension error

This also adds `Engine.get_architecture_name()` to get the name of the
CPU architecture the Godot binary was built for.
This commit is contained in:
Hugo Locurcio 2022-07-20 19:05:49 +02:00
parent 862dedcefe
commit 27a072c884
No known key found for this signature in database
GPG Key ID: 39E8F8BE30B0A49C
6 changed files with 64 additions and 3 deletions

View File

@ -181,6 +181,42 @@ String Engine::get_license_text() const {
return String(GODOT_LICENSE_TEXT); return String(GODOT_LICENSE_TEXT);
} }
String Engine::get_architecture_name() const {
#if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(_M_X64)
return "x86_64";
#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
return "x86_32";
#elif defined(__aarch64__) || defined(_M_ARM64)
return "arm64";
#elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7S__)
return "armv7";
#elif defined(__riscv)
#if __riscv_xlen == 8
return "rv64";
#else
return "riscv";
#endif
#elif defined(__powerpc__)
#if defined(__powerpc64__)
return "ppc64";
#else
return "ppc";
#endif
#elif defined(__wasm__)
#if defined(__wasm64__)
return "wasm64";
#elif defined(__wasm32__)
return "wasm32";
#endif
#endif
}
bool Engine::is_abort_on_gpu_errors_enabled() const { bool Engine::is_abort_on_gpu_errors_enabled() const {
return abort_on_gpu_errors; return abort_on_gpu_errors;
} }

View File

@ -142,6 +142,8 @@ public:
void set_write_movie_path(const String &p_path); void set_write_movie_path(const String &p_path);
String get_write_movie_path() const; String get_write_movie_path() const;
String get_architecture_name() const;
void set_shader_cache_path(const String &p_path); void set_shader_cache_path(const String &p_path);
String get_shader_cache_path() const; String get_shader_cache_path() const;

View File

@ -2270,6 +2270,10 @@ String Engine::get_license_text() const {
return ::Engine::get_singleton()->get_license_text(); return ::Engine::get_singleton()->get_license_text();
} }
String Engine::get_architecture_name() const {
return ::Engine::get_singleton()->get_architecture_name();
}
bool Engine::is_in_physics_frame() const { bool Engine::is_in_physics_frame() const {
return ::Engine::get_singleton()->is_in_physics_frame(); return ::Engine::get_singleton()->is_in_physics_frame();
} }
@ -2367,6 +2371,8 @@ void Engine::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_license_info"), &Engine::get_license_info); ClassDB::bind_method(D_METHOD("get_license_info"), &Engine::get_license_info);
ClassDB::bind_method(D_METHOD("get_license_text"), &Engine::get_license_text); ClassDB::bind_method(D_METHOD("get_license_text"), &Engine::get_license_text);
ClassDB::bind_method(D_METHOD("get_architecture_name"), &Engine::get_architecture_name);
ClassDB::bind_method(D_METHOD("is_in_physics_frame"), &Engine::is_in_physics_frame); ClassDB::bind_method(D_METHOD("is_in_physics_frame"), &Engine::is_in_physics_frame);
ClassDB::bind_method(D_METHOD("has_singleton", "name"), &Engine::has_singleton); ClassDB::bind_method(D_METHOD("has_singleton", "name"), &Engine::has_singleton);

View File

@ -666,6 +666,8 @@ public:
Dictionary get_license_info() const; Dictionary get_license_info() const;
String get_license_text() const; String get_license_text() const;
String get_architecture_name() const;
bool is_in_physics_frame() const; bool is_in_physics_frame() const;
bool has_singleton(const StringName &p_name) const; bool has_singleton(const StringName &p_name) const;

View File

@ -372,7 +372,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
} }
if (err != OK) { if (err != OK) {
ERR_PRINT("Error loading GDExtension config file: " + p_path); ERR_PRINT("Error loading GDExtension configuration file: " + p_path);
return Ref<Resource>(); return Ref<Resource>();
} }
@ -380,7 +380,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
if (r_error) { if (r_error) {
*r_error = ERR_INVALID_DATA; *r_error = ERR_INVALID_DATA;
} }
ERR_PRINT("GDExtension config file must contain 'configuration.entry_symbol' key: " + p_path); ERR_PRINT("GDExtension configuration file must contain a \"configuration/entry_symbol\" key: " + p_path);
return Ref<Resource>(); return Ref<Resource>();
} }
@ -413,7 +413,8 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St
if (r_error) { if (r_error) {
*r_error = ERR_FILE_NOT_FOUND; *r_error = ERR_FILE_NOT_FOUND;
} }
ERR_PRINT("No GDExtension library found for current architecture; in config file " + p_path); const String os_arch = OS::get_singleton()->get_name().to_lower() + "." + Engine::get_singleton()->get_architecture_name();
ERR_PRINT(vformat("No GDExtension library found for current OS and architecture (%s) in configuration file: %s", os_arch, p_path));
return Ref<Resource>(); return Ref<Resource>();
} }

View File

@ -9,6 +9,20 @@
<tutorials> <tutorials>
</tutorials> </tutorials>
<methods> <methods>
<method name="get_architecture_name" qualifiers="const">
<return type="String" />
<description>
Returns the name of the CPU architecture the Godot binary was built for. Possible return values are [code]x86_64[/code], [code]x86_32[/code], [code]arm64[/code], [code]armv7[/code], [code]rv64[/code], [code]riscv[/code], [code]ppc64[/code], [code]ppc[/code], [code]wasm64[/code] and [code]wasm32[/code].
To detect whether the current CPU architecture is 64-bit, you can use the fact that all 64-bit architecture names have [code]64[/code] in their name:
[codeblock]
if "64" in Engine.get_architecture_name():
print("Running on 64-bit CPU.")
else:
print("Running on 32-bit CPU.")
[/codeblock]
[b]Note:[/b] [method get_architecture_name] does [i]not[/i] return the name of the host CPU architecture. For example, if running an x86_32 Godot binary on a x86_64 system, the returned value will be [code]x86_32[/code].
</description>
</method>
<method name="get_author_info" qualifiers="const"> <method name="get_author_info" qualifiers="const">
<return type="Dictionary" /> <return type="Dictionary" />
<description> <description>