import PackageDescription
+#if arch(arm) || arch(arm64)
+let platforms: [SupportedPlatform]? = [
+ .macOS(.v11),
+ .iOS(.v14),
+ .watchOS(.v4),
+ .tvOS(.v14)
+]
+let exclude: [String] = []
+let additionalSources: [String] = ["ggml-metal.m"]
+let additionalSettings: [CSetting] = [
+ .unsafeFlags(["-fno-objc-arc"]),
+ .define("GGML_SWIFT"),
+ .define("GGML_USE_METAL")
+]
+#else
+let platforms: [SupportedPlatform]? = nil
+let exclude: [String] = ["ggml-metal.metal"]
+let additionalSources: [String] = []
+let additionalSettings: [CSetting] = []
+#endif
+
let package = Package(
name: "llama",
+ platforms: platforms,
products: [
.library(name: "llama", targets: ["llama"]),
],
.target(
name: "llama",
path: ".",
- exclude: ["ggml-metal.metal"],
+ exclude: exclude,
sources: [
"ggml.c",
"llama.cpp",
"ggml-alloc.c",
- "k_quants.c"
- ],
+ "k_quants.c",
+ ] + additionalSources,
publicHeadersPath: "spm-headers",
cSettings: [
.unsafeFlags(["-Wno-shorten-64-to-32"]),
.define("GGML_USE_K_QUANTS"),
.define("GGML_USE_ACCELERATE")
- ],
+ ] + additionalSettings,
linkerSettings: [
.linkedFramework("Accelerate")
]
- ),
+ )
],
cxxLanguageStandard: .cxx11
)
ctx->d_queue = dispatch_queue_create("llama.cpp", DISPATCH_QUEUE_CONCURRENT);
-#if 0
- // compile from source string and show compile log
+#ifdef GGML_SWIFT
+ // load the default.metallib file
{
NSError * error = nil;
- ctx->library = [ctx->device newLibraryWithSource:msl_library_source options:nil error:&error];
+ NSBundle * bundle = [NSBundle bundleForClass:[GGMLMetalClass class]];
+ NSString * llamaBundlePath = [bundle pathForResource:@"llama_llama" ofType:@"bundle"];
+ NSBundle * llamaBundle = [NSBundle bundleWithPath:llamaBundlePath];
+ NSString * libPath = [llamaBundle pathForResource:@"default" ofType:@"metallib"];
+ NSURL * libURL = [NSURL fileURLWithPath:libPath];
+
+ // Load the metallib file into a Metal library
+ ctx->library = [ctx->device newLibraryWithURL:libURL error:&error];
+
if (error) {
metal_printf("%s: error: %s\n", __func__, [[error description] UTF8String]);
return NULL;