@@ -1086,9 +1086,36 @@ public final class PackageBuilder {
10861086 }
10871087 }
10881088
1089- private func resolvedSettings( for target: TargetDescription ) -> [ TargetBuildSettingDescription . Setting ] {
1090- var resolved = target. settings
1089+ private func resolvedSettings( for target: TargetDescription ) throws -> [ TargetBuildSettingDescription . Setting ] {
1090+ var resolved : [ TargetBuildSettingDescription . Setting ] = [ ]
1091+
1092+ // first, validate defaults
1093+ for setting in manifest. defaultSettings ?? [ ] {
1094+ if case . unsafeFlags = setting. kind {
1095+ throw ModuleError . invalidManifestConfig (
1096+ self . identity. description, " default settings cannot contain unsafe flags "
1097+ )
1098+ }
1099+ }
1100+
1101+ // copy over all existing settings, substituting in defaults if inherited is encountered.
1102+ for setting in target. settings {
1103+ switch setting. kind {
1104+ case . inherited:
1105+ if setting. condition != nil {
1106+ throw ModuleError . invalidManifestConfig (
1107+ self . identity. description, " inherited settings cannot use conditions "
1108+ )
1109+ }
10911110
1111+ let defaults = manifest. defaultSettings? . filter ( { $0. tool == setting. tool } ) ?? [ ]
1112+ resolved. append ( contentsOf: defaults)
1113+ default :
1114+ resolved. append ( setting)
1115+ }
1116+ }
1117+
1118+ // Now, apply the defaults if nothing explicit is present.
10921119 if !target. explicitSettings. swift {
10931120 resolved. append ( contentsOf: manifest. defaultSettings? . filter ( { $0. tool == . swift } ) ?? [ ] )
10941121 }
@@ -1105,25 +1132,6 @@ public final class PackageBuilder {
11051132 resolved. append ( contentsOf: manifest. defaultSettings? . filter ( { $0. tool == . linker } ) ?? [ ] )
11061133 }
11071134
1108- // let defaultSettings = manifest.defaultSettings ?? []
1109- //
1110- // for defaultSetting in defaultSettings {
1111- // var eligible = true
1112- //
1113- // // Look for an existing target setting that takes precedence. If none are found,
1114- // // the default is accepted.
1115- // for setting in resolved {
1116- // if setting.overridesDefault(defaultSetting) {
1117- // eligible = false
1118- // break
1119- // }
1120- // }
1121- //
1122- // if eligible {
1123- // resolved.append(defaultSetting)
1124- // }
1125- // }
1126- //
11271135 return resolved
11281136 }
11291137
@@ -1144,7 +1152,7 @@ public final class PackageBuilder {
11441152 table. add ( versionAssignment, for: . SWIFT_VERSION)
11451153
11461154 // Process each setting.
1147- for setting in resolvedSettings ( for: target) {
1155+ for setting in try resolvedSettings ( for: target) {
11481156 if let traits = setting. condition? . traits, traits. intersection ( self . enabledTraits. names) . isEmpty {
11491157 // The setting is currently not enabled so we should skip it
11501158 continue
@@ -1382,6 +1390,8 @@ public final class PackageBuilder {
13821390 }
13831391
13841392 values = [ " -default-isolation " , isolation. rawValue]
1393+ case . inherited:
1394+ throw InternalError ( " inherited cannot be in resolved setttings " )
13851395 }
13861396
13871397 // Create an assignment for this setting.
0 commit comments