diff --git a/SConstruct b/SConstruct index 880d19cc8..dda0d1011 100644 --- a/SConstruct +++ b/SConstruct @@ -15,6 +15,28 @@ def add_sources(sources, dir, extension): sources.append(dir + "/" + f) +def make_gdextension(env, name, sources, library_dir="lib", entry_symbol="", output_dir=""): + target_dir = output_dir if output_dir else name + init = entry_symbol if entry_symbol else f"{name}_library_init" + autodetect_prefix = "{}/lib{}".format(library_dir, name) + lib = env.SharedLibrary( + target_dir + "/" + "{}{}{}".format(autodetect_prefix, env["suffix"], env["SHLIBSUFFIX"]), + source=sources, + ) + ext_text = """[configuration] +entry_symbol = "{}" + +[libraries] +autodetect_prefix = "{}" +""".format( + init, autodetect_prefix + ) + config = env.Textfile("{}/{}.gdextension".format(target_dir, name), ext_text) + env.AlwaysBuild(config) + env.NoCache(config) + return [env.Dir(target_dir), lib, config] + + # Try to detect the host platform automatically. # This is used if no `platform` argument is passed if sys.platform.startswith("linux"): @@ -229,4 +251,5 @@ if env["build_library"]: env.Append(LIBPATH=[env.Dir("bin")]) env.Append(LIBS=library_name) +env.AddMethod(make_gdextension, "GDExtension") Return("env") diff --git a/test/.gitignore b/test/.gitignore index c6d839430..d889b7322 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -2,6 +2,9 @@ build bin +# Generated extension directory +demo/gdexample + # Godot 4+ specific ignores .godot/ diff --git a/test/SConstruct b/test/SConstruct index 72527bb64..7228d3d54 100644 --- a/test/SConstruct +++ b/test/SConstruct @@ -16,17 +16,5 @@ env = SConscript("../SConstruct") env.Append(CPPPATH=["src/"]) sources = Glob("src/*.cpp") -if env["platform"] == "macos": - library = env.SharedLibrary( - "demo/bin/libgdexample.{}.{}.framework/libgdexample.{}.{}".format( - env["platform"], env["target"], env["platform"], env["target"] - ), - source=sources, - ) -else: - library = env.SharedLibrary( - "demo/bin/libgdexample{}{}".format(env["suffix"], env["SHLIBSUFFIX"]), - source=sources, - ) - +library = env.GDExtension("gdexample", sources, output_dir="demo/gdexample") Default(library) diff --git a/test/demo/example.gdextension b/test/demo/example.gdextension deleted file mode 100644 index b7946598a..000000000 --- a/test/demo/example.gdextension +++ /dev/null @@ -1,18 +0,0 @@ -[configuration] - -entry_symbol = "example_library_init" - -[libraries] - -macos.debug = "res://bin/libgdexample.macos.template_debug.framework" -macos.release = "res://bin/libgdexample.macos.template_release.framework" -windows.debug.x86_32 = "res://bin/libgdexample.windows.template_debug.x86_32.dll" -windows.release.x86_32 = "res://bin/libgdexample.windows.template_release.x86_32.dll" -windows.debug.x86_64 = "res://bin/libgdexample.windows.template_debug.x86_64.dll" -windows.release.x86_64 = "res://bin/libgdexample.windows.template_release.x86_64.dll" -linux.debug.x86_64 = "res://bin/libgdexample.linux.template_debug.x86_64.so" -linux.release.x86_64 = "res://bin/libgdexample.linux.template_release.x86_64.so" -linux.debug.arm64 = "res://bin/libgdexample.linux.template_debug.arm64.so" -linux.release.arm64 = "res://bin/libgdexample.linux.template_release.arm64.so" -linux.debug.rv64 = "res://bin/libgdexample.linux.template_debug.rv64.so" -linux.release.rv64 = "res://bin/libgdexample.linux.template_release.rv64.so" diff --git a/test/src/register_types.cpp b/test/src/register_types.cpp index 873801b4b..c44cfeb74 100644 --- a/test/src/register_types.cpp +++ b/test/src/register_types.cpp @@ -36,7 +36,7 @@ void uninitialize_example_module(ModuleInitializationLevel p_level) { extern "C" { // Initialization. -GDNativeBool GDN_EXPORT example_library_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { +GDNativeBool GDN_EXPORT gdexample_library_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { godot::GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization); init_obj.register_initializer(initialize_example_module);