Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Empty file.
Empty file.
39 changes: 38 additions & 1 deletion Package.swift.template
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@
*/

import PackageDescription
import Foundation

let version = "__VERSION__"
let url = "https://ossci-ios.s3.amazonaws.com/executorch/"
Expand DownExpand Up@@ -46,6 +47,15 @@ let products = deliverables([
"sqlite3",
],
],
"backend_mlx": [
"sha256": "__SHA256_backend_mlx__",
"sha256" + debug_suffix: "__SHA256_backend_mlx_debug__",
"frameworks": [
"Metal",
"Foundation",
"QuartzCore",
],
],
"backend_xnnpack": [
"sha256": "__SHA256_backend_xnnpack__",
"sha256" + debug_suffix: "__SHA256_backend_xnnpack_debug__",
Expand DownExpand Up@@ -134,11 +144,38 @@ for (key, value) in products {
packageTargets.append(target)
}

// The MLX Metal kernel libraries, one per platform slice, shipped as a single
// resource bundle both MLX products share. Kept out of the generic loop above so
// there is one bundle (executorch_backend_mlx_resources.bundle) rather than a
// separate debug copy, and so the release and debug delegates resolve the same
// name. Each slice's MLX binary asks for its own mlx-<slice>.metallib. The files
// are committed to this branch by the release job and gitignored elsewhere, so
// each is included only when present.
let mlxMetallibSlices = ["mlx-ios", "mlx-ios-simulator", "mlx-macos"]
let mlxResourcesDir = ".Package.swift/backend_mlx_resources"
if products.keys.contains("backend_mlx") {
packageTargets.append(.target(
name: "backend_mlx_resources",
path: mlxResourcesDir,
resources: mlxMetallibSlices.compactMap { slice in
FileManager.default.fileExists(atPath: "\(mlxResourcesDir)/\(slice).metallib")
? .copy("\(slice).metallib") : nil
}
))
for suffix in ["", debug_suffix] {
if let index = packageTargets.firstIndex(where: {
$0.name == "backend_mlx\(suffix)\(dependencies_suffix)"
}) {
packageTargets[index].dependencies.append(.target(name: "backend_mlx_resources"))
}
}
}

let package = Package(
name: "executorch",
platforms: [
.iOS(.v17),
.macOS(.v12),
.macOS(.v14),
],
products: packageProducts,
targets: packageTargets
Expand Down
Loading