at master 1.9 kB view raw
1diff --git a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift 2index a4a735f498..381522cc1f 100644 3--- a/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift 4+++ b/Sources/SwiftDriver/Jobs/GenericUnixToolchain+LinkerSupport.swift 5@@ -10,6 +10,7 @@ 6 // 7 //===----------------------------------------------------------------------===// 8 9+import Foundation 10 import SwiftOptions 11 12 import func TSCBasic.lookupExecutablePath 13@@ -120,7 +121,18 @@ 14 // just using `clang` and avoid a dependency on the C++ runtime. 15 let clangTool: Tool = 16 parsedOptions.hasArgument(.enableExperimentalCxxInterop) ? .clangxx : .clang 17- var clangPath = try getToolPath(clangTool) 18+ 19+ // For Nix, prefer linking using the wrapped Nixpkgs clang, instead of using 20+ // the unwrapped clang packaged with swift. The latter is unable to link, but 21+ // we still want to use it for other purposes (clang importer). 22+ var clangPath: AbsolutePath 23+ if let binPath = try? AbsolutePath(validating: "@clang@/bin"), 24+ let tool = lookupExecutablePath(filename: parsedOptions.hasArgument(.enableExperimentalCxxInterop) 25+ ? "clang++" : "clang", 26+ searchPaths: [binPath]) { 27+ clangPath = tool 28+ } else { 29+ clangPath = try getToolPath(clangTool) 30 if let toolsDirPath = parsedOptions.getLastArgument(.toolsDirectory) { 31 // FIXME: What if this isn't an absolute path? 32 let toolsDir = try AbsolutePath(validating: toolsDirPath.asSingle) 33@@ -136,6 +148,7 @@ 34 commandLine.appendFlag("-B") 35 commandLine.appendPath(toolsDir) 36 } 37+ } // Nix 38 39 // Executables on Linux get -pie 40 if targetTriple.os == .linux && linkerOutputType == .executable {