@@ -15,12 +15,18 @@ final class EnvManager {
1515 domains. append ( domain)
1616 }
1717
18+ func withDomain< T> ( _ domain: String , perform: ( ) throws -> T ) rethrows -> T {
19+ domains. append ( domain)
20+ defer { domains. removeAll { $0 == domain } }
21+ return try perform ( )
22+ }
23+
1824 private func envValue< T> (
1925 rawKey: String ,
20- default defaultValue: T ,
26+ default defaultValue: T ? ,
2127 searchInDomain: Bool ,
2228 parser: ( String ) -> T ?
23- ) -> T {
29+ ) -> T ? {
2430 func parseEnvValue( _ key: String ) -> ( String , T ) ? {
2531 guard let value = Context . environment [ key] else {
2632 return nil
@@ -40,11 +46,13 @@ final class EnvManager {
4046 }
4147 }
4248 let primaryKey = keys. first ?? rawKey
43- print ( " [Env] \( primaryKey) not set -> \( defaultValue) (default) " )
49+ if let defaultValue {
50+ print ( " [Env] \( primaryKey) not set -> \( defaultValue) (default) " )
51+ }
4452 return defaultValue
4553 }
4654
47- func envBoolValue( rawKey: String , default defaultValue: Bool , searchInDomain: Bool ) -> Bool {
55+ func envBoolValue( rawKey: String , default defaultValue: Bool ? = nil , searchInDomain: Bool ) -> Bool ? {
4856 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { value in
4957 switch value {
5058 case " 1 " : true
@@ -54,11 +62,11 @@ final class EnvManager {
5462 }
5563 }
5664
57- func envIntValue( rawKey: String , default defaultValue: Int , searchInDomain: Bool ) -> Int {
65+ func envIntValue( rawKey: String , default defaultValue: Int ? = nil , searchInDomain: Bool ) -> Int ? {
5866 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { Int ( $0) }
5967 }
6068
61- func envStringValue( rawKey: String , default defaultValue: String , searchInDomain: Bool ) -> String {
69+ func envStringValue( rawKey: String , default defaultValue: String ? = nil , searchInDomain: Bool ) -> String ? {
6270 envValue ( rawKey: rawKey, default: defaultValue, searchInDomain: searchInDomain) { $0 }
6371 }
6472}
@@ -67,19 +75,23 @@ EnvManager.shared.register(domain: "OpenSwiftUI")
6775
6876@MainActor
6977func envBoolValue( _ key: String , default defaultValue: Bool = false , searchInDomain: Bool = true ) -> Bool {
70- EnvManager . shared. envBoolValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain)
78+ EnvManager . shared. envBoolValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
7179}
7280
7381@MainActor
74- func envIntValue( _ key: String , default defaultValue: Int , searchInDomain: Bool = true ) -> Int {
75- EnvManager . shared. envIntValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain)
82+ func envIntValue( _ key: String , default defaultValue: Int = 0 , searchInDomain: Bool = true ) -> Int {
83+ EnvManager . shared. envIntValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
7684}
7785
7886@MainActor
7987func envStringValue( _ key: String , default defaultValue: String , searchInDomain: Bool = true ) -> String {
80- EnvManager . shared. envStringValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain)
88+ EnvManager . shared. envStringValue ( rawKey: key, default: defaultValue, searchInDomain: searchInDomain) !
8189}
8290
91+ @MainActor
92+ func envStringValue( _ key: String , searchInDomain: Bool = true ) -> String ? {
93+ EnvManager . shared. envStringValue ( rawKey: key, searchInDomain: searchInDomain)
94+ }
8395
8496// MARK: - Env and config
8597
@@ -89,31 +101,41 @@ let buildForDarwinPlatform = envBoolValue("BUILD_FOR_DARWIN_PLATFORM", default:
89101#else
90102let buildForDarwinPlatform = envBoolValue ( " BUILD_FOR_DARWIN_PLATFORM " )
91103#endif
104+
92105// https://github.com/SwiftPackageIndex/SwiftPackageIndex-Server/issues/3061#issuecomment-2118821061
93106// By-pass https://github.com/swiftlang/swift-package-manager/issues/7580
94107let isSPIDocGenerationBuild = envBoolValue ( " SPI_GENERATE_DOCS " , searchInDomain: false )
95108let isSPIBuild = envBoolValue ( " SPI_BUILD " , searchInDomain: false )
96109
97- let isXcodeEnv = Context . environment [ " __CFBundleIdentifier " ] == " com.apple.dt.Xcode "
110+ let isXcodeEnv = envStringValue ( " __CFBundleIdentifier " , searchInDomain : false ) == " com.apple.dt.Xcode "
98111let development = envBoolValue ( " DEVELOPMENT " , default: false )
112+ let warningsAsErrorsCondition = envBoolValue ( " WERROR " , default: isXcodeEnv && development)
99113
100114let libSwiftPath = {
101115 // From Swift toolchain being installed or from Swift SDK.
102- guard let libSwiftPath = Context . environment [ " OPENATTRIBUTEGRAPH_LIB_SWIFT_PATH " ] else {
116+ guard let libSwiftPath = envStringValue ( " LIB_SWIFT_PATH " ) else {
103117 // Fallback when LIB_SWIFT_PATH is not set
104- let swiftBinPath = Context . environment [ " OPENATTRIBUTEGRAPH_BIN_SWIFT_PATH " ] ?? Context . environment [ " _ " ] ?? " /usr/bin/swift "
118+ let swiftBinPath = envStringValue ( " BIN_SWIFT_PATH " ) ?? envStringValue ( " _ " , searchInDomain : false ) ?? " /usr/bin/swift "
105119 let swiftBinURL = URL ( fileURLWithPath: swiftBinPath)
106120 let SDKPath = swiftBinURL. deletingLastPathComponent ( ) . deletingLastPathComponent ( ) . deletingLastPathComponent ( ) . path
107121 return SDKPath . appending ( " /usr/lib/swift " )
108122 }
109123 return libSwiftPath
110124} ( )
111125
112- let swiftToolchainPath = Context . environment [ " OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_PATH " ] ?? ( development ? " /Volumes/BuildMachine/swift-project " : " " )
113- let swiftToolchainVersion = Context . environment [ " OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_VERSION " ] ?? ( development ? " 6.0.2 " : " " )
126+ let swiftToolchainPath = envStringValue ( " SWIFT_TOOLCHAIN_PATH " ) ?? ( development ? " /Volumes/BuildMachine/swift-project " : " " )
127+ let swiftToolchainVersion = envStringValue ( " SWIFT_TOOLCHAIN_VERSION " ) ?? ( development ? " 6.0.2 " : " " )
114128let swiftToolchainSupported = envBoolValue ( " SWIFT_TOOLCHAIN_SUPPORTED " , default: !swiftToolchainVersion. isEmpty)
115129
130+ let releaseVersion = envIntValue ( " TARGET_RELEASE " , default: 2024 )
131+
132+ let libraryEvolutionCondition = envBoolValue ( " LIBRARY_EVOLUTION " , default: buildForDarwinPlatform)
133+ let compatibilityTestCondition = envBoolValue ( " COMPATIBILITY_TEST " , default: false )
134+
135+ let useLocalDeps = envBoolValue ( " USE_LOCAL_DEPS " )
136+ let attributeGraphCondition = envBoolValue ( " ATTRIBUTEGRAPH " , default: buildForDarwinPlatform && !isSPIBuild)
116137
138+ // MARK: - Shared Settings
117139
118140var sharedCSettings : [ CSetting ] = [
119141 . unsafeFlags( [ " -I " , libSwiftPath] , . when( platforms: . nonDarwinPlatforms) ) ,
@@ -124,9 +146,9 @@ var sharedSwiftSettings: [SwiftSetting] = [
124146 . enableUpcomingFeature( " InternalImportsByDefault " ) ,
125147 . enableExperimentalFeature( " Extern " ) ,
126148 . swiftLanguageMode( . v5) ,
127- ]
128149
129- // MARK: [env] OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_PATH
150+ . define( " OPENATTRIBUTEGRAPH_RELEASE_ \( releaseVersion) " ) ,
151+ ]
130152
131153// Modified from: https://github.com/swiftlang/swift/blob/main/SwiftCompilerSources/Package.swift
132154//
@@ -161,58 +183,52 @@ if !swiftToolchainPath.isEmpty {
161183 )
162184 )
163185}
164-
165- // MARK: [env] OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_VERSION
166-
167186if !swiftToolchainVersion. isEmpty {
168187 sharedCSettings. append (
169188 . define( " OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_VERSION " , to: swiftToolchainVersion)
170189 )
171190}
172-
173- // MARK: - [env] OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
174-
175191if swiftToolchainSupported {
176192 sharedCSettings. append ( . define( " OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_SUPPORTED " ) )
177193 sharedSwiftSettings. append ( . define( " OPENATTRIBUTEGRAPH_SWIFT_TOOLCHAIN_SUPPORTED " ) )
178194}
179-
180- // MARK: - [env] OPENATTRIBUTEGRAPH_TARGET_RELEASE
181-
182- let releaseVersion = Context . environment [ " OPENATTRIBUTEGRAPH_TARGET_RELEASE " ] . flatMap { Int ( $0) } ?? 2024
183- //sharedCSettings.append(.define("OPENATTRIBUTEGRAPH_RELEASE", to: "\(releaseVersion)"))
184- sharedSwiftSettings. append ( . define( " OPENATTRIBUTEGRAPH_RELEASE_ \( releaseVersion) " ) )
185195if releaseVersion >= 2021 {
186196 for year in 2021 ... releaseVersion {
187197 sharedSwiftSettings. append ( . define( " OPENATTRIBUTEGRAPH_SUPPORT_ \( year) _API " ) )
188198 }
189199}
190-
191- // MARK: - [env] OPENATTRIBUTEGRAPH_WERROR
192-
193- let warningsAsErrorsCondition = envBoolValue ( " WERROR " , default: isXcodeEnv && development)
194200if warningsAsErrorsCondition {
195201 sharedSwiftSettings. append ( . unsafeFlags( [ " -warnings-as-errors " ] ) )
196202}
197-
198- // MARK: - [env] OPENATTRIBUTEGRAPH_LIBRARY_EVOLUTION
199-
200- let libraryEvolutionCondition = envBoolValue ( " LIBRARY_EVOLUTION " , default: buildForDarwinPlatform)
201-
202203if libraryEvolutionCondition {
203204 // NOTE: -enable-library-evolution will cause module verify failure for `swift build`.
204205 // Either set OPENATTRIBUTEGRAPH_LIBRARY_EVOLUTION=0 or add `-Xswiftc -no-verify-emitted-module-interface` after `swift build`
205206 sharedSwiftSettings. append ( . unsafeFlags( [ " -enable-library-evolution " , " -no-verify-emitted-module-interface " ] ) )
206207}
207-
208- // MARK: - [env] OPENATTRIBUTEGRAPH_COMPATIBILITY_TEST
209-
210- let compatibilityTestCondition = envBoolValue ( " COMPATIBILITY_TEST " , default: false )
211- sharedCSettings. append ( . define( " OPENATTRIBUTEGRAPH " , to: compatibilityTestCondition ? " 1 " : " 0 " ) )
212208if !compatibilityTestCondition {
209+ sharedCSettings. append ( . define( " OPENATTRIBUTEGRAPH " ) )
213210 sharedSwiftSettings. append ( . define( " OPENATTRIBUTEGRAPH " ) )
214211}
215212
213+ // MARK: - Extension
214+
215+ extension Target {
216+ func addAGSettings( ) {
217+ dependencies. append (
218+ . product( name: " AttributeGraph " , package : " DarwinPrivateFrameworks " )
219+ )
220+ var swiftSettings = swiftSettings ?? [ ]
221+ swiftSettings. append ( . define( " OPENATTRIBUTEGRAPH_ATTRIBUTEGRAPH " ) )
222+ self . swiftSettings = swiftSettings
223+ }
224+ }
225+
226+ extension [ Platform ] {
227+ static var nonDarwinPlatforms : [ Platform ] {
228+ [ . linux, . android, . wasi, . openbsd, . windows]
229+ }
230+ }
231+
216232// MARK: - Targets
217233
218234let openAttributeGraphTarget = Target . target (
@@ -297,35 +313,20 @@ let package = Package(
297313 cxxLanguageStandard: . cxx20
298314)
299315
300- extension Target {
301- func addAGSettings( ) {
302- dependencies. append (
303- . product( name: " AttributeGraph " , package : " DarwinPrivateFrameworks " )
304- )
305- var swiftSettings = swiftSettings ?? [ ]
306- swiftSettings. append ( . define( " OPENATTRIBUTEGRAPH_ATTRIBUTEGRAPH " ) )
307- self . swiftSettings = swiftSettings
308- }
309- }
310-
311- if !compatibilityTestCondition {
316+ if compatibilityTestCondition {
317+ openAttributeGraphCompatibilityTestsTarget. addAGSettings ( )
318+ } else {
312319 package . targets += [
313320 openAttributeGraphTestsTarget,
314321 openAttributeGraphCxxTestsTarget,
315322 openAttributeGraphShimsTestsTarget,
316323 ]
317- } else {
318- openAttributeGraphCompatibilityTestsTarget. addAGSettings ( )
319324}
320325
321326if buildForDarwinPlatform {
322327 package . targets. append ( openAttributeGraphCompatibilityTestsTarget)
323328}
324329
325- let useLocalDeps = envBoolValue ( " USE_LOCAL_DEPS " )
326-
327- let attributeGraphCondition = envBoolValue ( " ATTRIBUTEGRAPH " , default: buildForDarwinPlatform && !isSPIBuild)
328-
329330if attributeGraphCondition {
330331 let privateFrameworkRepo : Package . Dependency
331332 if useLocalDeps {
@@ -335,8 +336,10 @@ if attributeGraphCondition {
335336 }
336337 package . dependencies. append ( privateFrameworkRepo)
337338 openAttributeGraphShimsTarget. addAGSettings ( )
338-
339- let agVersion = Context . environment [ " DARWIN_PRIVATE_FRAMEWORKS_TARGET_RELEASE " ] . flatMap { Int ( $0) } ?? 2024
339+
340+ let agVersion = EnvManager . shared. withDomain ( " DARWIN_PRIVATE_FRAMEWORKS " ) {
341+ envIntValue ( " TARGET_RELEASE " , default: 2024 )
342+ }
340343 package . platforms = switch agVersion {
341344 case 2024 : [ . iOS( . v18) , . macOS( . v15) , . macCatalyst( . v18) , . tvOS( . v18) , . watchOS( . v10) , . visionOS( . v2) ]
342345 case 2021 : [ . iOS( . v15) , . macOS( . v12) , . macCatalyst( . v15) , . tvOS( . v15) , . watchOS( . v7) ]
@@ -346,10 +349,3 @@ if attributeGraphCondition {
346349 openAttributeGraphShimsTarget. dependencies. append ( " OpenAttributeGraph " )
347350 package . platforms = [ . iOS( . v13) , . macOS( . v10_15) , . macCatalyst( . v13) , . tvOS( . v13) , . watchOS( . v5) ]
348351}
349-
350-
351- extension [ Platform ] {
352- static var nonDarwinPlatforms : [ Platform ] {
353- [ . linux, . android, . wasi, . openbsd, . windows]
354- }
355- }
0 commit comments