diff --git a/Sources/PackageModel/UserToolchain.swift b/Sources/PackageModel/UserToolchain.swift index 7c264f82e39..93c3d18c611 100644 --- a/Sources/PackageModel/UserToolchain.swift +++ b/Sources/PackageModel/UserToolchain.swift @@ -172,9 +172,7 @@ public final class UserToolchain: Toolchain { } return "link" } - // TODO(compnerd) consider defaulting to `llvm-ar` universally with - // a fallback to `ar`. - return triple.isAndroid() ? "llvm-ar" : "ar" + return "llvm-ar" }() if let librarian = UserToolchain.lookup( @@ -190,7 +188,18 @@ public final class UserToolchain: Toolchain { if let librarian = try? UserToolchain.getTool(tool, binDirectories: binDirectories) { return librarian } - return try UserToolchain.findTool(tool, envSearchPaths: searchPaths, useXcrun: useXcrun) + if triple.isApple() || triple.isWindows() { + return try UserToolchain.findTool(tool, envSearchPaths: searchPaths, useXcrun: useXcrun) + } else { + if let librarian = try? UserToolchain.findTool(tool, envSearchPaths: searchPaths, useXcrun: false) { + return librarian + } + // Fall back to looking for binutils `ar` if `llvm-ar` can't be found. + if let librarian = try? UserToolchain.getTool("ar", binDirectories: binDirectories) { + return librarian + } + return try UserToolchain.findTool("ar", envSearchPaths: searchPaths, useXcrun: false) + } } /// Determines the Swift compiler paths for compilation and manifest parsing. diff --git a/Tests/BuildTests/BuildPlanTests.swift b/Tests/BuildTests/BuildPlanTests.swift index 7e3c256a4e9..402bd1aeb26 100644 --- a/Tests/BuildTests/BuildPlanTests.swift +++ b/Tests/BuildTests/BuildPlanTests.swift @@ -4244,7 +4244,7 @@ final class BuildPlanTests: XCTestCase { description: "Archiving \(buildPath.appending(components: "library.a").escapedPathString())" args: ["\(result.plan.buildParameters.toolchain.librarianPath.escapedPathString())","-static","-o","\(buildPath.appending(components: "library.a").escapedPathString())","@\(buildPath.appending(components: "rary.product", "Objects.LinkFileList").escapedPathString())"] """)) - } else { // assume Unix `ar` is the librarian + } else { // assume `llvm-ar` is the librarian XCTAssertMatch(contents, .contains(""" "C.rary-debug.a": tool: shell diff --git a/Tests/BuildTests/MockBuildTestHelper.swift b/Tests/BuildTests/MockBuildTestHelper.swift index e61f7da4dfc..6c918b045b4 100644 --- a/Tests/BuildTests/MockBuildTestHelper.swift +++ b/Tests/BuildTests/MockBuildTestHelper.swift @@ -22,10 +22,8 @@ struct MockToolchain: PackageModel.Toolchain { let librarianPath = AbsolutePath("/fake/path/to/link.exe") #elseif os(iOS) || os(macOS) || os(tvOS) || os(watchOS) let librarianPath = AbsolutePath("/fake/path/to/libtool") -#elseif os(Android) - let librarianPath = AbsolutePath("/fake/path/to/llvm-ar") #else - let librarianPath = AbsolutePath("/fake/path/to/ar") + let librarianPath = AbsolutePath("/fake/path/to/llvm-ar") #endif let swiftCompilerPath = AbsolutePath("/fake/path/to/swiftc") let includeSearchPaths = [AbsolutePath]()