Skip to content

Commit 16c7cb6

Browse files
authored
Fix imparted build properties when building with XCBuild (#5930)
Imparted settings are now per-configuration instead of per-target in XCBuild, this adopts SwiftPM's support for XCBuild to that change. We are still also passing them to the target for backwards compatibility, newer versions of XCBuild will ignore those extra keys in the JSON. rdar://102779919
1 parent fde9916 commit 16c7cb6

File tree

4 files changed

+70
-42
lines changed

4 files changed

+70
-42
lines changed

Sources/SPMTestSupport/PIFTester.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,18 @@ public class PIFBaseTargetTester {
164164
}
165165

166166
public func checkImpartedBuildSettings(file: StaticString = #file, line: UInt = #line, _ body: (PIFBuildSettingsTester) -> Void) {
167-
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.impartedBuildProperties.buildSettings)
167+
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.buildConfigurations.first!.impartedBuildProperties.buildSettings)
168168
body(buildSettingsTester)
169169
}
170170

171171
public func checkAllImpartedBuildSettings(file: StaticString = #file, line: UInt = #line, _ body: (PIFBuildSettingsTester) -> Void) {
172-
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.impartedBuildProperties.buildSettings)
172+
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.buildConfigurations.first!.impartedBuildProperties.buildSettings)
173173
body(buildSettingsTester)
174174
buildSettingsTester.checkUncheckedSettings(file: file, line: line)
175175
}
176176

177177
public func checkNoImpartedBuildSettings(file: StaticString = #file, line: UInt = #line) {
178-
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.impartedBuildProperties.buildSettings)
178+
let buildSettingsTester = PIFBuildSettingsTester(buildSettings: baseTarget.buildConfigurations.first!.impartedBuildProperties.buildSettings)
179179
buildSettingsTester.checkUncheckedSettings(file: file, line: line)
180180
}
181181
}

Sources/XCBuildSupport/PIF.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,14 +862,16 @@ public enum PIF {
862862
public let guid: GUID
863863
public var name: String
864864
public var buildSettings: BuildSettings
865+
public let impartedBuildProperties: ImpartedBuildProperties
865866

866-
public init(guid: GUID, name: String, buildSettings: BuildSettings) {
867+
public init(guid: GUID, name: String, buildSettings: BuildSettings, impartedBuildProperties: ImpartedBuildProperties = ImpartedBuildProperties(settings: BuildSettings())) {
867868
precondition(!guid.isEmpty)
868869
precondition(!name.isEmpty)
869870

870871
self.guid = guid
871872
self.name = name
872873
self.buildSettings = buildSettings
874+
self.impartedBuildProperties = impartedBuildProperties
873875
}
874876
}
875877

Sources/XCBuildSupport/PIFBuilder.swift

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,10 @@ class PIFProjectBuilder {
175175
@discardableResult
176176
func addBuildConfiguration(
177177
name: String,
178-
settings: PIF.BuildSettings = PIF.BuildSettings()
178+
settings: PIF.BuildSettings = PIF.BuildSettings(),
179+
impartedBuildProperties: PIF.ImpartedBuildProperties = PIF.ImpartedBuildProperties(settings: PIF.BuildSettings())
179180
) -> PIFBuildConfigurationBuilder {
180-
let builder = PIFBuildConfigurationBuilder(name: name, settings: settings)
181+
let builder = PIFBuildConfigurationBuilder(name: name, settings: settings, impartedBuildProperties: impartedBuildProperties)
181182
buildConfigurations.append(builder)
182183
return builder
183184
}
@@ -480,8 +481,9 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
480481
impartedSettings: &impartedSettings
481482
)
482483

483-
pifTarget.addBuildConfiguration(name: "Debug", settings: debugSettings)
484-
pifTarget.addBuildConfiguration(name: "Release", settings: releaseSettings)
484+
let impartedBuildProperties = PIF.ImpartedBuildProperties(settings: impartedSettings)
485+
pifTarget.addBuildConfiguration(name: "Debug", settings: debugSettings, impartedBuildProperties: impartedBuildProperties)
486+
pifTarget.addBuildConfiguration(name: "Release", settings: releaseSettings, impartedBuildProperties: impartedBuildProperties)
485487
}
486488

487489
private func addLibraryTarget(for product: ResolvedProduct) {
@@ -691,8 +693,9 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
691693
impartedSettings: &impartedSettings
692694
)
693695

694-
pifTarget.addBuildConfiguration(name: "Debug", settings: debugSettings)
695-
pifTarget.addBuildConfiguration(name: "Release", settings: releaseSettings)
696+
let impartedBuildProperties = PIF.ImpartedBuildProperties(settings: impartedSettings)
697+
pifTarget.addBuildConfiguration(name: "Debug", settings: debugSettings, impartedBuildProperties: impartedBuildProperties)
698+
pifTarget.addBuildConfiguration(name: "Release", settings: releaseSettings, impartedBuildProperties: impartedBuildProperties)
696699
pifTarget.impartedBuildSettings = impartedSettings
697700
}
698701

@@ -701,11 +704,6 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
701704
throw InternalError("unexpected target type")
702705
}
703706

704-
// Create an aggregate PIF target (which doesn't have an actual product).
705-
let pifTarget = addAggregateTarget(guid: target.pifTargetGUID, name: target.name)
706-
pifTarget.addBuildConfiguration(name: "Debug", settings: PIF.BuildSettings())
707-
pifTarget.addBuildConfiguration(name: "Release", settings: PIF.BuildSettings())
708-
709707
// Impart the header search path to all direct and indirect clients.
710708
var impartedSettings = PIF.BuildSettings()
711709

@@ -725,6 +723,12 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
725723
impartedSettings[.OTHER_LDRFLAGS] = []
726724
impartedSettings[.OTHER_CFLAGS, default: ["$(inherited)"]] += ["-fmodule-map-file=\(systemTarget.moduleMapPath)"] + cFlags
727725
impartedSettings[.OTHER_SWIFT_FLAGS, default: ["$(inherited)"]] += ["-Xcc", "-fmodule-map-file=\(systemTarget.moduleMapPath)"] + cFlags
726+
let impartedBuildProperties = PIF.ImpartedBuildProperties(settings: impartedSettings)
727+
728+
// Create an aggregate PIF target (which doesn't have an actual product).
729+
let pifTarget = addAggregateTarget(guid: target.pifTargetGUID, name: target.name)
730+
pifTarget.addBuildConfiguration(name: "Debug", settings: PIF.BuildSettings(), impartedBuildProperties: impartedBuildProperties)
731+
pifTarget.addBuildConfiguration(name: "Release", settings: PIF.BuildSettings(), impartedBuildProperties: impartedBuildProperties)
728732
pifTarget.impartedBuildSettings = impartedSettings
729733
}
730734

@@ -1082,9 +1086,10 @@ class PIFBaseTargetBuilder {
10821086
@discardableResult
10831087
public func addBuildConfiguration(
10841088
name: String,
1085-
settings: PIF.BuildSettings = PIF.BuildSettings()
1089+
settings: PIF.BuildSettings = PIF.BuildSettings(),
1090+
impartedBuildProperties: PIF.ImpartedBuildProperties = PIF.ImpartedBuildProperties(settings: PIF.BuildSettings())
10861091
) -> PIFBuildConfigurationBuilder {
1087-
let builder = PIFBuildConfigurationBuilder(name: name, settings: settings)
1092+
let builder = PIFBuildConfigurationBuilder(name: name, settings: settings, impartedBuildProperties: impartedBuildProperties)
10881093
buildConfigurations.append(builder)
10891094
return builder
10901095
}
@@ -1328,18 +1333,20 @@ final class PIFBuildFileBuilder {
13281333
final class PIFBuildConfigurationBuilder {
13291334
let name: String
13301335
let settings: PIF.BuildSettings
1336+
let impartedBuildProperties: PIF.ImpartedBuildProperties
13311337

13321338
@DelayedImmutable
13331339
var guid: PIF.GUID
13341340

1335-
public init(name: String, settings: PIF.BuildSettings) {
1341+
public init(name: String, settings: PIF.BuildSettings, impartedBuildProperties: PIF.ImpartedBuildProperties) {
13361342
precondition(!name.isEmpty)
13371343
self.name = name
13381344
self.settings = settings
1345+
self.impartedBuildProperties = impartedBuildProperties
13391346
}
13401347

13411348
func construct() -> PIF.BuildConfiguration {
1342-
PIF.BuildConfiguration(guid: guid, name: name, buildSettings: settings)
1349+
PIF.BuildConfiguration(guid: guid, name: name, buildSettings: settings, impartedBuildProperties: impartedBuildProperties)
13431350
}
13441351
}
13451352

Tests/XCBuildSupportTests/PIFTests.swift

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ class PIFTests: XCTestCase {
123123
var settings = PIF.BuildSettings()
124124
settings[.TARGET_NAME] = "MyLibrary-Debug"
125125
return settings
126+
}(),
127+
impartedBuildProperties: {
128+
var settings = PIF.BuildSettings()
129+
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
130+
return PIF.ImpartedBuildProperties(settings: settings)
126131
}()
127132
),
128133
PIF.BuildConfiguration(
@@ -132,6 +137,11 @@ class PIFTests: XCTestCase {
132137
var settings = PIF.BuildSettings()
133138
settings[.TARGET_NAME] = "MyLibrary"
134139
return settings
140+
}(),
141+
impartedBuildProperties: {
142+
var settings = PIF.BuildSettings()
143+
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
144+
return PIF.ImpartedBuildProperties(settings: settings)
135145
}()
136146
),
137147
],
@@ -148,11 +158,7 @@ class PIFTests: XCTestCase {
148158
)
149159
],
150160
dependencies: [],
151-
impartedBuildSettings: {
152-
var settings = PIF.BuildSettings()
153-
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
154-
return settings
155-
}()
161+
impartedBuildSettings: PIF.BuildSettings()
156162
),
157163
PIF.AggregateTarget(
158164
guid: "aggregate-target-guid",
@@ -161,24 +167,30 @@ class PIFTests: XCTestCase {
161167
PIF.BuildConfiguration(
162168
guid: "aggregate-target-config-debug-guid",
163169
name: "Debug",
164-
buildSettings: PIF.BuildSettings()
170+
buildSettings: PIF.BuildSettings(),
171+
impartedBuildProperties: {
172+
var settings = PIF.BuildSettings()
173+
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
174+
return PIF.ImpartedBuildProperties(settings: settings)
175+
}()
165176
),
166177
PIF.BuildConfiguration(
167178
guid: "aggregate-target-config-release-guid",
168179
name: "Release",
169-
buildSettings: PIF.BuildSettings()
180+
buildSettings: PIF.BuildSettings(),
181+
impartedBuildProperties: {
182+
var settings = PIF.BuildSettings()
183+
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
184+
return PIF.ImpartedBuildProperties(settings: settings)
185+
}()
170186
),
171187
],
172188
buildPhases: [],
173189
dependencies: [
174190
.init(targetGUID: "target-lib-guid"),
175191
.init(targetGUID: "target-exe-guid"),
176192
],
177-
impartedBuildSettings: {
178-
var settings = PIF.BuildSettings()
179-
settings[.OTHER_CFLAGS] = ["-fmodule-map-file=modulemap", "$(inherited)"]
180-
return settings
181-
}()
193+
impartedBuildSettings: PIF.BuildSettings()
182194
)
183195
],
184196
groupTree: PIF.Group(guid: "main-group-guid", path: "", children: [
@@ -331,7 +343,6 @@ class PIFTests: XCTestCase {
331343
XCTAssertEqual(exeTargetContents["type"]?.string, "standard")
332344
XCTAssertEqual(exeTargetContents["productTypeIdentifier"]?.string, "com.apple.product-type.tool")
333345
XCTAssertEqual(exeTargetContents["buildRules"]?.array, [])
334-
XCTAssertEqual(exeTargetContents["impartedBuildProperties"]?.dictionary, ["buildSettings": JSON([:])])
335346

336347
XCTAssertEqual(exeTargetContents["productReference"], JSON([
337348
"type": "file",
@@ -346,6 +357,7 @@ class PIFTests: XCTestCase {
346357
let debugSettings = debugConfiguration["buildSettings"]
347358
XCTAssertEqual(debugSettings?["TARGET_NAME"]?.string, "MyExecutable")
348359
XCTAssertEqual(debugSettings?["EXECUTABLE_NAME"]?.string, "my-exe")
360+
XCTAssertEqual(debugConfiguration["impartedBuildProperties"]?.dictionary, ["buildSettings": JSON([:])])
349361

350362
let releaseConfiguration = configurations[1]
351363
XCTAssertEqual(releaseConfiguration["guid"]?.string, "target-exe-config-release-guid")
@@ -354,6 +366,7 @@ class PIFTests: XCTestCase {
354366
XCTAssertEqual(releaseSettings?["TARGET_NAME"]?.string, "MyExecutable")
355367
XCTAssertEqual(releaseSettings?["EXECUTABLE_NAME"]?.string, "my-exe")
356368
XCTAssertEqual(releaseSettings?["SKIP_INSTALL"]?.string, "NO")
369+
XCTAssertEqual(releaseConfiguration["impartedBuildProperties"]?.dictionary, ["buildSettings": JSON([:])])
357370
} else {
358371
XCTFail("invalid number of build configurations")
359372
}
@@ -396,23 +409,26 @@ class PIFTests: XCTestCase {
396409
"name": "MyLibrary"
397410
]))
398411

399-
XCTAssertEqual(
400-
libTargetContents["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
401-
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
402-
)
403-
404412
if let configurations = libTargetContents["buildConfigurations"]?.array, configurations.count == 2 {
405413
let debugConfiguration = configurations[0]
406414
XCTAssertEqual(debugConfiguration["guid"]?.string, "target-lib-config-debug-guid")
407415
XCTAssertEqual(debugConfiguration["name"]?.string, "Debug")
408416
let debugSettings = debugConfiguration["buildSettings"]
409417
XCTAssertEqual(debugSettings?["TARGET_NAME"]?.string, "MyLibrary-Debug")
418+
XCTAssertEqual(
419+
debugConfiguration["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
420+
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
421+
)
410422

411423
let releaseConfiguration = configurations[1]
412424
XCTAssertEqual(releaseConfiguration["guid"]?.string, "target-lib-config-release-guid")
413425
XCTAssertEqual(releaseConfiguration["name"]?.string, "Release")
414426
let releaseSettings = releaseConfiguration["buildSettings"]
415427
XCTAssertEqual(releaseSettings?["TARGET_NAME"]?.string, "MyLibrary")
428+
XCTAssertEqual(
429+
releaseConfiguration["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
430+
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
431+
)
416432
} else {
417433
XCTFail("invalid number of build configurations")
418434
}
@@ -441,23 +457,26 @@ class PIFTests: XCTestCase {
441457
])
442458
XCTAssertEqual(aggregateTargetContents["buildRules"], nil)
443459

444-
XCTAssertEqual(
445-
aggregateTargetContents["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
446-
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
447-
)
448-
449460
if let configurations = aggregateTargetContents["buildConfigurations"]?.array, configurations.count == 2 {
450461
let debugConfiguration = configurations[0]
451462
XCTAssertEqual(debugConfiguration["guid"]?.string, "aggregate-target-config-debug-guid")
452463
XCTAssertEqual(debugConfiguration["name"]?.string, "Debug")
453464
let debugSettings = debugConfiguration["buildSettings"]
454465
XCTAssertNotNil(debugSettings)
466+
XCTAssertEqual(
467+
debugConfiguration["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
468+
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
469+
)
455470

456471
let releaseConfiguration = configurations[1]
457472
XCTAssertEqual(releaseConfiguration["guid"]?.string, "aggregate-target-config-release-guid")
458473
XCTAssertEqual(releaseConfiguration["name"]?.string, "Release")
459474
let releaseSettings = releaseConfiguration["buildSettings"]
460475
XCTAssertNotNil(releaseSettings)
476+
XCTAssertEqual(
477+
releaseConfiguration["impartedBuildProperties"]?["buildSettings"]?["OTHER_CFLAGS"]?.array,
478+
[.string("-fmodule-map-file=modulemap"), .string("$(inherited)")]
479+
)
461480
} else {
462481
XCTFail("invalid number of build configurations")
463482
}

0 commit comments

Comments
 (0)