Skip to content

Commit 8556098

Browse files
committed
working zig build
1 parent 4d0cb28 commit 8556098

13 files changed

+225
-42
lines changed

.gitignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,8 @@ compile_commands.json
4747

4848
# VSCode
4949
.vscode/*
50-
!.vscode/extensions.json
50+
!.vscode/extensions.json
51+
52+
zig-cache
53+
zig-out
54+
*.gguf

build.zig

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const std = @import("std");
2+
3+
pub fn build(b: *std.Build) !void {
4+
const target = b.standardTargetOptions(.{});
5+
const optimize = b.standardOptimizeOption(.{});
6+
7+
const extension = b.addSharedLibrary(.{ .name = "godot-llama-cpp", .target = target, .optimize = optimize });
8+
extension.addIncludePath(.{ .path = "src" });
9+
// extension.addIncludePath(.{ .path = "llama.cpp" });
10+
// extension.addIncludePath(.{ .path = "llama.cpp/common" });
11+
extension.addIncludePath(.{ .path = "godot-cpp/include/" });
12+
extension.addIncludePath(.{ .path = "godot-cpp/gdextension/" });
13+
extension.addIncludePath(.{ .path = "godot-cpp/gen/include/" });
14+
extension.addObjectFile(.{ .path = "godot-cpp/zig-out/lib/libgodot.lib" });
15+
16+
extension.linkLibC();
17+
extension.linkLibCpp();
18+
19+
const sources = try findFilesRecursive(b, "src", &.{ ".c", ".cpp", ".cxx", ".c++", ".cc" });
20+
extension.addCSourceFiles(.{ .files = sources, .flags = &.{ "-std=c++17", "-fno-exceptions" } });
21+
22+
// const llama_libs = try findFilesRecursive(b, "llama.cpp/zig-out/lib", &.{".lib"});
23+
// for (llama_libs) |lib| {
24+
// extension.addObjectFile(.{ .path = lib });
25+
// }
26+
27+
b.installArtifact(extension);
28+
}
29+
30+
fn findFilesRecursive(b: *std.Build, dir_name: []const u8, exts: []const []const u8) ![][]const u8 {
31+
var sources = std.ArrayList([]const u8).init(b.allocator);
32+
33+
var dir = try std.fs.cwd().openDir(dir_name, .{ .iterate = true });
34+
var walker = try dir.walk(b.allocator);
35+
defer walker.deinit();
36+
while (try walker.next()) |entry| {
37+
const ext = std.fs.path.extension(entry.basename);
38+
const include_file = for (exts) |e| {
39+
if (std.mem.eql(u8, ext, e)) {
40+
break true;
41+
}
42+
} else false;
43+
if (include_file) {
44+
try sources.append(b.fmt("{s}/{s}", .{ dir_name, entry.path }));
45+
}
46+
}
47+
48+
return sources.items;
49+
}

demo/bin/example.gdextension

+16-16
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ compatibility_minimum = "4.1"
55

66
[libraries]
77

8-
macos.debug = "res://bin/libgdexample.macos.template_debug.framework"
9-
macos.release = "res://bin/libgdexample.macos.template_release.framework"
10-
windows.debug.x86_32 = "res://bin/libgdexample.windows.template_debug.x86_32.dll"
11-
windows.release.x86_32 = "res://bin/libgdexample.windows.template_release.x86_32.dll"
12-
windows.debug.x86_64 = "res://bin/libgdexample.windows.template_debug.x86_64.dll"
13-
windows.release.x86_64 = "res://bin/libgdexample.windows.template_release.x86_64.dll"
14-
linux.debug.x86_64 = "res://bin/libgdexample.linux.template_debug.x86_64.so"
15-
linux.release.x86_64 = "res://bin/libgdexample.linux.template_release.x86_64.so"
16-
linux.debug.arm64 = "res://bin/libgdexample.linux.template_debug.arm64.so"
17-
linux.release.arm64 = "res://bin/libgdexample.linux.template_release.arm64.so"
18-
linux.debug.rv64 = "res://bin/libgdexample.linux.template_debug.rv64.so"
19-
linux.release.rv64 = "res://bin/libgdexample.linux.template_release.rv64.so"
20-
android.debug.x86_64 = "res://bin/libgdexample.android.template_debug.x86_64.so"
21-
android.release.x86_64 = "res://bin/libgdexample.android.template_release.x86_64.so"
22-
android.debug.arm64 = "res://bin/libgdexample.android.template_debug.arm64.so"
23-
android.release.arm64 = "res://bin/libgdexample.android.template_release.arm64.so"
8+
macos.debug = "res://bin/libgodot-llama-cpp.macos.template_debug.framework"
9+
macos.release = "res://bin/libgodot-llama-cpp.macos.template_release.framework"
10+
windows.debug.x86_32 = "res://bin/libgodot-llama-cpp.windows.template_debug.x86_32.dll"
11+
windows.release.x86_32 = "res://bin/libgodot-llama-cpp.windows.template_release.x86_32.dll"
12+
windows.debug.x86_64 = "res://bin/windows/godot-llama-cpp.dll"
13+
windows.release.x86_64 = "res://bin/libgodot-llama-cpp.windows.template_release.x86_64.dll"
14+
linux.debug.x86_64 = "res://bin/libgodot-llama-cpp.linux.template_debug.x86_64.so"
15+
linux.release.x86_64 = "res://bin/libgodot-llama-cpp.linux.template_release.x86_64.so"
16+
linux.debug.arm64 = "res://bin/libgodot-llama-cpp.linux.template_debug.arm64.so"
17+
linux.release.arm64 = "res://bin/libgodot-llama-cpp.linux.template_release.arm64.so"
18+
linux.debug.rv64 = "res://bin/libgodot-llama-cpp.linux.template_debug.rv64.so"
19+
linux.release.rv64 = "res://bin/libgodot-llama-cpp.linux.template_release.rv64.so"
20+
android.debug.x86_64 = "res://bin/libgodot-llama-cpp.android.template_debug.x86_64.so"
21+
android.release.x86_64 = "res://bin/libgodot-llama-cpp.android.template_release.x86_64.so"
22+
android.debug.arm64 = "res://bin/libgodot-llama-cpp.android.template_debug.arm64.so"
23+
android.release.arm64 = "res://bin/libgodot-llama-cpp.android.template_release.arm64.so"

demo/huggingface_logo-noborder.svg

+37
Loading
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
[remap]
2+
3+
importer="texture"
4+
type="CompressedTexture2D"
5+
uid="uid://dhjbdhto6je6g"
6+
path="res://.godot/imported/huggingface_logo-noborder.svg-caa815448a9c3d6f9d16244f9e42174d.ctex"
7+
metadata={
8+
"vram_texture": false
9+
}
10+
11+
[deps]
12+
13+
source_file="res://huggingface_logo-noborder.svg"
14+
dest_files=["res://.godot/imported/huggingface_logo-noborder.svg-caa815448a9c3d6f9d16244f9e42174d.ctex"]
15+
16+
[params]
17+
18+
compress/mode=0
19+
compress/high_quality=false
20+
compress/lossy_quality=0.7
21+
compress/hdr_compression=1
22+
compress/normal_map=0
23+
compress/channel_pack=0
24+
mipmaps/generate=false
25+
mipmaps/limit=-1
26+
roughness/mode=0
27+
roughness/src_normal=""
28+
process/fix_alpha_border=true
29+
process/premult_alpha=false
30+
process/normal_map_invert_y=false
31+
process/hdr_as_srgb=false
32+
process/hdr_clamp_exposure=false
33+
process/size_limit=0
34+
detect_3d/compress_to=1
35+
svg/scale=1.0
36+
editor/scale_with_editor_scale=false
37+
editor/convert_colors_with_editor_theme=false

demo/root.tscn

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[gd_scene load_steps=3 format=3 uid="uid://durakwld7hck2"]
2+
3+
[ext_resource type="Texture2D" uid="uid://dhjbdhto6je6g" path="res://huggingface_logo-noborder.svg" id="1_ykijc"]
4+
[ext_resource type="Script" path="res://Node.gd" id="2_s1uqc"]
5+
6+
[node name="Node2D" type="Node2D"]
7+
8+
[node name="GDExample" type="GDExample" parent="."]
9+
position = Vector2(0.11051, 12.7741)
10+
texture = ExtResource("1_ykijc")
11+
centered = false
12+
13+
[node name="Node" type="Node" parent="."]
14+
script = ExtResource("2_s1uqc")

llama.cpp

src/llama_model.cpp

+4-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,11 @@
1-
#include "llama.h"
2-
#include "common.h"
31
#include "llama_model.h"
2+
#include "llama.h"
43
#include <godot_cpp/core/class_db.hpp>
54

65
using namespace godot;
76

8-
void LlamaModel::_bind_methods() {
9-
}
10-
11-
LlamaModel::LlamaModel() {
12-
llama_model_params model_params = llama_model_default_params();
13-
model = llama_load_model_from_file(resource_path, model_params);
14-
15-
if (model == NULL) {
16-
ERR_FAIL_NULL_MSG(model, "Unable to load model");
17-
}
7+
void LlamaModel::load_model(const String &path) {
8+
// TODO: load model logic
189
}
1910

20-
LlamaModel::~LlamaModel() {
21-
llama_free_model(model);
22-
}
11+
void LlamaModel::_bind_methods() {}

src/llama_model.h

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
#ifndef LLAMA_MODEL_H
22
#define LLAMA_MODEL_H
33

4-
#include "llama.h"
54
#include <godot_cpp/classes/resource.hpp>
65

76
namespace godot {
87

98
class LlamaModel : public Resource {
109
GDCLASS(LlamaModel, Resource)
1110

12-
private:
13-
const char* resource_path;
14-
llama_model* model;
15-
1611
protected:
1712
static void _bind_methods();
1813

1914
public:
20-
LlamaModel();
21-
~LlamaModel();
15+
void load_model( const String &path );
2216
};
2317

2418
} //namespace godot

src/llama_model_loader.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "llama_model_loader.h"
2+
#include "llama_model.h"
3+
#include <godot_cpp/core/class_db.hpp>
4+
#include <godot_cpp/classes/file_access.hpp>
5+
#include <godot_cpp/classes/project_settings.hpp>
6+
7+
using namespace godot;
8+
9+
PackedStringArray LlamaModelLoader::_get_recognized_extensions() const {
10+
PackedStringArray arr;
11+
arr.append("gguf");
12+
return arr;
13+
}
14+
15+
Variant godot::LlamaModelLoader::_load(const String &path, const String &original_path, bool use_sub_threads, int32_t cache_mode) const {
16+
LlamaModel *model = memnew(LlamaModel);
17+
18+
if (!FileAccess::file_exists(path)) {
19+
return ERR_FILE_NOT_FOUND;
20+
}
21+
22+
String absPath = ProjectSettings::get_singleton()->globalize_path(path);
23+
24+
model->load_model(absPath);
25+
26+
return { model };
27+
}

src/llama_model_loader.h

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef LLAMA_MODEL_LOADER_H
2+
#define LLAMA_MODEL_LOADER_H
3+
4+
#include <godot_cpp/classes/resource_format_loader.hpp>
5+
6+
namespace godot {
7+
8+
class LlamaModelLoader : public ResourceFormatLoader {
9+
GDCLASS(LlamaModelLoader, ResourceFormatLoader)
10+
11+
protected:
12+
static void _bind_methods(){};
13+
14+
public:
15+
PackedStringArray _get_recognized_extensions() const override;
16+
Variant _load(const String &path, const String &original_path, bool use_sub_threads, int32_t cache_mode) const override;
17+
};
18+
19+
} //namespace godot
20+
21+
#endif

src/register_types.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,32 @@
33
#include <godot_cpp/core/class_db.hpp>
44
#include <godot_cpp/core/defs.hpp>
55
#include <godot_cpp/godot.hpp>
6+
#include <godot_cpp/classes/resource_loader.hpp>
7+
#include "llama_model.h"
8+
#include "llama_model_loader.h"
69

710
using namespace godot;
811

12+
static Ref<LlamaModelLoader> llamaModelLoader;
13+
914
void initialize_gdextension_types(ModuleInitializationLevel p_level)
1015
{
1116
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
1217
return;
1318
}
14-
//ClassDB::register_class<YourClass>();
19+
ClassDB::register_class<LlamaModelLoader>();
20+
llamaModelLoader.instantiate();
21+
ResourceLoader::get_singleton()->add_resource_format_loader(llamaModelLoader);
22+
23+
ClassDB::register_class<LlamaModel>();
1524
}
1625

1726
void uninitialize_gdextension_types(ModuleInitializationLevel p_level) {
1827
if (p_level != MODULE_INITIALIZATION_LEVEL_SCENE) {
1928
return;
2029
}
30+
ResourceLoader::get_singleton()->remove_resource_format_loader(llamaModelLoader);
31+
llamaModelLoader.unref();
2132
}
2233

2334
extern "C"

0 commit comments

Comments
 (0)