@@ -123,8 +123,10 @@ public final class DarwinToolchain: Toolchain {
123
123
124
124
public enum ToolchainValidationError : Error , DiagnosticData {
125
125
case osVersionBelowMinimumDeploymentTarget( String )
126
+ case argumentNotSupported( String )
126
127
case iOSVersionAboveMaximumDeploymentTarget( Int )
127
128
case unsupportedTargetVariant( variant: Triple )
129
+ case darwinOnlySupportsLibCxx
128
130
129
131
public var description : String {
130
132
switch self {
@@ -134,24 +136,38 @@ public final class DarwinToolchain: Toolchain {
134
136
return " iOS \( version) does not support 32-bit programs "
135
137
case . unsupportedTargetVariant( variant: let variant) :
136
138
return " unsupported ' \( variant. isiOS ? " -target " : " -target-variant " ) ' value ' \( variant) '; use 'ios-macabi' instead "
139
+ case . argumentNotSupported( let argument) :
140
+ return " \( argument) is no longer supported for Apple platforms "
141
+ case . darwinOnlySupportsLibCxx:
142
+ return " The only C++ standard library supported on Apple platforms is libc++ "
137
143
}
138
144
}
139
145
}
140
146
141
147
public func validateArgs( _ parsedOptions: inout ParsedOptions ,
142
148
targetTriple: Triple ,
143
- targetVariantTriple: Triple ? ) throws {
144
- // TODO: Validating arclite library path when link-objc-runtime.
145
-
149
+ targetVariantTriple: Triple ? ,
150
+ diagnosticsEngine: DiagnosticsEngine ) throws {
151
+ // Validating arclite library path when link-objc-runtime.
152
+ validateLinkObjcRuntimeARCLiteLib ( & parsedOptions,
153
+ targetTriple: targetTriple,
154
+ diagnosticsEngine: diagnosticsEngine)
146
155
// Validating apple platforms deployment targets.
147
156
try validateDeploymentTarget ( & parsedOptions, targetTriple: targetTriple)
148
157
if let targetVariantTriple = targetVariantTriple,
149
158
!targetTriple. isValidForZipperingWithTriple ( targetVariantTriple) {
150
159
throw ToolchainValidationError . unsupportedTargetVariant ( variant: targetVariantTriple)
151
160
}
152
-
153
- // TODO: Validating darwin unsupported -static-stdlib argument.
154
- // TODO: If a C++ standard library is specified, it has to be libc++.
161
+ // Validating darwin unsupported -static-stdlib argument.
162
+ if parsedOptions. hasArgument ( . staticStdlib) {
163
+ throw ToolchainValidationError . argumentNotSupported ( " -static-stdlib " )
164
+ }
165
+ // If a C++ standard library is specified, it has to be libc++.
166
+ if let cxxLib = parsedOptions. getLastArgument ( . experimentalCxxStdlib) {
167
+ if cxxLib. asSingle != " libc++ " {
168
+ throw ToolchainValidationError . darwinOnlySupportsLibCxx
169
+ }
170
+ }
155
171
}
156
172
157
173
func validateDeploymentTarget( _ parsedOptions: inout ParsedOptions ,
@@ -178,4 +194,24 @@ public final class DarwinToolchain: Toolchain {
178
194
throw ToolchainValidationError . osVersionBelowMinimumDeploymentTarget ( " watchOS 2.0 " )
179
195
}
180
196
}
197
+
198
+ func validateLinkObjcRuntimeARCLiteLib( _ parsedOptions: inout ParsedOptions ,
199
+ targetTriple: Triple ,
200
+ diagnosticsEngine: DiagnosticsEngine ) {
201
+ if parsedOptions. hasFlag ( positive: . linkObjcRuntime, negative: . noLinkObjcRuntime, default: targetTriple. supports ( . compatibleObjCRuntime) ) {
202
+ guard let _ = try ? findARCLiteLibPath ( ) else {
203
+ diagnosticsEngine. emit ( . warn_arclite_not_found_when_link_objc_runtime)
204
+ return
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+ extension Diagnostic . Message {
211
+ static var warn_arclite_not_found_when_link_objc_runtime : Diagnostic . Message {
212
+ . warning(
213
+ " unable to find Objective-C runtime support library 'arclite'; " +
214
+ " pass '-no-link-objc-runtime' to silence this warning "
215
+ )
216
+ }
181
217
}
0 commit comments