From 6da0f0cc084e7fc54ed39616c29252090f3e2889 Mon Sep 17 00:00:00 2001 From: Euan Harris Date: Mon, 18 Nov 2024 09:55:17 +0000 Subject: [PATCH] generator/linux: Use `--ldpath` linker flag for 5.9 Swift Package Manager's linker flag handling changed between 5.9 and 5.10. The flags which work for 5.9 cause linking failures 5.10 and later, and vice versa: https://github.com/swiftlang/swift-package-manager/issues/7222 This commit generates workaround flags for 5.9 and new-style flags for all other versions. The EndToEnd tests currently cannot run in CI, so this change was tested locally. (Issue #145) * The basic 'hello world' example generated by `swift package init` built succesfully with 5.9.2, 5.10.1 and 6.0.2 SDKs on x86_64 and aarch64. * A more complex example using Vapor built succesfully with 5.9.2, 5.10.1. 6.0.2 failed because of the CShims problem reported in Issue #138. --- .../SwiftSDKRecipes/LinuxRecipe.swift | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Sources/SwiftSDKGenerator/SwiftSDKRecipes/LinuxRecipe.swift b/Sources/SwiftSDKGenerator/SwiftSDKRecipes/LinuxRecipe.swift index f92c4b9..cb9c7e9 100644 --- a/Sources/SwiftSDKGenerator/SwiftSDKRecipes/LinuxRecipe.swift +++ b/Sources/SwiftSDKGenerator/SwiftSDKRecipes/LinuxRecipe.swift @@ -105,13 +105,20 @@ public struct LinuxRecipe: SwiftSDKRecipe { } public func applyPlatformOptions(toolset: inout Toolset, targetTriple: Triple) { - toolset.swiftCompiler = Toolset.ToolProperties(extraCLIOptions: [ - "-use-ld=lld", - "-Xlinker", - "-R/usr/lib/swift/linux/", - ]) + var swiftCompilerOptions = ["-Xlinker", "-R/usr/lib/swift/linux/"] + + // Swift 5.9 does not handle the `-use-ld` option properly: + // https://github.com/swiftlang/swift-package-manager/issues/7222 + if self.versionsConfiguration.swiftVersion.hasPrefix("5.9") { + swiftCompilerOptions += ["-Xclang-linker", "--ld-path=ld.lld"] + } else { + swiftCompilerOptions.append("-use-ld=lld") + toolset.linker = Toolset.ToolProperties(path: "ld.lld") + } + + toolset.swiftCompiler = Toolset.ToolProperties(extraCLIOptions: swiftCompilerOptions) + toolset.cxxCompiler = Toolset.ToolProperties(extraCLIOptions: ["-lstdc++"]) - toolset.linker = Toolset.ToolProperties(path: "ld.lld") toolset.librarian = Toolset.ToolProperties(path: "llvm-ar") }