| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864 |
- // swift-tools-version: 6.2
- import CompilerPluginSupport
- import Foundation
- import PackageDescription
- // MARK: - EnvManager
- /* 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<T>(_ domain: String, perform: () throws -> T) rethrows -> T {
- domains.append(domain)
- defer { domains.removeAll { $0 == domain } }
- return try perform()
- }
- private func envValue<T>(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: "ark_ui_basic")
- // 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
- // https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/3061#issuecomment-2118821061
- // By-pass https://github.com/swiftlang/swift-package-manager/issues/7580
- let isSPIDocGenerationBuild = envBoolValue("SPI_GENERATE_DOCS", searchInDomain: false)
- let isSPIBuild = envBoolValue("SPI_BUILD", searchInDomain: false)
- // Xcode use clang as linker which supports "-iframework" while SwiftPM use swiftc as linker which supports "-Fsystem"
- let systemFrameworkSearchFlag = isXcodeEnv ? "-iframework" : "-Fsystem"
- let isXcodeEnv = envStringValue("__CFBundleIdentifier", searchInDomain: false) == "com.apple.dt.Xcode"
- let development = envBoolValue("DEVELOPMENT", default: false)
- let warningsAsErrorsCondition = envBoolValue("WERROR", default: isXcodeEnv && development)
- let swiftCorelibsPath = envStringValue("LIB_SWIFT_PATH") ?? "\(Context.packageDirectory)/Sources/SwiftCorelibs/include"
- let releaseVersion = envIntValue("TARGET_RELEASE", default: 2024)
- let libraryEvolutionCondition = envBoolValue("LIBRARY_EVOLUTION", default: buildForDarwinPlatform)
- let compatibilityTestCondition = envBoolValue("COMPATIBILITY_TEST")
- let useLocalDeps = envBoolValue("USE_LOCAL_DEPS", default: false)
- // For OpenAttributeGraphShims
- let computeCondition = envBoolValue("OPENATTRIBUTESHIMS_COMPUTE", default: false)
- let danceUIGraphCondition = envBoolValue("OPENATTRIBUTESHIMS_DANCEUIGRAPH", default: false)
- let attributeGraphCondition = envBoolValue("OPENATTRIBUTESHIMS_ATTRIBUTEGRAPH", default: false)
- let renderBoxCondition = envBoolValue("RENDERBOX", default: buildForDarwinPlatform && !isSPIBuild)
- // For #39
- let anyAttributeFix = envBoolValue("ANY_ATTRIBUTE_FIX", default: !buildForDarwinPlatform)
- let linkCoreUI = envBoolValue("LINK_COREUI", default: buildForDarwinPlatform && !isSPIBuild)
- let linkCoreSVG = envBoolValue("LINK_CORESVG", default: buildForDarwinPlatform && !isSPIBuild)
- let linkSFSymbols = envBoolValue("LINK_SFSYMBOLS", default: buildForDarwinPlatform && !isSPIBuild)
- let linkBacklightServices = envBoolValue("LINK_BACKLIGHTSERVICES", default: buildForDarwinPlatform && !isSPIBuild)
- let linkGestures = envBoolValue("LINK_GESTURES", default: buildForDarwinPlatform && !isSPIBuild && releaseVersion >= 2025)
- // This should be disabled for UI test target due to link issue of Testing.
- // Only enable for non-UI test targets.
- let linkTesting = envBoolValue("LINK_TESTING")
- let symbolLocatorCondition = envBoolValue("SYMBOL_LOCATOR", default: buildForDarwinPlatform)
- let openCombineCondition = envBoolValue("OPENCOMBINE", default: !buildForDarwinPlatform)
- let swiftLogCondition = envBoolValue("SWIFT_LOG", default: !buildForDarwinPlatform)
- let swiftCryptoCondition = envBoolValue("SWIFT_CRYPTO", default: !buildForDarwinPlatform)
- let renderGTKCondition = envBoolValue("RENDER_GTK", default: !buildForDarwinPlatform)
- let swiftUIRenderCondition = envBoolValue("SWIFTUI_RENDERER", default: false)
- let ignoreAvailability = envBoolValue("IGNORE_AVAILABILITY", default: !isSPIDocGenerationBuild && !compatibilityTestCondition)
- // Run @OpenSwiftUIProject/DarwinPrivateFrameworks repo's Scripts/install_internal_sdk.sh XRSimulator to install internal XRSimulator SDK
- let internalXRSDK = envBoolValue("INTERNAL_XR_SDK")
- let enablePrivateImports = envBoolValue("ENABLE_PRIVATE_IMPORTS", default: true)
- let enableRuntimeConcurrencyCheck = envBoolValue("ENABLE_RUNTIME_CONCURRENCY_CHECK")
- let bridgeFramework = envStringValue("OPENSWIFTUI_BRIDGE_FRAMEWORK", default: "SwiftUI")
- // Workaround iOS CI build issue (We need to disable this on iOS CI)
- let supportMultiProducts: Bool = envBoolValue("SUPPORT_MULTI_PRODUCTS", default: true)
- /// CGFloat and CGRect def in CFCGTypes.h will conflict with Foundation's CGSize/CGRect def on Linux.
- /// macOS: true -> no issue
- /// macOS: false -> use Swift implementation with OpenCoreGraphics Swift CGPath
- /// Linux: true + No CGPathRef support in ORBPath -> confilict with Foundation def
- /// Linux: false -> use Swift implementation with OpenCoreGraphics Swift CGPath
- let cfCGTypes = envBoolValue("CF_CGTYPES", default: buildForDarwinPlatform)
- // MARK: - Shared Settings
- var sharedCSettings: [CSetting] = [
- .define("NDEBUG", .when(configuration: .release)),
- // Rewrite malloc() to malloc_type_malloc() for type-isolated allocation buckets (xzone malloc).
- .unsafeFlags(["-ftyped-memory-operations"], .when(platforms: .darwinPlatforms)),
- .unsafeFlags(["-fmodules"]),
- .define("_WASI_EMULATED_SIGNAL", .when(platforms: [.wasi])),
- .unsafeFlags(["-isystem", swiftCorelibsPath], .when(platforms: .nonDarwinPlatforms)),
- ]
- var sharedCxxSettings: [CXXSetting] = [
- .define("NDEBUG", .when(configuration: .release)),
- // Rewrite malloc() to malloc_type_malloc() for type-isolated allocation buckets (xzone malloc).
- .unsafeFlags(["-ftyped-memory-operations"], .when(platforms: .darwinPlatforms)),
- // Rewrite operator new/delete to typed variants (operator new(size_t, std::__type_descriptor_t)).
- .unsafeFlags(["-ftyped-cxx-new-delete"], .when(platforms: .darwinPlatforms)),
- .unsafeFlags(["-fcxx-modules"]),
- .define("_WASI_EMULATED_SIGNAL", .when(platforms: [.wasi])),
- .unsafeFlags(["-isystem", swiftCorelibsPath], .when(platforms: .nonDarwinPlatforms)),
- ]
- var sharedSwiftSettings: [SwiftSetting] = [
- .enableUpcomingFeature("BareSlashRegexLiterals"),
- .enableUpcomingFeature("InternalImportsByDefault"),
- .enableUpcomingFeature("InferSendableFromCaptures"),
- .enableExperimentalFeature("Extern"),
- // FIXME: -unavailable-decl-optimization=stub is not working somehow (eg. Color.vibrancy). Dig into this later
- .unsafeFlags(["-unavailable-decl-optimization=stub"]),
- .swiftLanguageMode(.v5),
- .define("OPENSWIFTUI_RELEASE_\(releaseVersion)"),
- .unsafeFlags(["-Xfrontend", "-experimental-spi-only-imports"]),
- ]
- if releaseVersion >= 2021 {
- for year in 2021 ... releaseVersion {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_SUPPORT_\(year)_API"))
- }
- }
- if libraryEvolutionCondition {
- // NOTE: -enable-library-evolution will cause module verify failure for `swift build`.
- // Either set OPENSWIFTUI_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"]))
- }
- if !compatibilityTestCondition {
- sharedCSettings.append(.define("OPENSWIFTUI"))
- sharedCxxSettings.append(.define("OPENSWIFTUI"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI"))
- }
- if anyAttributeFix {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_ANY_ATTRIBUTE_FIX"))
- }
- if development {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_DEVELOPMENT"))
- }
- sharedCSettings.append(.define("OPENSWIFTUI_LINK_COREUI", to: linkCoreUI ? "1" : "0"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_LINK_COREUI", to: linkCoreUI ? "1" : "0"))
- if linkCoreUI {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_LINK_COREUI"))
- }
- sharedCSettings.append(.define("OPENSWIFTUI_LINK_CORESVG", to: linkCoreSVG ? "1" : "0"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_LINK_CORESVG", to: linkCoreSVG ? "1" : "0"))
- if linkCoreSVG {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_LINK_CORESVG"))
- }
- if linkSFSymbols {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_LINK_SFSYMBOLS"))
- }
- sharedCSettings.append(
- .define(
- "OPENSWIFTUI_LINK_BACKLIGHTSERVICES",
- to: linkBacklightServices ? "1" : "0",
- .when(platforms: [.iOS, .visionOS])
- )
- )
- sharedCxxSettings.append(
- .define(
- "OPENSWIFTUI_LINK_BACKLIGHTSERVICES",
- to: linkBacklightServices ? "1" : "0",
- .when(platforms: [.iOS, .visionOS])
- )
- )
- if linkBacklightServices {
- sharedSwiftSettings.append(
- .define(
- "OPENSWIFTUI_LINK_BACKLIGHTSERVICES",
- .when(platforms: [.iOS, .visionOS])
- )
- )
- }
- if linkGestures {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_LINK_GESTURES"))
- }
- if swiftUIRenderCondition {
- sharedCSettings.append(.define("OPENSWIFTUI_SWIFTUI_RENDERER", .when(platforms: .darwinPlatforms)))
- sharedCxxSettings.append(.define("OPENSWIFTUI_SWIFTUI_RENDERER", .when(platforms: .darwinPlatforms)))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_SWIFTUI_RENDERER", .when(platforms: .darwinPlatforms)))
- }
- if linkTesting {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_LINK_TESTING"))
- }
- if warningsAsErrorsCondition {
- // Hold off the werror feature as we can't avoid the concurrency warning.
- // Since there is no such group for diagnostic we want to ignore, we enable werror for all known groups instead.
- // See detail on [#443](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0443-warning-control-flags.md)
- // items we want it to be error:
- // [remove_package_import]
- // items we want to ignore:
- // [error_from_clang] [error_in_future_swift_version]
- // sharedSwiftSettings.append(.unsafeFlags(["-warnings-as-errors"]))
- sharedSwiftSettings.append(.unsafeFlags(["-Werror", "Unsafe"]))
- sharedSwiftSettings.append(.unsafeFlags(["-Werror", "UnknownWarningGroup"]))
- sharedSwiftSettings.append(.unsafeFlags(["-Werror", "ExistentialAny"]))
- // This will cause conflict when used by Xcode from a non-local dependency
- // "Conflicting options '-Wwarning' and '-suppress-warnings'"
- // See: https://forums.swift.org/t/warnings-as-errors-in-sub-packages/70810
- // So do not enable it by default here.
- sharedSwiftSettings.append(.unsafeFlags(["-Wwarning", "DeprecatedDeclaration"])) // We want to use deprecated APIs in test targets)
- }
- if libraryEvolutionCondition && !openCombineCondition && !swiftLogCondition {
- // NOTE: -enable-library-evolution will cause module verify failure for `swift build`.
- // Either set OPENSWIFTUI_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"]))
- }
- if !compatibilityTestCondition {
- sharedSwiftSettings.append(.define("OPENSWIFTUI"))
- }
- sharedSwiftSettings.append(contentsOf: [SwiftSetting].availabilityMacroSettings(ignoreAvailability: ignoreAvailability))
- sharedCSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK", to: internalXRSDK ? "1" : "0"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK", to: internalXRSDK ? "1" : "0"))
- if internalXRSDK {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_INTERNAL_XR_SDK"))
- }
- if enablePrivateImports {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_ENABLE_PRIVATE_IMPORTS"))
- sharedSwiftSettings.append(.unsafeFlags(["-Xfrontend", "-enable-private-imports"]))
- }
- if enableRuntimeConcurrencyCheck {
- sharedSwiftSettings.append(.define("OPENSWIFTUI_ENABLE_RUNTIME_CONCURRENCY_CHECK"))
- }
- if cfCGTypes {
- sharedCSettings.append(.define("OPENSWIFTUI_CF_CGTYPES"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_CF_CGTYPES"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_CF_CGTYPES"))
- sharedCSettings.append(.define("OPENRENDERBOX_CF_CGTYPES"))
- sharedCxxSettings.append(.define("OPENRENDERBOX_CF_CGTYPES"))
- sharedSwiftSettings.append(.define("OPENRENDERBOX_CF_CGTYPES"))
- }
- if computeCondition {
- sharedCSettings.append(.define("OPENSWIFTUI_COMPUTE"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_COMPUTE"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_COMPUTE"))
- } else if danceUIGraphCondition {
- sharedCSettings.append(.define("OPENSWIFTUI_DANCEUIGRAPH"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_DANCEUIGRAPH"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_DANCEUIGRAPH"))
- } else if attributeGraphCondition {
- sharedCSettings.append(.define("OPENSWIFTUI_ATTRIBUTEGRAPH"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_ATTRIBUTEGRAPH"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_ATTRIBUTEGRAPH"))
- }
- if renderBoxCondition {
- sharedCSettings.append(.define("OPENSWIFTUI_RENDERBOX"))
- sharedCxxSettings.append(.define("OPENSWIFTUI_RENDERBOX"))
- sharedSwiftSettings.append(.define("OPENSWIFTUI_RENDERBOX"))
- }
- // MARK: - Extension
- extension Target {
- func addAGSettings() {
- // FIXME: Weird SwiftPM behavior for test Target. Otherwize we'll get the following error message
- // "could not determine executable path for bundle 'AttributeGraph.framework'"
- dependencies.append(.product(name: "AttributeGraph", package: "DarwinPrivateFrameworks"))
- }
- func addRBSettings() {
- // FIXME: Weird SwiftPM behavior for test Target. Otherwize we'll get the following error message
- // "could not determine executable path for bundle 'RenderBox.framework'"
- dependencies.append(.product(name: "RenderBox", package: "DarwinPrivateFrameworks"))
- }
- func addCoreUISettings() {
- // FIXME: Weird SwiftPM behavior for test Target. Otherwize we'll get the following error message
- // "could not determine executable path for bundle 'CoreUI.framework'"
- dependencies.append(.product(name: "CoreUI", package: "DarwinPrivateFrameworks"))
- }
- func addCoreSVGSettings() {
- // FIXME: Weird SwiftPM behavior for test Target. Otherwize we'll get the following error message
- // "could not determine executable path for bundle 'CoreSVG.framework'"
- dependencies.append(.product(name: "CoreSVG", package: "DarwinPrivateFrameworks"))
- }
- func addSFSymbolsSettings() {
- dependencies.append(.product(name: "SFSymbols", package: "DarwinPrivateFrameworks"))
- }
- func addBacklightServicesSettings() {
- // FIXME: Weird SwiftPM behavior for test Target. Otherwize we'll get the following error message
- // "could not determine executable path for bundle 'BacklightServices.framework'"
- dependencies.append(
- .product(
- name: "BacklightServices",
- package: "DarwinPrivateFrameworks",
- condition: .when(platforms: [.iOS, .visionOS])
- )
- )
- }
- func addGesturesSettings() {
- dependencies.append(.product(name: "Gestures", package: "DarwinPrivateFrameworks"))
- }
- func addOpenCombineSettings() {
- dependencies.append(.product(name: "OpenCombine", package: "OpenCombine"))
- dependencies.append(.product(name: "OpenCombineFoundation", package: "OpenCombine"))
- var swiftSettings = swiftSettings ?? []
- swiftSettings.append(.define("OPENSWIFTUI_OPENCOMBINE"))
- self.swiftSettings = swiftSettings
- }
- func addOpenCombineCSettings() {
- var cSettings = cSettings ?? []
- cSettings.append(.define("OPENSWIFTUI_OPENCOMBINE"))
- self.cSettings = cSettings
- var cxxSettings = cxxSettings ?? []
- cxxSettings.append(.define("OPENSWIFTUI_OPENCOMBINE"))
- self.cxxSettings = cxxSettings
- }
- func addSwiftLogSettings() {
- dependencies.append(.product(name: "Logging", package: "swift-log"))
- var swiftSettings = swiftSettings ?? []
- swiftSettings.append(.define("OPENSWIFTUI_SWIFT_LOG"))
- self.swiftSettings = swiftSettings
- }
- func addSwiftCryptoSettings() {
- dependencies.append(.product(name: "Crypto", package: "swift-crypto"))
- var swiftSettings = swiftSettings ?? []
- swiftSettings.append(.define("OPENSWIFTUI_SWIFT_CRYPTO"))
- self.swiftSettings = swiftSettings
- }
- }
- extension [Platform] {
- static var darwinPlatforms: [Platform] {
- [.macOS, .iOS, .macCatalyst, .tvOS, .watchOS, .visionOS]
- }
- static var nonDarwinPlatforms: [Platform] {
- [.linux, .android, .wasi, .openbsd, .windows]
- }
- }
- extension [SwiftSetting] {
- /// Settings which define commonly-used OS availability macros.
- ///
- /// These leverage a pseudo-experimental feature in the Swift compiler for
- /// setting availability definitions, which was added in
- /// [swift#65218](https://github.com/swiftlang/swift/pull/65218).
- fileprivate static func availabilityMacroSettings(ignoreAvailability: Bool) -> Self {
- let minimumVersion = "iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, visionOS 1.0"
- return [
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v1_0:\(ignoreAvailability ? minimumVersion : "iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v1_4:\(ignoreAvailability ? minimumVersion : "iOS 13.4, macOS 10.15.4, tvOS 13.4, watchOS 6.2")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v2_0:\(ignoreAvailability ? minimumVersion : "iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_macOS_v2_0:\(ignoreAvailability ? minimumVersion : "macOS 11.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v2_1:\(ignoreAvailability ? minimumVersion : "iOS 14.2, macOS 11.0, tvOS 14.1, watchOS 7.1")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v2_3:\(ignoreAvailability ? minimumVersion : "iOS 14.5, macOS 11.3, tvOS 14.5, watchOS 7.4")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v3_0:\(ignoreAvailability ? minimumVersion : "iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v3_2:\(ignoreAvailability ? minimumVersion : "iOS 15.2, macOS 12.1, tvOS 15.2, watchOS 8.3")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v3_4:\(ignoreAvailability ? minimumVersion : "iOS 15.4, macOS 12.3, tvOS 15.4, watchOS 8.5")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v4_0:\(ignoreAvailability ? minimumVersion : "iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v4_1:\(ignoreAvailability ? minimumVersion : "iOS 16.1, macOS 13.0, tvOS 16.1, watchOS 9.1")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v4_4:\(ignoreAvailability ? minimumVersion : "iOS 16.4, macOS 13.3, tvOS 16.4, watchOS 9.4")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v5_0:\(ignoreAvailability ? minimumVersion : "iOS 17.0, macOS 14.0, tvOS 17.0, watchOS 10.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v5_1:\(ignoreAvailability ? minimumVersion : "iOS 17.1, macOS 14.1, tvOS 17.1, watchOS 10.1, visionOS 1.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v5_2:\(ignoreAvailability ? minimumVersion : "iOS 17.2, macOS 14.2, tvOS 17.2, watchOS 10.2, visionOS 1.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v5_4:\(ignoreAvailability ? minimumVersion : "iOS 17.4, macOS 14.4, tvOS 17.4, watchOS 10.4, visionOS 1.1")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v5_5:\(ignoreAvailability ? minimumVersion : "iOS 17.5, macOS 14.5, tvOS 17.5, watchOS 10.5, visionOS 1.2")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v6_0:\(ignoreAvailability ? minimumVersion : "iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0")"),
- .enableExperimentalFeature("AvailabilityMacro=OpenSwiftUI_v7_0:\(ignoreAvailability ? minimumVersion : "iOS 19.0, macOS 16.0, tvOS 19.0, watchOS 12.0, visionOS 3.0")"),
- .enableExperimentalFeature("AvailabilityMacro=_distantFuture:iOS 99.0, macOS 99.0, tvOS 99.0, watchOS 99.0, visionOS 99.0"),
- ]
- }
- }
- // MARK: - Targets
- // MARK: - CGTK Target
- let cgtkTarget = Target.systemLibrary(
- name: "CGTK",
- pkgConfig: "gtk4",
- providers: [
- .brew(["gtk4"]),
- .apt(["libgtk-4-dev clang"]),
- ]
- )
- // MARK: - OpenSwiftUISPI Target
- let openSwiftUISPITarget = Target.target(
- name: "ark_ui_basic_spi",
- dependencies: [
- .product(name: "OpenRenderBoxShims", package: "OpenRenderBox"),
- ],
- publicHeadersPath: ".",
- cSettings: sharedCSettings + [.define("_GNU_SOURCE", .when(platforms: .nonDarwinPlatforms))],
- cxxSettings: sharedCxxSettings,
- linkerSettings: [
- // -lMobileGestalt
- // For MGCopyAnswer API support
- .linkedLibrary("MobileGestalt", .when(platforms: .darwinPlatforms)),
- ] + (swiftUIRenderCondition ? [
- // For Interpose.c or we can choose to use dlsm approach to load them dynamically
- .linkedFramework("SwiftUI", .when(platforms: .darwinPlatforms))
- ] : [])
- )
- // MARK: - ark_ui_basic_macros Target
- let openSwiftUIMacrosTarget = Target.macro(
- name: "ark_ui_basic_macros",
- dependencies: [
- .product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
- .product(name: "SwiftCompilerPlugin", package: "swift-syntax"),
- ],
- swiftSettings: sharedSwiftSettings
- )
- // MARK: - ark_ui_basic_core Target
- // NOTE:
- // In macOS: Mac Catalyst App will use macOS-varient build of SwiftUI.framework in /System/Library/Framework and iOS varient of SwiftUI.framework in /System/iOSSupport/System/Library/Framework
- // Add `|| Mac Catalyst` check everywhere in `ark_ui_basic_core` and `ark_ui_basic_spi`.
- let openSwiftUICoreTarget = Target.target(
- name: "ark_ui_basic_core",
- dependencies: [
- "ark_ui_basic_spi",
- "ark_ui_basic_macros",
- .product(name: "OpenCoreGraphicsShims", package: "OpenCoreGraphics"),
- .product(name: "OpenQuartzCoreShims", package: "OpenCoreGraphics"),
- .product(name: "OpenAttributeGraphShims", package: "OpenAttributeGraph"),
- .product(name: "OpenRenderBoxShims", package: "OpenRenderBox"),
- .product(name: "OpenObservation", package: "OpenObservation"),
- ] + (swiftUIRenderCondition && symbolLocatorCondition ? ["OpenSwiftUISymbolDualTestsSupport"] : []),
- cSettings: sharedCSettings,
- cxxSettings: sharedCxxSettings,
- swiftSettings: sharedSwiftSettings
- )
- // MARK: ark_ui_basic Target
- let cOpenSwiftUITarget = Target.target(
- name: "c_ark_ui_basic",
- publicHeadersPath: ".",
- cSettings: sharedCSettings + [
- .headerSearchPath("../ark_ui_basic_spi"),
- ],
- cxxSettings: sharedCxxSettings,
- swiftSettings: sharedSwiftSettings
- )
- let openSwiftUITarget = Target.target(
- name: "ark_ui_basic",
- dependencies: [
- "ark_ui_basic_core",
- "c_ark_ui_basic",
- .product(name: "OpenCoreGraphicsShims", package: "OpenCoreGraphics"),
- .product(name: "OpenQuartzCoreShims", package: "OpenCoreGraphics"),
- .product(name: "OpenAttributeGraphShims", package: "OpenAttributeGraph"),
- .product(name: "OpenRenderBoxShims", package: "OpenRenderBox"),
- ],
- cSettings: sharedCSettings,
- cxxSettings: sharedCxxSettings,
- swiftSettings: sharedSwiftSettings,
- linkerSettings: [
- // Force Objective-C categories from static c_ark_ui_basic into the final framework.
- .unsafeFlags(["-Xlinker", "-ObjC"], .when(platforms: .darwinPlatforms)),
- // -framework CoreServices
- // For CS private API link support
- .linkedFramework("CoreServices", .when(platforms: [.iOS])),
- // -lAccessibility
- // For Accessibility private API link support
- .linkedLibrary("Accessibility", .when(platforms: [.iOS])),
- ]
- )
- let openSwiftUIExtensionTarget = Target.target(
- name: "ark_ui_basic_extension",
- dependencies: [
- "ark_ui_basic",
- ],
- cSettings: sharedCSettings,
- cxxSettings: sharedCxxSettings,
- swiftSettings: sharedSwiftSettings
- )
- // MARK: - ark_ui_basic_bridge Target
- let openSwiftUIBridgeTarget = Target.target(
- name: "ark_ui_basic_bridge",
- dependencies: [
- "ark_ui_basic",
- ],
- sources: ["Bridgeable.swift", bridgeFramework],
- cSettings: sharedCSettings,
- cxxSettings: sharedCxxSettings,
- swiftSettings: sharedSwiftSettings
- )
- // MARK: - OpenSwiftUISymbolDualTests Target
- // MARK: - Products
- let configuredLibraryType = envStringValue("LIBRARY_TYPE")
- let libraryType: PackageDescription.Product.Library.LibraryType?
- switch configuredLibraryType {
- case "dynamic":
- libraryType = .dynamic
- case "static":
- libraryType = .static
- default:
- libraryType = nil
- }
- var products: [PackageDescription.Product] = [
- .library(name: "ark_ui_basic", type: libraryType, targets: ["ark_ui_basic"]),
- .executable(name: "ui_test", targets: ["ui_test"])
- ]
- if supportMultiProducts {
- products += [
- .library(name: "ark_ui_basic_core", type: libraryType, targets: ["ark_ui_basic_core"]),
- .library(name: "ark_ui_basic_spi", targets: ["ark_ui_basic_spi"]),
- .library(name: "ark_ui_basic_extension", targets: ["ark_ui_basic_extension"]),
- .library(name: "ark_ui_basic_bridge", targets: ["ark_ui_basic_bridge"])
- ]
- }
- // MARK: - Package
- let package = Package(
- name: "ark_ui_basic",
- products: products,
- dependencies: [
- .package(url: "https://github.com/apple/swift-numerics", from: "1.0.3"),
- .package(url: "https://github.com/swiftlang/swift-syntax.git", from: "601.0.0"),
- ],
- targets: [
- openSwiftUISPITarget,
- openSwiftUIMacrosTarget,
- openSwiftUICoreTarget,
- cOpenSwiftUITarget,
- openSwiftUITarget,
- openSwiftUIExtensionTarget,
- openSwiftUIBridgeTarget,
- .executableTarget(
- name: "ui_test",
- dependencies: ["ark_ui_basic"],
- path: "Sources/ui_test",
- swiftSettings: sharedSwiftSettings
- )
- ]
- )
- if renderGTKCondition {
- package.targets.append(cgtkTarget)
- }
- if !compatibilityTestCondition {
- package.targets += [
- ]
- }
- if buildForDarwinPlatform {
- }
- if symbolLocatorCondition {
- package.dependencies.append(
- .package(url: "https://github.com/OpenSwiftUIProject/SymbolLocator.git", from: "0.2.0")
- )
- package.targets += [
- ]
- if !compatibilityTestCondition {
- }
- }
- if attributeGraphCondition {
- openSwiftUICoreTarget.addAGSettings()
- openSwiftUITarget.addAGSettings()
- }
- if renderBoxCondition {
- openSwiftUICoreTarget.addRBSettings()
- openSwiftUITarget.addRBSettings()
- }
- if linkGestures {
- openSwiftUICoreTarget.addGesturesSettings()
- openSwiftUITarget.addGesturesSettings()
- }
- if attributeGraphCondition || renderBoxCondition || linkGestures {
- let release = EnvManager.shared.withDomain("DarwinPrivateFrameworks") {
- envIntValue("TARGET_RELEASE", default: 2024)
- }
- package.platforms = switch release {
- case 2024: [.iOS(.v18), .macOS(.v15), .macCatalyst(.v18), .tvOS(.v18), .watchOS(.v10), .visionOS(.v2)]
- case 2025: [.iOS("26.0"), .macOS("26.0"), .macCatalyst("26.0"), .tvOS("26.0"), .watchOS("26.0"), .visionOS("26.0")]
- default: nil
- }
- } else {
- // For SPI build issue
- package.platforms = [.iOS(.v18), .macOS(.v15), .macCatalyst(.v18), .tvOS(.v18), .watchOS(.v10), .visionOS(.v2)]
- }
- if linkCoreUI {
- openSwiftUICoreTarget.addCoreUISettings()
- openSwiftUISPITarget.addCoreUISettings()
- }
- if linkCoreSVG {
- openSwiftUICoreTarget.addCoreSVGSettings()
- openSwiftUISPITarget.addCoreSVGSettings()
- }
- if linkSFSymbols {
- openSwiftUICoreTarget.addSFSymbolsSettings()
- }
- if linkBacklightServices {
- openSwiftUITarget.addBacklightServicesSettings()
- openSwiftUISPITarget.addBacklightServicesSettings()
- }
- if useLocalDeps {
- var dependencies: [Package.Dependency] = [
- .package(path: "../OpenCoreGraphics"),
- .package(path: "../OpenAttributeGraph"),
- .package(path: "../OpenRenderBox"),
- .package(path: "../OpenObservation"),
- ]
- if attributeGraphCondition || renderBoxCondition || linkCoreUI || linkCoreSVG || linkSFSymbols || linkBacklightServices || linkGestures {
- dependencies.append(.package(path: "../DarwinPrivateFrameworks"))
- }
- package.dependencies += dependencies
- } else {
- var dependencies: [Package.Dependency] = [
- .package(url: "https://github.com/OpenSwiftUIProject/OpenCoreGraphics", branch: "main"),
- // FIXME: on Linux platform: OG contains unsafe build flags which prevents us using version dependency
- .package(url: "https://github.com/OpenSwiftUIProject/OpenAttributeGraph", branch: "main"),
- .package(url: "https://github.com/OpenSwiftUIProject/OpenRenderBox", branch: "main"),
- .package(url: "https://github.com/OpenSwiftUIProject/OpenObservation", branch: "main"),
- ]
- if attributeGraphCondition || renderBoxCondition || linkCoreUI || linkCoreSVG || linkSFSymbols || linkGestures {
- dependencies.append(.package(url: "https://github.com/OpenSwiftUIProject/DarwinPrivateFrameworks.git", branch: "main"))
- }
- package.dependencies += dependencies
- }
- if openCombineCondition {
- package.dependencies.append(
- .package(url: "https://github.com/OpenSwiftUIProject/OpenCombine.git", from: "0.15.0")
- )
- cOpenSwiftUITarget.addOpenCombineCSettings()
- openSwiftUICoreTarget.addOpenCombineSettings()
- openSwiftUITarget.addOpenCombineSettings()
- }
- if swiftLogCondition {
- package.dependencies.append(
- .package(url: "https://github.com/apple/swift-log", from: "1.5.3")
- )
- openSwiftUICoreTarget.addSwiftLogSettings()
- openSwiftUITarget.addSwiftLogSettings()
- }
- if swiftCryptoCondition {
- package.dependencies.append(
- .package(url: "https://github.com/apple/swift-crypto.git", from: "3.8.0")
- )
- openSwiftUICoreTarget.addSwiftCryptoSettings()
- openSwiftUITarget.addSwiftCryptoSettings()
- }
- #if TUIST
- import struct ProjectDescription.PackageSettings
- import enum ProjectDescription.Product
- import enum ProjectDescription.SettingValue
- import typealias ProjectDescription.SettingsDictionary
- let openSwiftUIBuildAGBackend: String
- if let configuredAGBackend = envStringValue("AG_BACKEND_NAME") {
- openSwiftUIBuildAGBackend = configuredAGBackend
- } else if computeCondition {
- openSwiftUIBuildAGBackend = "Compute"
- } else if danceUIGraphCondition {
- openSwiftUIBuildAGBackend = "DanceUIGraph"
- } else if attributeGraphCondition {
- openSwiftUIBuildAGBackend = "AttributeGraph"
- } else {
- openSwiftUIBuildAGBackend = "OpenAttributeGraph"
- }
- let openSwiftUIBuildRendererBackend = envStringValue("RENDERER_BACKEND_NAME") ?? (swiftUIRenderCondition ? "SwiftUI" : "ark_ui_basic")
- let openSwiftUITargetSettings: SettingsDictionary = [
- "INFOPLIST_KEY_OpenSwiftUIAGBackend": .string(openSwiftUIBuildAGBackend),
- "INFOPLIST_KEY_OpenSwiftUIRendererBackend": .string(openSwiftUIBuildRendererBackend),
- "INFOPLIST_KEY_OpenSwiftUILibraryType": .string(configuredLibraryType ?? "automatic"),
- "INFOPLIST_KEY_OpenSwiftUIUsesLocalDependencies": .string(useLocalDeps ? "YES" : "NO"),
- ]
- let packageSettings = PackageSettings(
- productTypes: [
- "ark_ui_basic": ProjectDescription.Product.framework,
- "ark_ui_basic_core": ProjectDescription.Product.staticFramework,
- "ark_ui_basic_spi": ProjectDescription.Product.staticFramework,
- "c_ark_ui_basic": ProjectDescription.Product.staticFramework,
- "ark_ui_basic_macros": ProjectDescription.Product.macro,
- "OpenAttributeGraphShims": ProjectDescription.Product.staticFramework,
- "OpenCoreGraphicsShims": ProjectDescription.Product.staticFramework,
- "OpenObservation": ProjectDescription.Product.staticFramework,
- "OpenQuartzCoreShims": ProjectDescription.Product.staticFramework,
- "OpenRenderBoxShims": ProjectDescription.Product.staticFramework,
- "SymbolLocator": ProjectDescription.Product.staticFramework,
- ],
- baseProductType: ProjectDescription.Product.staticFramework,
- targetSettings: [
- "ark_ui_basic": .settings(base: openSwiftUITargetSettings),
- ]
- )
- #endif
|