Skip to content

Commit c5d7fe0

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
1 parent 4af60f7 commit c5d7fe0

File tree

5 files changed

+44
-12
lines changed

5 files changed

+44
-12
lines changed

Sources/Build/BuildPlan.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,13 +1254,17 @@ public final class ProductBuildDescription {
12541254

12551255
// Embed the swift stdlib library path inside tests and executables on Darwin.
12561256
if containsSwiftTargets {
1257+
let useStdlibRpath: Bool
12571258
switch product.type {
1258-
case .library, .plugin: break
1259-
case .test, .executable, .snippet:
1260-
if buildParameters.triple.isDarwin() {
1261-
let stdlib = buildParameters.toolchain.macosSwiftStdlib
1262-
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
1263-
}
1259+
case .library(let type):
1260+
useStdlibRpath = type == .dynamic
1261+
case .test, .executable, .snippet, .plugin:
1262+
useStdlibRpath = true
1263+
}
1264+
1265+
if useStdlibRpath && buildParameters.triple.isDarwin() {
1266+
let stdlib = buildParameters.toolchain.macosSwiftStdlib
1267+
args += ["-Xlinker", "-rpath", "-Xlinker", stdlib.pathString]
12641268
}
12651269
}
12661270

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 & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,14 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
153153

154154
// Generate a table of any overriding build settings.
155155
var settings: [String: String] = [:]
156+
// An error with determining the override should not be fatal here.
157+
settings["CC"] = try? buildParameters.toolchain.getClangCompiler().pathString
156158
// Always specify the path of the effective Swift compiler, which was determined in the same way as for the native build system.
157159
settings["SWIFT_EXEC"] = buildParameters.toolchain.swiftCompiler.pathString
158-
settings["LIBRARY_SEARCH_PATHS"] = "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)/swift/macosx"
160+
settings["LIBRARY_SEARCH_PATHS"] = "$(inherited) \(buildParameters.toolchain.toolchainLibDir.pathString)"
161+
settings["OTHER_CFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCCFlags.joined(separator: " "))"
162+
settings["OTHER_CPLUSPLUSFLAGS"] = "$(inherited) \(buildParameters.toolchain.extraCPPFlags.joined(separator: " "))"
163+
settings["OTHER_SWIFT_FLAGS"] = "$(inherited) \(buildParameters.toolchain.extraSwiftCFlags.joined(separator: " "))"
159164
// Optionally also set the list of architectures to build for.
160165
if !buildParameters.archs.isEmpty {
161166
settings["ARCHS"] = buildParameters.archs.joined(separator: " ")
@@ -164,7 +169,7 @@ public final class XcodeBuildSystem: SPMBuildCore.BuildSystem {
164169
// Generate the build parameters.
165170
let params = XCBBuildParameters(
166171
configurationName: buildParameters.configuration.xcbuildName,
167-
overrides: .init(commandLine: .init(table: settings)),
172+
overrides: .init(synthesized: .init(table: settings)),
168173
activeRunDestination: runDestination
169174
)
170175

@@ -226,7 +231,7 @@ struct XCBBuildParameters: Encodable {
226231
}
227232

228233
struct SettingsOverride: Encodable {
229-
var commandLine: XCBSettingsTable? = nil
234+
var synthesized: XCBSettingsTable? = nil
230235
}
231236

232237
var configurationName: String
@@ -247,7 +252,8 @@ extension PIFBuilderParameters {
247252
public init(_ buildParameters: BuildParameters) {
248253
self.init(
249254
enableTestability: buildParameters.enableTestability,
250-
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts
255+
shouldCreateDylibForDynamicProducts: buildParameters.shouldCreateDylibForDynamicProducts,
256+
toolchainLibDir: buildParameters.toolchain.toolchainLibDir
251257
)
252258
}
253259
}

Tests/BuildTests/BuildPlanTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,7 @@ final class BuildPlanTests: XCTestCase {
11561156
"-Xlinker", "-install_name", "-Xlinker", "@rpath/libBar-Baz.dylib",
11571157
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
11581158
"@/path/to/build/debug/Bar-Baz.product/Objects.LinkFileList",
1159+
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
11591160
"-target", defaultTargetTriple,
11601161
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/Bar.swiftmodule"
11611162
])
@@ -1236,6 +1237,7 @@ final class BuildPlanTests: XCTestCase {
12361237
"-Xlinker", "-install_name", "-Xlinker", "@rpath/liblib.dylib",
12371238
"-Xlinker", "-rpath", "-Xlinker", "@loader_path",
12381239
"@/path/to/build/debug/lib.product/Objects.LinkFileList",
1240+
"-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift/macosx",
12391241
"-target", defaultTargetTriple,
12401242
"-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/debug/lib.swiftmodule",
12411243
]

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)