Skip to content

Commit 4eded60

Browse files
committed
Pass toolchain settings when using XCBuild
This is a follow-up to #3695, adding various other settings of the toolchain that we weren't yet correctly forwarding when XCBuild is being used. rdar://82313817 (cherry picked from commit 329da56)
1 parent 2a447a6 commit 4eded60

File tree

5 files changed

+45
-10
lines changed

5 files changed

+45
-10
lines changed

Sources/Build/BuildPlan.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,13 +1255,19 @@ public final class ProductBuildDescription {
12551255

12561256
// Embed the swift stdlib library path inside tests and executables on Darwin.
12571257
if containsSwiftTargets {
1258+
let useStdlibRpath: Bool
12581259
switch product.type {
1259-
case .library, .plugin: break
1260+
case .library(let type):
1261+
useStdlibRpath = type == .dynamic
12601262
case .test, .executable:
1261-
if buildParameters.triple.isDarwin() {
1262-
let stdlib = buildParameters.toolchain.macosSwiftStdlib
1263-
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
1264-
}
1263+
useStdlibRpath = true
1264+
case .plugin:
1265+
throw InternalError("unexpectedly asked to generate linker arguments for a plugin product")
1266+
}
1267+
1268+
if useStdlibRpath && buildParameters.triple.isDarwin() {
1269+
let stdlib = buildParameters.toolchain.macosSwiftStdlib
1270+
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
12651271
}
12661272
}
12671273

Sources/XCBuildSupport/PIFBuilder.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@ public struct PIFBuilderParameters {
2727
/// Whether to create dylibs for dynamic library products.
2828
public let shouldCreateDylibForDynamicProducts: Bool
2929

30+
/// The path to the library directory of the active toolchain.
31+
public let toolchainLibDir: AbsolutePath
32+
3033
/// Creates a `PIFBuilderParameters` instance.
3134
/// - Parameters:
3235
/// - enableTestability: Whether or not build for testability is enabled.
3336
/// - shouldCreateDylibForDynamicProducts: Whether to create dylibs for dynamic library products.
34-
public init(enableTestability: Bool, shouldCreateDylibForDynamicProducts: Bool) {
37+
public init(enableTestability: Bool, shouldCreateDylibForDynamicProducts: Bool, toolchainLibDir: AbsolutePath) {
3538
self.enableTestability = enableTestability
3639
self.shouldCreateDylibForDynamicProducts = shouldCreateDylibForDynamicProducts
40+
self.toolchainLibDir = toolchainLibDir
3741
}
3842
}
3943

@@ -395,6 +399,10 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
395399
settings[.SWIFT_FORCE_STATIC_LINK_STDLIB] = "NO"
396400
settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB] = "YES"
397401

402+
if product.type == .executable || product.type == .test {
403+
settings[.LIBRARY_SEARCH_PATHS] = ["$(inherited)", "\(parameters.toolchainLibDir.pathString)/swift/macosx"]
404+
}
405+
398406
// Tests can have a custom deployment target based on the minimum supported by XCTest.
399407
if mainTarget.underlyingTarget.type == .test {
400408
settings[.MACOSX_DEPLOYMENT_TARGET] = mainTarget.underlyingTarget.deploymentTarget(for: .macOS)
@@ -518,6 +526,7 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
518526
settings[.DEFINES_MODULE] = "YES"
519527
settings[.SKIP_INSTALL] = "NO"
520528
settings[.INSTALL_PATH] = "/usr/local/lib"
529+
settings[.LIBRARY_SEARCH_PATHS] = ["$(inherited)", "\(parameters.toolchainLibDir.pathString)/swift/macosx"]
521530

522531
if !parameters.shouldCreateDylibForDynamicProducts {
523532
settings[.GENERATE_INFOPLIST_FILE] = "YES"

Sources/XCBuildSupport/XcodeBuildSystem.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,14 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
134134

135135
// Generate a table of any overriding build settings.
136136
var settings: [String: String] = [:]
137+
// An error with determining the override should not be fatal here.
138+
settings["CC"] = try? buildParameters.toolchain.getClangCompiler().pathString
137139
// Always specify the path of the effective Swift compiler, which was determined in the same way as for the native build system.
138140
settings["SWIFT_EXEC"] = buildParameters.toolchain.swiftCompiler.pathString
141+
settings["LIBRARY_SEARCH_PATHS"] = "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)"
142+
settings["OTHER_CFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCCFlags.joined(separator: " "))"
143+
settings["OTHER_CPLUSPLUSFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCPPFlags.joined(separator: " "))"
144+
settings["OTHER_SWIFT_FLAGS"] = "$(inherited) \(buildParameters.toolchain.extraSwiftCFlags.joined(separator: " "))"
139145
// Optionally also set the list of architectures to build for.
140146
if !buildParameters.archs.isEmpty {
141147
settings["ARCHS"] = buildParameters.archs.joined(separator: " ")
@@ -144,7 +150,7 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
144150
// Generate the build parameters.
145151
let params = XCBBuildParameters(
146152
configurationName: buildParameters.configuration.xcbuildName,
147-
overrides: .init(commandLine: .init(table: settings)),
153+
overrides: .init(synthesized: .init(table: settings)),
148154
activeRunDestination: runDestination
149155
)
150156

@@ -206,7 +212,7 @@ struct XCBBuildParameters: Encodable {
206212
}
207213

208214
struct SettingsOverride: Encodable {
209-
var commandLine: XCBSettingsTable? = nil
215+
var synthesized: XCBSettingsTable? = nil
210216
}
211217

212218
var configurationName: String
@@ -227,7 +233,8 @@ extension PIFBuilderParameters {
227233
public init(_ buildParameters: BuildParameters) {
228234
self.init(
229235
enableTestability: buildParameters.enableTestability,
230-
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts
236+
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts,
237+
toolchainLibDir: buildParameters.toolchain.toolchainLibDir
231238
)
232239
}
233240
}

Tests/BuildTests/BuildPlanTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,7 @@ final class BuildPlanTests: XCTestCase {
11551155
"-Xlinker", "-install_name", "-Xlinker", "@rpath/libBar-Baz.dylib",
11561156
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
11571157
"@/path/to/build/debug/Bar-Baz.product/Objects.LinkFileList",
1158+
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
11581159
"-target", defaultTargetTriple,
11591160
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/Bar.swiftmodule"
11601161
])
@@ -1235,6 +1236,7 @@ final class BuildPlanTests: XCTestCase {
12351236
"-Xlinker", "-install_name", "-Xlinker", "@rpath/liblib.dylib",
12361237
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
12371238
"@/path/to/build/debug/lib.product/Objects.LinkFileList",
1239+
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
12381240
"-target", defaultTargetTriple,
12391241
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/lib.swiftmodule",
12401242
]

Tests/XCBuildSupportTests/PIFBuilderTests.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ class PIFBuilderTests: XCTestCase {
480480
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
481481
XCTAssertEqual(settings[.SWIFT_VERSION], "5")
482482
XCTAssertEqual(settings[.TARGET_NAME], "foo")
483+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
483484
}
484485
}
485486

@@ -503,6 +504,7 @@ class PIFBuilderTests: XCTestCase {
503504
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
504505
XCTAssertEqual(settings[.SWIFT_VERSION], "5")
505506
XCTAssertEqual(settings[.TARGET_NAME], "foo")
507+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
506508
}
507509
}
508510

@@ -539,6 +541,7 @@ class PIFBuilderTests: XCTestCase {
539541
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
540542
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
541543
XCTAssertEqual(settings[.TARGET_NAME], "cfoo")
544+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
542545
}
543546
}
544547

@@ -562,6 +565,7 @@ class PIFBuilderTests: XCTestCase {
562565
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
563566
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
564567
XCTAssertEqual(settings[.TARGET_NAME], "cfoo")
568+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
565569
}
566570
}
567571

@@ -598,6 +602,7 @@ class PIFBuilderTests: XCTestCase {
598602
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
599603
XCTAssertEqual(settings[.SWIFT_VERSION], "4.2")
600604
XCTAssertEqual(settings[.TARGET_NAME], "bar")
605+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
601606
}
602607
}
603608

@@ -618,6 +623,7 @@ class PIFBuilderTests: XCTestCase {
618623
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
619624
XCTAssertEqual(settings[.SWIFT_VERSION], "4.2")
620625
XCTAssertEqual(settings[.TARGET_NAME], "bar")
626+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
621627
}
622628
}
623629

@@ -653,6 +659,7 @@ class PIFBuilderTests: XCTestCase {
653659
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
654660
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
655661
XCTAssertEqual(settings[.TARGET_NAME], "cbar")
662+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
656663
}
657664
}
658665

@@ -675,6 +682,7 @@ class PIFBuilderTests: XCTestCase {
675682
XCTAssertEqual(settings[.SWIFT_FORCE_DYNAMIC_LINK_STDLIB], "YES")
676683
XCTAssertEqual(settings[.SWIFT_FORCE_STATIC_LINK_STDLIB], "NO")
677684
XCTAssertEqual(settings[.TARGET_NAME], "cbar")
685+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
678686
}
679687
}
680688

@@ -1086,6 +1094,7 @@ class PIFBuilderTests: XCTestCase {
10861094
XCTAssertEqual(settings[.SKIP_INSTALL], "NO")
10871095
XCTAssertEqual(settings[.TARGET_BUILD_DIR], "$(TARGET_BUILD_DIR)/PackageFrameworks")
10881096
XCTAssertEqual(settings[.TARGET_NAME], "BarLib")
1097+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
10891098
}
10901099
}
10911100

@@ -1109,6 +1118,7 @@ class PIFBuilderTests: XCTestCase {
11091118
XCTAssertEqual(settings[.TARGET_BUILD_DIR], "$(TARGET_BUILD_DIR)/PackageFrameworks")
11101119
XCTAssertEqual(settings[.TARGET_NAME], "BarLib")
11111120
XCTAssertEqual(settings[.USES_SWIFTPM_UNSAFE_FLAGS], "NO")
1121+
XCTAssertEqual(settings[.LIBRARY_SEARCH_PATHS], ["$(inherited)", "/toolchain/lib/swift/macosx"])
11121122
}
11131123
}
11141124

@@ -2295,7 +2305,8 @@ extension PIFBuilderParameters {
22952305
) -> Self {
22962306
PIFBuilderParameters(
22972307
enableTestability: false,
2298-
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts
2308+
shouldCreateDylibForDynamicProducts: shouldCreateDylibForDynamicProducts,
2309+
toolchainLibDir: AbsolutePath("/toolchain/lib")
22992310
)
23002311
}
23012312
}

0 commit comments

Comments
 (0)