From f27b9ae3bec95dfc562c74d8e8014aa81cb2825b Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 6 Apr 2026 04:48:58 +0800 Subject: [PATCH 1/5] Add Package@swift-6.2.swift with 2025 release support --- GF/latest | 1 + Package.swift | 8 -- Package@swift-6.2.swift | 196 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 8 deletions(-) create mode 120000 GF/latest create mode 100644 Package@swift-6.2.swift diff --git a/GF/latest b/GF/latest new file mode 120000 index 0000000..fb109e9 --- /dev/null +++ b/GF/latest @@ -0,0 +1 @@ +./2025 \ No newline at end of file diff --git a/Package.swift b/Package.swift index c84c434..344115f 100644 --- a/Package.swift +++ b/Package.swift @@ -159,7 +159,6 @@ let package = Package( .library(name: "BacklightServices", targets: ["BacklightServices"]), .library(name: "SFSymbols", targets: ["SFSymbols"]), .library(name: "CoreSVG", targets: ["CoreSVG"]), - .library(name: "Gestures", targets: ["Gestures", "_GesturesDeviceSwiftShims"]), ], targets: [ .binaryTarget(name: "AttributeGraph", path: "AG/\(releaseVersion)/AttributeGraph.xcframework"), @@ -174,13 +173,6 @@ let package = Package( .binaryTarget(name: "BacklightServices", path: "BLS/2024/BacklightServices.xcframework"), .binaryTarget(name: "SFSymbols", path: "SF/2024/SFSymbols.xcframework"), .binaryTarget(name: "CoreSVG", path: "CoreSVG/2024/CoreSVG.xcframework"), - .binaryTarget(name: "Gestures", path: "GF/2025/Gestures.xcframework"), - .target( - name: "_GesturesDeviceSwiftShims", - dependencies: ["Gestures"], - path: "GF/DeviceSwiftShims", - swiftSettings: sharedSwiftSettings - ), .plugin( name: "UpdateXCFrameworks", capability: .command( diff --git a/Package@swift-6.2.swift b/Package@swift-6.2.swift new file mode 100644 index 0000000..9405878 --- /dev/null +++ b/Package@swift-6.2.swift @@ -0,0 +1,196 @@ +// swift-tools-version: 6.2 + +import PackageDescription + +/* GENERATED BY SPMManifestTool BEGIN */ +/* DO NOT EDIT */ + +public protocol EnvironmentProvider { + func value(forKey key: String) -> String? +} + +import PackageDescription +public struct PackageContextEnvironmentProvider: EnvironmentProvider { + public init() {} + + public func value(forKey key: String) -> String? { + Context.environment[key] + } +} + +public final class EnvManager { + nonisolated(unsafe) public static let shared = EnvManager() + + private var domains: [String] = [] + private var environmentProvider: EnvironmentProvider + + /// When true, append raw key as fallback when searching in domains + public var includeFallbackToRawKey: Bool = false + + private init() { + self.environmentProvider = PackageContextEnvironmentProvider() + } + + /// Set a custom environment provider (useful for testing) + public func setEnvironmentProvider(_ provider: EnvironmentProvider) { + self.environmentProvider = provider + } + + /// Reset domains and environment provider (useful for testing) + public func reset() { + domains.removeAll() + includeFallbackToRawKey = false + self.environmentProvider = PackageContextEnvironmentProvider() + } + + public func register(domain: String) { + domains.append(domain) + } + + public func withDomain(_ domain: String, perform: () throws -> T) rethrows -> T { + domains.append(domain) + defer { domains.removeAll { $0 == domain } } + return try perform() + } + + private func envValue(rawKey: String, default defaultValue: T?, searchInDomain: Bool, parser: (String) -> T?) -> T? { + func parseEnvValue(_ key: String) -> (String, T)? { + guard let value = environmentProvider.value(forKey: key), + let result = parser(value) else { return nil } + return (value, result) + } + var keys: [String] = searchInDomain ? domains.map { "\($0.uppercased())_\(rawKey)" } : [] + if !searchInDomain || includeFallbackToRawKey { + keys.append(rawKey) + } + for key in keys { + if let (value, result) = parseEnvValue(key) { + print("[Env] \(key)=\(value) -> \(result)") + return result + } + } + let primaryKey = keys.first ?? rawKey + if let defaultValue { + print("[Env] \(primaryKey) not set -> \(defaultValue)(default)") + } + return defaultValue + } + + public func envBoolValue(rawKey: String, default defaultValue: Bool? = nil, searchInDomain: Bool) -> Bool? { + envValue(rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { value in + switch value { + case "1": true + case "0": false + default: nil + } + } + } + + public func envIntValue(rawKey: String, default defaultValue: Int? = nil, searchInDomain: Bool) -> Int? { + envValue(rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { Int($0) } + } + + public func envStringValue(rawKey: String, default defaultValue: String? = nil, searchInDomain: Bool) -> String? { + envValue(rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { $0 } + } +} + +public func envBoolValue(_ key: String, default defaultValue: Bool = false, searchInDomain: Bool = true) -> Bool { + EnvManager.shared.envBoolValue(rawKey: key, default: defaultValue, searchInDomain: searchInDomain)! +} + +public func envIntValue(_ key: String, default defaultValue: Int = 0, searchInDomain: Bool = true) -> Int { + EnvManager.shared.envIntValue(rawKey: key, default: defaultValue, searchInDomain: searchInDomain)! +} + +public func envStringValue(_ key: String, default defaultValue: String, searchInDomain: Bool = true) -> String { + EnvManager.shared.envStringValue(rawKey: key, default: defaultValue, searchInDomain: searchInDomain)! +} + +public func envStringValue(_ key: String, searchInDomain: Bool = true) -> String? { + EnvManager.shared.envStringValue(rawKey: key, searchInDomain: searchInDomain) +} + +/* GENERATED BY SPMManifestTool END */ +EnvManager.shared.register(domain: "DarwinPrivateFrameworks") +EnvManager.shared.register(domain: "OpenSwiftUI") + +// MARK: - Env and config + +#if os(macOS) +// NOTE: #if os(macOS) check is not accurate if we are cross compiling for Linux platform. So we add an env key to specify it. +let buildForDarwinPlatform = envBoolValue("BUILD_FOR_DARWIN_PLATFORM", default: true) +#else +let buildForDarwinPlatform = envBoolValue("BUILD_FOR_DARWIN_PLATFORM") +#endif + +let releaseVersion = envIntValue("TARGET_RELEASE", default: 2025) +let libraryEvolutionCondition = envBoolValue("LIBRARY_EVOLUTION", default: buildForDarwinPlatform) + + +// MARK: - Shared Settings + +var sharedSwiftSettings: [SwiftSetting] = [ + .enableUpcomingFeature("InternalImportsByDefault"), + .enableExperimentalFeature("Extern"), + .swiftLanguageMode(.v5), + .define("ATTRIBUTEGRAPH_RELEASE_\(releaseVersion)"), +] + +if libraryEvolutionCondition { + // NOTE: -enable-library-evolution will cause module verify failure for `swift build`. + // Either set OPENATTRIBUTEGRAPH_LIBRARY_EVOLUTION=0 or add `-Xswiftc -no-verify-emitted-module-interface` after `swift build` + sharedSwiftSettings.append(.unsafeFlags(["-enable-library-evolution", "-no-verify-emitted-module-interface"])) +} + +let platforms: [SupportedPlatform] = switch releaseVersion { + case 2025: [.iOS(.v26), .macOS(.v26), .macCatalyst(.v26), .tvOS(.v26), .watchOS(.v26), .visionOS(.v26)] + case 2024: [.iOS(.v18), .macOS(.v15), .macCatalyst(.v18), .tvOS(.v18), .watchOS(.v10), .visionOS(.v2)] + case 2021: [.iOS(.v15), .macOS(.v12), .macCatalyst(.v15), .tvOS(.v15), .watchOS(.v7)] + default: [] +} + +let agVersion = releaseVersion >= 2025 ? "latest" : "\(releaseVersion)" + +let package = Package( + name: "DarwinPrivateFrameworks", + platforms: platforms, + products: [ + .library(name: "AttributeGraph", targets: ["AttributeGraph", "_AttributeGraphDeviceSwiftShims"]), + .library(name: "RenderBox", targets: ["RenderBox"]), + .library(name: "CoreUI", targets: ["CoreUI"]), + .library(name: "BacklightServices", targets: ["BacklightServices"]), + .library(name: "SFSymbols", targets: ["SFSymbols"]), + .library(name: "CoreSVG", targets: ["CoreSVG"]), + .library(name: "Gestures", targets: ["Gestures", "_GesturesDeviceSwiftShims"]), + ], + targets: [ + .binaryTarget(name: "AttributeGraph", path: "AG/\(agVersion)/AttributeGraph.xcframework"), + .target( + name: "_AttributeGraphDeviceSwiftShims", + dependencies: ["AttributeGraph"], + path: "AG/DeviceSwiftShims", + swiftSettings: sharedSwiftSettings + ), + .binaryTarget(name: "RenderBox", path: "RB/2024/RenderBox.xcframework"), + .binaryTarget(name: "CoreUI", path: "CoreUI/2024/CoreUI.xcframework"), + .binaryTarget(name: "BacklightServices", path: "BLS/2024/BacklightServices.xcframework"), + .binaryTarget(name: "SFSymbols", path: "SF/2024/SFSymbols.xcframework"), + .binaryTarget(name: "CoreSVG", path: "CoreSVG/2024/CoreSVG.xcframework"), + .binaryTarget(name: "Gestures", path: "GF/2025/Gestures.xcframework"), + .target( + name: "_GesturesDeviceSwiftShims", + dependencies: ["Gestures"], + path: "GF/DeviceSwiftShims", + swiftSettings: sharedSwiftSettings + ), + .plugin( + name: "UpdateXCFrameworks", + capability: .command( + intent: .custom(verb: "update-xcframeworks", description: "Update xcframeworks"), + permissions: [.writeToPackageDirectory(reason: "Update xcframeworks")] + ) + ), + ], + cxxLanguageStandard: .cxx20 +) From f221f7c6e7f8a666587f5b94ef1f0693a20cdb1b Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 6 Apr 2026 04:50:09 +0800 Subject: [PATCH 2/5] Add CoreSVG and Gestures to UpdateXCFrameworks plugin --- Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift b/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift index f71dea3..9cc6b8c 100644 --- a/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift +++ b/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift @@ -22,6 +22,12 @@ struct UpdateXCFrameworksCommand: CommandPlugin { // SFSymbols try run(context: context, command: "SF/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) try run(context: context, command: "SF/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) + // CoreSVG + try run(context: context, command: "CoreSVG/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) + try run(context: context, command: "CoreSVG/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) + // Gestures + try run(context: context, command: "GF/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2025"]) + try run(context: context, command: "GF/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2025"]) } private func run(context: PackagePlugin.PluginContext, command: String, environment: [String: String]) throws { From f6e8cb5dff1c5032ea20c77dc0fea67265a2da95 Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 6 Apr 2026 04:53:04 +0800 Subject: [PATCH 3/5] Add missing reset.sh for BLS and include in UpdateXCFrameworks plugin --- BLS/reset.sh | 13 +++++++++++++ .../UpdateXCFrameworksCommand.swift | 3 +++ 2 files changed, 16 insertions(+) create mode 100755 BLS/reset.sh diff --git a/BLS/reset.sh b/BLS/reset.sh new file mode 100755 index 0000000..fe3e2be --- /dev/null +++ b/BLS/reset.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +# A `realpath` alternative using the default C implementation. +filepath() { + [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" +} + +VERSION=${DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE:-2024} +FRAMEWORK_ROOT="$(dirname $(filepath $0))/$VERSION" + +framework_name=BacklightServices + +rm -rf ${FRAMEWORK_ROOT}/${framework_name}.xcframework diff --git a/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift b/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift index 9cc6b8c..cd1fcb7 100644 --- a/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift +++ b/Plugins/UpdateXCFrameworks/UpdateXCFrameworksCommand.swift @@ -19,6 +19,9 @@ struct UpdateXCFrameworksCommand: CommandPlugin { // CoreUI try run(context: context, command: "CoreUI/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) try run(context: context, command: "CoreUI/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) + // BacklightServices + try run(context: context, command: "BLS/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) + try run(context: context, command: "BLS/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) // SFSymbols try run(context: context, command: "SF/reset.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) try run(context: context, command: "SF/update.sh", environment: ["DARWINPRIVATEFRAMEWORKS_TARGET_RELEASE": "2024"]) From 0217ff2fac951927ef4180ee528d22502450f86c Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 6 Apr 2026 04:57:57 +0800 Subject: [PATCH 4/5] Restore Gestures in Package.swift for Tuist compatibility --- Package.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Package.swift b/Package.swift index 344115f..c84c434 100644 --- a/Package.swift +++ b/Package.swift @@ -159,6 +159,7 @@ let package = Package( .library(name: "BacklightServices", targets: ["BacklightServices"]), .library(name: "SFSymbols", targets: ["SFSymbols"]), .library(name: "CoreSVG", targets: ["CoreSVG"]), + .library(name: "Gestures", targets: ["Gestures", "_GesturesDeviceSwiftShims"]), ], targets: [ .binaryTarget(name: "AttributeGraph", path: "AG/\(releaseVersion)/AttributeGraph.xcframework"), @@ -173,6 +174,13 @@ let package = Package( .binaryTarget(name: "BacklightServices", path: "BLS/2024/BacklightServices.xcframework"), .binaryTarget(name: "SFSymbols", path: "SF/2024/SFSymbols.xcframework"), .binaryTarget(name: "CoreSVG", path: "CoreSVG/2024/CoreSVG.xcframework"), + .binaryTarget(name: "Gestures", path: "GF/2025/Gestures.xcframework"), + .target( + name: "_GesturesDeviceSwiftShims", + dependencies: ["Gestures"], + path: "GF/DeviceSwiftShims", + swiftSettings: sharedSwiftSettings + ), .plugin( name: "UpdateXCFrameworks", capability: .command( From e6514ad8dec01c2ee12f7a6d1bcc89b9c63f3ab0 Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 6 Apr 2026 04:59:05 +0800 Subject: [PATCH 5/5] Bump GF example version --- Example/Project.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/Project.swift b/Example/Project.swift index 1d4f1a4..ce367ea 100644 --- a/Example/Project.swift +++ b/Example/Project.swift @@ -102,8 +102,8 @@ let project = Project( product: .app, bundleId: "\(bundleIdPrefix).GFExample", deploymentTargets: .multiplatform( - iOS: "26.0", - macOS: "26.0" + iOS: "26.2", + macOS: "26.2" ), infoPlist: .extendingDefault(with: defaultInfoPlist), sources: ["GFExample/**"],