got native cpp extension to work

This commit is contained in:
Edward R. Gonzalez 2022-05-12 12:57:00 -04:00
parent bf7650bf1d
commit e7201941fe
19 changed files with 125 additions and 155 deletions

1
.gitignore vendored
View File

@ -42,3 +42,4 @@ mono_crash.*.json
# Fork # Fork
Source/.sconsign.dblite Source/.sconsign.dblite
.vs

7
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"files.associations": {
"*.rmd": "markdown",
"xtr1common": "cpp"
},
"godot_tools.editor_path": "c:\\Projects\\SymbolEngine\\Engine\\gd\\bin\\godot.windows.opt.tools.64.exe"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,12 @@
[configuration]
entry_symbol = "example_library_init"
[libraries]
linux.64.debug = "bin/libgdexample.linux.debug.64.so"
linux.64.release = "bin/libgdexample.linux.release.64.so"
windows.64.debug = "bin/libgdexample.windows.debug.64.dll"
windows.64.release = "bin/libgdexample.windows.release.64.dll"
macos.debug = "bin/libgdexample.debug.framework"
macos.release = "bin/libgdexample.release.framework"

View File

@ -1,3 +1,14 @@
[gd_scene format=3 uid="uid://bqqewt05ne1ad"] [gd_scene load_steps=2 format=3 uid="uid://bqqewt05ne1ad"]
[ext_resource type="Texture2D" uid="uid://cnv7sgufjc3fk" path="res://icon.png" id="1_tqon5"]
[node name="main" type="Node"] [node name="main" type="Node"]
[node name="GDExample" type="GDExample" parent="."]
position = Vector2(7.83596, 18.1283)
texture = ExtResource( "1_tqon5" )
[node name="Sprite2D" type="Sprite2D" parent="."]
modulate = Color(1, 0.309804, 0.580392, 1)
position = Vector2(214, 2)
texture = ExtResource( "1_tqon5" )

View File

@ -11,5 +11,10 @@ config_version=5
[application] [application]
config/name="SymbolEngine" config/name="SymbolEngine"
run/main_scene="res://main.tscn"
config/icon="res://icon.png" config/icon="res://icon.png"
config/features=PackedStringArray("4.0", "Vulkan Clustered") config/features=PackedStringArray("4.0", "Vulkan Clustered")
[native_extensions]
paths=["res://../Source/gdexample.gdextension"]

View File

@ -1,48 +1,11 @@
#!python #!/usr/bin/env python
import os import os
import glob import sys
opts = Variables([], ARGUMENTS) RootDir = os.path.abspath("../");
EditorDir = RootDir + "/Editor"
# Gets the standard flags CC, CCX, etc. env = SConscript(RootDir + "/Engine/gdnative_cpp/SConstruct")
env = DefaultEnvironment()
ProjPath = os.path.abspath("../");
print("Project Path: " + ProjPath);
# Define our options
opts.Add(EnumVariable('target', "Compilation target", 'debug', ['d', 'debug', 'r', 'release']))
opts.Add(EnumVariable('platform', "Compilation platform", '', ['', 'windows', 'x11', 'linux', 'osx']))
opts.Add(EnumVariable('p', "Compilation target, alias for 'platform'", '', ['', 'windows', 'x11', 'linux', 'osx']))
opts.Add(BoolVariable('use_llvm', "Use the LLVM / Clang compiler", 'no'))
opts.Add(PathVariable('target_path', 'The path where the lib is installed.', ProjPath + '/Engine/gdnative_cpp/bin/'))
opts.Add(PathVariable('target_name', 'The library name.', 'libgdexample', PathVariable.PathAccept))
# Local dependency paths, adapt them to your setup
godot_headers_path = ProjPath + "/Engine/gdnative_cpp/godot-headers/"
cpp_bindings_path = ProjPath + "/Engine/gdnative_cpp/"
cpp_library = "libgodot-cpp"
GDNative_Src = ProjPath + '/Engine/gdnative_cpp/src/'
Src = ProjPath + "/Source/"
# only support 64 at this time..
bits = 64
# Updates the environment with the option variables.
opts.Update(env)
# Process some arguments
if env['use_llvm']:
env['CC'] = 'clang'
env['CXX'] = 'clang++'
if env['p'] != '':
env['platform'] = env['p']
if env['platform'] == '':
print("No valid target platform selected.")
quit();
# For the reference: # For the reference:
# - CCFLAGS are compilation flags shared between C and C++ # - CCFLAGS are compilation flags shared between C and C++
@ -52,77 +15,24 @@ if env['platform'] == '':
# - CPPDEFINES are for pre-processor defines # - CPPDEFINES are for pre-processor defines
# - LINKFLAGS are for linking flags # - LINKFLAGS are for linking flags
# Check our platform specifics
if env['platform'] == "osx":
env['target_path'] += 'osx/'
cpp_library += '.osx'
env.Append(CCFLAGS=['-arch', 'x86_64'])
env.Append(CXXFLAGS=['-std=c++17'])
env.Append(LINKFLAGS=['-arch', 'x86_64'])
if env['target'] in ('debug', 'd'):
env.Append(CCFLAGS=['-g', '-O2'])
else:
env.Append(CCFLAGS=['-g', '-O3'])
elif env['platform'] in ('x11', 'linux'):
env['target_path'] += 'x11/'
cpp_library += '.linux'
env.Append(CCFLAGS=['-fPIC'])
env.Append(CXXFLAGS=['-std=c++17'])
if env['target'] in ('debug', 'd'):
env.Append(CCFLAGS=['-g3', '-Og'])
else:
env.Append(CCFLAGS=['-g', '-O3'])
elif env['platform'] == "windows":
env['target_path'] += 'win64/'
cpp_library += '.windows'
# This makes sure to keep the session environment variables on windows,
# that way you can run scons in a vs 2017 prompt and it will find all the required tools
env.Append(ENV=os.environ)
env.Append(CPPDEFINES=['WIN32', '_WIN32', '_WINDOWS', '_CRT_SECURE_NO_WARNINGS'])
env.Append(CCFLAGS=['-W3', '-GR'])
env.Append(CXXFLAGS='/std:c++17')
if env['target'] in ('debug', 'd'):
env.Append(CPPDEFINES=['_DEBUG'])
env.Append(CCFLAGS=['-EHsc', '-MDd', '-ZI'])
env.Append(LINKFLAGS=['-DEBUG'])
else:
env.Append(CPPDEFINES=['NDEBUG'])
env.Append(CCFLAGS=['-O2', '-EHsc', '-MD'])
if env['target'] in ('debug', 'd'):
cpp_library += '.debug'
else:
cpp_library += '.release'
cpp_library += '.' + str(bits)
# make sure our binding library is properly includes
env.Append(CPPPATH=[
'.',
godot_headers_path,
cpp_bindings_path + 'include/',
cpp_bindings_path + 'include/core/',
cpp_bindings_path + 'include/gen/'])
env.Append(LIBPATH=[cpp_bindings_path + "/bin"])
env.Append(LIBS=[cpp_library])
# tweak this if you want to use different folders, or more folders, to store your source code in. # tweak this if you want to use different folders, or more folders, to store your source code in.
env.Append(CPPPATH=[GDNative_Src]) env.Append(CPPPATH=["."])
env.Append(CPPPATH=[Src]) sources = Glob("./*.cpp")
sources = Glob(GDNative_Src + '/*.cpp') + Glob(Src + '/*cpp') if env["platform"] == "osx":
library = env.SharedLibrary(
for thing in sources : EditorDir + "/bin/libgdexample.{}.{}.framework/libgdexample.{}.{}".format(
print(thing) env["platform"], env["target"], env["platform"], env["target"]
),
library = env.SharedLibrary(target=env['target_path'] + env['target_name'] , source=sources) source=sources,
)
else:
library = env.SharedLibrary(
EditorDir + "/bin/libgdexample.{}.{}.{}{}".format(
env["platform"], env["target"], env["arch_suffix"], env["SHLIBSUFFIX"]
),
source=sources,
)
Default(library) Default(library)
# Generates help for the -h scons option.
Help(opts.GenerateHelpText(env))

View File

@ -3,18 +3,18 @@
namespace godot { namespace godot {
#pragma region GodotRT #pragma region GodotRT
void GDExample::_register_methods() void GDExample::_bind_methods()
{ {
register_method("_process", &GDExample::_process);
} }
void GDExample::_init() // void GDExample::_init()
{ // {
time_passed = 0.f; // time_passed = 0.f;
} // }
void GDExample::_process(float delta) void GDExample::_process(double delta)
{ {
time_passed += delta; time_passed += delta;
@ -29,9 +29,12 @@ void GDExample::_process(float delta)
#pragma endregion GodotRT #pragma endregion GodotRT
GDExample::GDExample() GDExample::GDExample()
{} {
time_passed = 0.f;
}
GDExample::~GDExample() GDExample::~GDExample()
{} {}
}
} // godot

View File

@ -1,13 +1,13 @@
#pragma once #pragma once
#include <godot.hpp> #include <godot_cpp/godot.hpp>
#include <Sprite.hpp> #include <godot_cpp/classes/sprite2d.hpp>
namespace godot { namespace godot {
class GDExample : public Sprite class GDExample : public Sprite2D
{ {
GODOT_CLASS(GDExample, Sprite) GDCLASS(GDExample, Sprite2D)
public: public:
@ -16,10 +16,10 @@ public:
#pragma endregion Data #pragma endregion Data
#pragma region GodotRT #pragma region GodotRT
static void _register_methods(); static void _bind_methods();
void _init(); //void _init() override;
void _process(float delta); void _process(double delta) override;
#pragma endregion GodotRT #pragma endregion GodotRT
GDExample(); GDExample();

BIN
Source/gdexample.obj Normal file

Binary file not shown.

View File

@ -1,26 +0,0 @@
#pragma once
#include "gdexample.h"
#define gd_export(Type_) \
extern "C" Type_ GDN_Export
gd_export(void)
godot_gdnative_init(godot_gdnative_init_options* o)
{
godot::Godot::gdnative_init(o);
}
gd_export(void)
godot_gdnative_terminate(godot_gdnative_terminate_options* o)
{
godot:Godot::gdnative_terminate(o);
}
gd_export(void)
godot_nativescript_init(void* handle)
{
godot::Godot::nativescript_init(handle);
godot::register_class<godot::GDExample>();
}

43
Source/register_types.cpp Normal file
View File

@ -0,0 +1,43 @@
#include "register_types.h"
#include "gdexample.h"
namespace godot {
void register_types(ModuleInitializationLevel p_level)
{
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE)
return;
ClassDB::register_class<GDExample>();
}
void unregister_types(ModuleInitializationLevel p_level)
{
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE)
return;
// Nothing for now...
}
extern "C"
{
GDNativeBool GDN_EXPORT
example_library_init(
GDNativeInterface const* p_interface,
GDNativeExtensionClassLibraryPtr const p_library,
GDNativeInitialization* r_initialization)
{
godot::GDExtensionBinding::InitObject
init_obj(p_interface, p_library, r_initialization);
init_obj.register_initializer(register_types);
init_obj.register_terminator(unregister_types);
init_obj.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
return init_obj.init();
}
}
} // godot

4
Source/register_types.h Normal file
View File

@ -0,0 +1,4 @@
#pragma once
void register_types();
void unregister_types();

BIN
Source/register_types.obj Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,5 +1,5 @@
cd Engine\gd\bin\ cd Engine\gd\bin\
start godot.windows.tools.64.exe start godot.windows.opt.tools.64.exe
exit exit