Skip to content

Commit 1d6565c

Browse files
authored
Swift SDKs: fix toolset.linker.path not passed to -ld-path (#7021)
This reverts commit 57d0a55 and PR #6939. Now that swiftlang/swift-driver#1447 and its 5.10 counterpart swiftlang/swift-driver#1454 were merged, we can reapply the fix for Swift SDKs linker metadata not being handled. Resolves rdar://117049947.
1 parent a9cbf5c commit 1d6565c

File tree

4 files changed

+37
-4
lines changed

4 files changed

+37
-4
lines changed

Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ extension LLBuildManifestBuilder {
8383
fileSystem: self.fileSystem,
8484
executor: executor
8585
)
86+
try driver.checkLDPathOption(commandLine: commandLine)
87+
8688
let jobs = try driver.planBuild()
8789
try self.addSwiftDriverJobs(
8890
for: target,
@@ -297,6 +299,8 @@ extension LLBuildManifestBuilder {
297299
externalTargetModuleDetailsMap: dependencyModuleDetailsMap,
298300
interModuleDependencyOracle: dependencyOracle
299301
)
302+
try driver.checkLDPathOption(commandLine: commandLine)
303+
300304
let jobs = try driver.planBuild()
301305
try self.addSwiftDriverJobs(
302306
for: targetDescription,
@@ -583,3 +587,13 @@ extension TypedVirtualPath {
583587
}
584588
}
585589
}
590+
591+
extension Driver {
592+
func checkLDPathOption(commandLine: [String]) throws {
593+
// `-ld-path` option is only available in recent versions of the compiler: rdar://117049947
594+
if let option = commandLine.first(where: { $0.hasPrefix("-ld-path") }),
595+
!self.supportedFrontendFeatures.contains("ld-path-driver-option") {
596+
throw LLBuildManifestBuilder.Error.ldPathDriverOptionUnavailable(option: option)
597+
}
598+
}
599+
}

Sources/Build/BuildManifest/LLBuildManifestBuilder.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@ import func TSCBasic.topologicalSort
3030

3131
/// High-level interface to ``LLBuildManifest`` and ``LLBuildManifestWriter``.
3232
public class LLBuildManifestBuilder {
33+
enum Error: Swift.Error {
34+
case ldPathDriverOptionUnavailable(option: String)
35+
36+
var description: String {
37+
switch self {
38+
case .ldPathDriverOptionUnavailable(let option):
39+
return "Unable to pass \(option), currently used version of `swiftc` doesn't support it."
40+
}
41+
}
42+
}
43+
3344
public enum TargetKind {
3445
case main
3546
case test

Sources/PackageModel/UserToolchain.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,11 @@ public final class UserToolchain: Toolchain {
349349
swiftSDK: SwiftSDK,
350350
environment: EnvironmentVariables
351351
) throws -> [String] {
352-
let swiftCompilerFlags = swiftSDK.toolset.knownTools[.swiftCompiler]?.extraCLIOptions ?? []
352+
var swiftCompilerFlags = swiftSDK.toolset.knownTools[.swiftCompiler]?.extraCLIOptions ?? []
353+
354+
if let linker = swiftSDK.toolset.knownTools[.linker]?.path {
355+
swiftCompilerFlags += ["-ld-path=\(linker)"]
356+
}
353357

354358
guard let sdkDir = swiftSDK.pathsConfiguration.sdkRootPath else {
355359
if triple.isWindows() {

Tests/BuildTests/BuildPlanTests.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3808,7 +3808,7 @@ final class BuildPlanTests: XCTestCase {
38083808
.cxxCompiler: .init(extraCLIOptions: [jsonFlag(tool: .cxxCompiler)]),
38093809
.swiftCompiler: .init(extraCLIOptions: [jsonFlag(tool: .swiftCompiler)]),
38103810
.librarian: .init(path: "/fake/toolchain/usr/bin/librarian"),
3811-
.linker: .init(extraCLIOptions: [jsonFlag(tool: .linker)]),
3811+
.linker: .init(path: "/fake/toolchain/usr/bin/linker", extraCLIOptions: [jsonFlag(tool: .linker)]),
38123812
],
38133813
rootPaths: try UserToolchain.default.swiftSDK.toolset.rootPaths)
38143814
let targetTriple = try Triple("armv7em-unknown-none-macho")
@@ -3889,7 +3889,9 @@ final class BuildPlanTests: XCTestCase {
38893889
// Compile Swift Target
38903890
let exeCompileArguments = try result.target(for: "exe").swiftTarget().compileArguments()
38913891
let exeCompileArgumentsPattern: [StringPattern] = [
3892-
jsonFlag(tool: .swiftCompiler), "-g", cliFlag(tool: .swiftCompiler),
3892+
jsonFlag(tool: .swiftCompiler),
3893+
"-ld-path=/fake/toolchain/usr/bin/linker",
3894+
"-g", cliFlag(tool: .swiftCompiler),
38933895
.anySequence,
38943896
"-Xcc", jsonFlag(tool: .cCompiler), "-Xcc", "-g", "-Xcc", cliFlag(tool: .cCompiler),
38953897
// TODO: Pass -Xcxx flags to swiftc (#6491)
@@ -3912,7 +3914,9 @@ final class BuildPlanTests: XCTestCase {
39123914
// Link Product
39133915
let exeLinkArguments = try result.buildProduct(for: "exe").linkArguments()
39143916
let exeLinkArgumentsPattern: [StringPattern] = [
3915-
jsonFlag(tool: .swiftCompiler), "-g", cliFlag(tool: .swiftCompiler),
3917+
jsonFlag(tool: .swiftCompiler),
3918+
"-ld-path=/fake/toolchain/usr/bin/linker",
3919+
"-g", cliFlag(tool: .swiftCompiler),
39163920
.anySequence,
39173921
"-Xlinker", jsonFlag(tool: .linker), "-Xlinker", cliFlag(tool: .linker),
39183922
]

0 commit comments

Comments
 (0)