Skip to content

Commit 8978aee

Browse files
committed
Propagate driver-specified clang-target flags even when no SDK is specified
1 parent 0e7cd69 commit 8978aee

File tree

1 file changed

+47
-41
lines changed

1 file changed

+47
-41
lines changed

Sources/SwiftDriver/Toolchains/DarwinToolchain.swift

+47-41
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,53 @@ public final class DarwinToolchain: Toolchain {
395395
driver: inout Driver,
396396
skipMacroOptions: Bool
397397
) throws {
398-
guard let sdkPath = frontendTargetInfo.sdkPath?.path,
399-
let sdkInfo = getTargetSDKInfo(sdkPath: sdkPath) else { return }
398+
let sdkPath = frontendTargetInfo.sdkPath?.path
399+
let sdkInfo: DarwinSDKInfo? = sdkPath != nil ? getTargetSDKInfo(sdkPath: sdkPath!) : nil
400+
401+
// Pass down -clang-target.
402+
// If not specified otherwise, we should use the same triple as -target
403+
if !driver.parsedOptions.hasArgument(.disableClangTarget) &&
404+
driver.isFrontendArgSupported(.clangTarget) &&
405+
driver.parsedOptions.contains(.driverExplicitModuleBuild) {
406+
// The common target triple for all Clang dependencies of this compilation,
407+
// both direct and transitive is computed as:
408+
// 1. An explicitly-specified `-clang-target` argument to this driver invocation
409+
// 2. (On Darwin) The target triple of the selected SDK
410+
var clangTargetTriple: String? = nil
411+
if let explicitClangTripleArg = driver.parsedOptions.getLastArgument(.clangTarget)?.asSingle {
412+
clangTargetTriple = explicitClangTripleArg
413+
} else if let sdkInfo = sdkInfo {
414+
let currentTriple = frontendTargetInfo.target.triple
415+
let sdkVersionedOSString = currentTriple.osNameUnversioned + sdkInfo.sdkVersion(for: currentTriple).sdkVersionString
416+
clangTargetTriple = currentTriple.triple.replacingOccurrences(of: currentTriple.osName, with: sdkVersionedOSString)
417+
}
418+
419+
if let clangTargetTriple {
420+
commandLine.appendFlag(.clangTarget)
421+
commandLine.appendFlag(clangTargetTriple)
422+
}
423+
424+
// Repeat the above for the '-target-variant' flag
425+
if driver.parsedOptions.contains(.targetVariant),
426+
driver.isFrontendArgSupported(.clangTargetVariant),
427+
let targetVariantTripleStr = frontendTargetInfo.targetVariant?.triple {
428+
var clangTargetVariantTriple: String? = nil
429+
if let explicitClangTargetVariantArg = driver.parsedOptions.getLastArgument(.clangTargetVariant)?.asSingle {
430+
clangTargetVariantTriple = explicitClangTargetVariantArg
431+
} else if let sdkInfo {
432+
let currentVariantTriple = targetVariantTripleStr
433+
let sdkVersionedOSSString = currentVariantTriple.osNameUnversioned + sdkInfo.sdkVersion(for: currentVariantTriple).sdkVersionString
434+
clangTargetVariantTriple = currentVariantTriple.triple.replacingOccurrences(of: currentVariantTriple.osName, with: sdkVersionedOSSString)
435+
}
436+
437+
if let clangTargetVariantTriple {
438+
commandLine.appendFlag(.clangTargetVariant)
439+
commandLine.appendFlag(clangTargetVariantTriple)
440+
}
441+
}
442+
}
443+
444+
guard let sdkPath, let sdkInfo else { return }
400445

401446
commandLine.append(.flag("-target-sdk-version"))
402447
commandLine.append(.flag(sdkInfo.sdkVersion(for: frontendTargetInfo.target.triple).sdkVersionString))
@@ -439,45 +484,6 @@ public final class DarwinToolchain: Toolchain {
439484
commandLine.appendPath(prebuiltModulesPath)
440485
}
441486

442-
// Pass down -clang-target.
443-
// If not specified otherwise, we should use the same triple as -target
444-
if !driver.parsedOptions.hasArgument(.disableClangTarget) &&
445-
driver.isFrontendArgSupported(.clangTarget) &&
446-
driver.parsedOptions.contains(.driverExplicitModuleBuild) {
447-
// The common target triple for all Clang dependencies of this compilation,
448-
// both direct and transitive is computed as:
449-
// 1. An explicitly-specified `-clang-target` argument to this driver invocation
450-
// 2. (On Darwin) The target triple of the selected SDK
451-
let clangTargetTriple: String
452-
if let explicitClangTripleArg = driver.parsedOptions.getLastArgument(.clangTarget)?.asSingle {
453-
clangTargetTriple = explicitClangTripleArg
454-
} else {
455-
let currentTriple = frontendTargetInfo.target.triple
456-
let sdkVersionedOSString = currentTriple.osNameUnversioned + sdkInfo.sdkVersion(for: currentTriple).sdkVersionString
457-
clangTargetTriple = currentTriple.triple.replacingOccurrences(of: currentTriple.osName, with: sdkVersionedOSString)
458-
}
459-
460-
commandLine.appendFlag(.clangTarget)
461-
commandLine.appendFlag(clangTargetTriple)
462-
463-
// Repeat the above for the '-target-variant' flag
464-
if driver.parsedOptions.contains(.targetVariant),
465-
driver.isFrontendArgSupported(.clangTargetVariant),
466-
let targetVariantTripleStr = frontendTargetInfo.targetVariant?.triple {
467-
let clangTargetVariantTriple: String
468-
if let explicitClangTargetVariantArg = driver.parsedOptions.getLastArgument(.clangTargetVariant)?.asSingle {
469-
clangTargetVariantTriple = explicitClangTargetVariantArg
470-
} else {
471-
let currentVariantTriple = targetVariantTripleStr
472-
let sdkVersionedOSSString = currentVariantTriple.osNameUnversioned + sdkInfo.sdkVersion(for: currentVariantTriple).sdkVersionString
473-
clangTargetVariantTriple = currentVariantTriple.triple.replacingOccurrences(of: currentVariantTriple.osName, with: sdkVersionedOSSString)
474-
}
475-
476-
commandLine.appendFlag(.clangTargetVariant)
477-
commandLine.appendFlag(clangTargetVariantTriple)
478-
}
479-
}
480-
481487
if driver.isFrontendArgSupported(.externalPluginPath) && !skipMacroOptions {
482488
// If the PLATFORM_DIR environment variable is set, also add plugin
483489
// paths into it. Since this is a user override, it comes beore the

0 commit comments

Comments
 (0)