Skip to content

Commit 72ed3ac

Browse files
committed
Add -gcc-toolchain flag to swift-driver
GCC toolchains are useful when cross-compiling to Linux with a given gcc toolchain. The gcc toolchain contains tools for linking, libraries for linking against, and the headers that map to those libraries. This patch adds a gcc-toolchain flag to the driver so that Swift can pass that down to both the clang importer and clang linker appropriately.
1 parent 679b324 commit 72ed3ac

File tree

4 files changed

+25
-0
lines changed

4 files changed

+25
-0
lines changed

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import class TSCBasic.LocalFileOutputByteStream
1414
import class TSCBasic.TerminalController
1515
import struct TSCBasic.RelativePath
16+
import struct TSCBasic.AbsolutePath
1617
import var TSCBasic.stderrStream
1718

1819
/// Whether we should produce color diagnostics by default.
@@ -141,6 +142,11 @@ extension Driver {
141142
try commandLine.appendAll(.F, .Fsystem, from: &parsedOptions)
142143
try commandLine.appendAll(.vfsoverlay, from: &parsedOptions)
143144

145+
if let gccToolchain = parsedOptions.getLastArgument(.gccToolchain) {
146+
commandLine.appendFlag(.Xcc)
147+
commandLine.appendFlag("--gcc-toolchain=\(gccToolchain.asSingle)")
148+
}
149+
144150
try commandLine.appendLast(.AssertConfig, from: &parsedOptions)
145151
try commandLine.appendLast(.autolinkForceLoad, from: &parsedOptions)
146152

Sources/SwiftDriver/Jobs/LinkJob.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ extension Driver {
5555
outputFile = try outputFileForImage
5656
}
5757

58+
if let gccToolchain = parsedOptions.getLastArgument(.gccToolchain) {
59+
commandLine.appendFlag(.XclangLinker)
60+
commandLine.appendFlag("--gcc-toolchain=\(gccToolchain.asSingle)")
61+
}
62+
5863
// Defer to the toolchain for platform-specific linking
5964
let linkTool = try toolchain.addPlatformSpecificLinkerArgs(
6065
to: &commandLine,

Sources/SwiftOptions/Options.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ extension Option {
435435
public static let Fsystem: Option = Option("-Fsystem", .separate, attributes: [.frontend, .argumentIsPath], helpText: "Add directory to system framework search path")
436436
public static let functionSections: Option = Option("-function-sections", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Emit functions to separate sections.")
437437
public static let F: Option = Option("-F", .joinedOrSeparate, attributes: [.frontend, .argumentIsPath], helpText: "Add directory to framework search path")
438+
public static let gccToolchain: Option = Option("-gcc-toolchain", .separate, attributes: [.helpHidden, .argumentIsPath], metaVar: "<path>", helpText: "Specify a directory where the clang importer and clang linker can find headers and libraries")
438439
public static let gdwarfTypes: Option = Option("-gdwarf-types", .flag, attributes: [.frontend], helpText: "Emit full DWARF type info.", group: .g)
439440
public static let generateEmptyBaseline: Option = Option("-generate-empty-baseline", .flag, attributes: [.noDriver], helpText: "Generate an empty baseline")
440441
public static let generateEmptyBaseline_: Option = Option("--generate-empty-baseline", .flag, alias: Option.generateEmptyBaseline, attributes: [.noDriver], helpText: "Generate an empty baseline")
@@ -1188,6 +1189,7 @@ extension Option {
11881189
Option.Fsystem,
11891190
Option.functionSections,
11901191
Option.F,
1192+
Option.gccToolchain,
11911193
Option.gdwarfTypes,
11921194
Option.generateEmptyBaseline,
11931195
Option.generateEmptyBaseline_,

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6650,6 +6650,18 @@ final class SwiftDriverTests: XCTestCase {
66506650
#endif
66516651
}
66526652

6653+
func testGccToolchainFlags() throws {
6654+
VirtualPath.resetTemporaryFileStore()
6655+
var driver = try Driver(args: [
6656+
"swiftc", "-gcc-toolchain", "foo/as/blarpy", "test.swift"
6657+
])
6658+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
6659+
XCTAssertEqual(jobs.count, 2)
6660+
let (compileJob, linkJob) = (jobs[0], jobs[1])
6661+
compileJob.commandLine.contains(.flag("--gcc-toolchain=foo/as/blarpy"))
6662+
linkJob.commandLine.contains(.flag("--gcc-toolchain=foo/as/blarpy"))
6663+
}
6664+
66536665
func testPluginPaths() throws {
66546666
var driver = try Driver(args: ["swiftc", "-typecheck", "foo.swift"])
66556667
guard driver.isFrontendArgSupported(.pluginPath) else {

0 commit comments

Comments
 (0)