1
1
use std:: env;
2
2
use std:: ffi:: OsString ;
3
- use std:: fmt:: { Display , from_fn} ;
4
- use std:: num:: ParseIntError ;
3
+ use std:: str:: FromStr ;
5
4
use std:: path:: PathBuf ;
6
5
use std:: process:: Command ;
7
6
8
7
use itertools:: Itertools ;
9
8
use rustc_middle:: middle:: exported_symbols:: SymbolExportKind ;
10
9
use rustc_session:: Session ;
11
10
use rustc_target:: spec:: Target ;
11
+ pub ( super ) use rustc_target:: spec:: apple:: OSVersion ;
12
12
use tracing:: debug;
13
13
14
14
use crate :: errors:: { AppleDeploymentTarget , XcrunError , XcrunSdkPathWarning } ;
@@ -134,76 +134,6 @@ pub(super) fn add_data_and_relocation(
134
134
Ok ( ( ) )
135
135
}
136
136
137
- /// Deployment target or SDK version.
138
- ///
139
- /// The size of the numbers in here are limited by Mach-O's `LC_BUILD_VERSION`.
140
- type OSVersion = ( u16 , u8 , u8 ) ;
141
-
142
- /// Parse an OS version triple (SDK version or deployment target).
143
- fn parse_version ( version : & str ) -> Result < OSVersion , ParseIntError > {
144
- if let Some ( ( major, minor) ) = version. split_once ( '.' ) {
145
- let major = major. parse ( ) ?;
146
- if let Some ( ( minor, patch) ) = minor. split_once ( '.' ) {
147
- Ok ( ( major, minor. parse ( ) ?, patch. parse ( ) ?) )
148
- } else {
149
- Ok ( ( major, minor. parse ( ) ?, 0 ) )
150
- }
151
- } else {
152
- Ok ( ( version. parse ( ) ?, 0 , 0 ) )
153
- }
154
- }
155
-
156
- pub fn pretty_version ( version : OSVersion ) -> impl Display {
157
- let ( major, minor, patch) = version;
158
- from_fn ( move |f| {
159
- write ! ( f, "{major}.{minor}" ) ?;
160
- if patch != 0 {
161
- write ! ( f, ".{patch}" ) ?;
162
- }
163
- Ok ( ( ) )
164
- } )
165
- }
166
-
167
- /// Minimum operating system versions currently supported by `rustc`.
168
- fn os_minimum_deployment_target ( os : & str ) -> OSVersion {
169
- // When bumping a version in here, remember to update the platform-support docs too.
170
- //
171
- // NOTE: The defaults may change in future `rustc` versions, so if you are looking for the
172
- // default deployment target, prefer:
173
- // ```
174
- // $ rustc --print deployment-target
175
- // ```
176
- match os {
177
- "macos" => ( 10 , 12 , 0 ) ,
178
- "ios" => ( 10 , 0 , 0 ) ,
179
- "tvos" => ( 10 , 0 , 0 ) ,
180
- "watchos" => ( 5 , 0 , 0 ) ,
181
- "visionos" => ( 1 , 0 , 0 ) ,
182
- _ => unreachable ! ( "tried to get deployment target for non-Apple platform" ) ,
183
- }
184
- }
185
-
186
- /// The deployment target for the given target.
187
- ///
188
- /// This is similar to `os_minimum_deployment_target`, except that on certain targets it makes sense
189
- /// to raise the minimum OS version.
190
- ///
191
- /// This matches what LLVM does, see in part:
192
- /// <https://github.com/llvm/llvm-project/blob/llvmorg-18.1.8/llvm/lib/TargetParser/Triple.cpp#L1900-L1932>
193
- fn minimum_deployment_target ( target : & Target ) -> OSVersion {
194
- match ( & * target. os , & * target. arch , & * target. abi ) {
195
- ( "macos" , "aarch64" , _) => ( 11 , 0 , 0 ) ,
196
- ( "ios" , "aarch64" , "macabi" ) => ( 14 , 0 , 0 ) ,
197
- ( "ios" , "aarch64" , "sim" ) => ( 14 , 0 , 0 ) ,
198
- ( "ios" , _, _) if target. llvm_target . starts_with ( "arm64e" ) => ( 14 , 0 , 0 ) ,
199
- // Mac Catalyst defaults to 13.1 in Clang.
200
- ( "ios" , _, "macabi" ) => ( 13 , 1 , 0 ) ,
201
- ( "tvos" , "aarch64" , "sim" ) => ( 14 , 0 , 0 ) ,
202
- ( "watchos" , "aarch64" , "sim" ) => ( 7 , 0 , 0 ) ,
203
- ( os, _, _) => os_minimum_deployment_target ( os) ,
204
- }
205
- }
206
-
207
137
/// Name of the environment variable used to fetch the deployment target on the given OS.
208
138
pub fn deployment_target_env_var ( os : & str ) -> & ' static str {
209
139
match os {
@@ -219,22 +149,22 @@ pub fn deployment_target_env_var(os: &str) -> &'static str {
219
149
/// Get the deployment target based on the standard environment variables, or fall back to the
220
150
/// minimum version supported by `rustc`.
221
151
pub fn deployment_target ( sess : & Session ) -> OSVersion {
222
- let min = minimum_deployment_target ( & sess. target ) ;
152
+ let min = OSVersion :: minimum_deployment_target ( & sess. target ) ;
223
153
let env_var = deployment_target_env_var ( & sess. target . os ) ;
224
154
225
155
if let Ok ( deployment_target) = env:: var ( env_var) {
226
- match parse_version ( & deployment_target) {
156
+ match OSVersion :: from_str ( & deployment_target) {
227
157
Ok ( version) => {
228
- let os_min = os_minimum_deployment_target ( & sess. target . os ) ;
158
+ let os_min = OSVersion :: os_minimum_deployment_target ( & sess. target . os ) ;
229
159
// It is common that the deployment target is set a bit too low, for example on
230
160
// macOS Aarch64 to also target older x86_64. So we only want to warn when variable
231
161
// is lower than the minimum OS supported by rustc, not when the variable is lower
232
162
// than the minimum for a specific target.
233
163
if version < os_min {
234
164
sess. dcx ( ) . emit_warn ( AppleDeploymentTarget :: TooLow {
235
165
env_var,
236
- version : pretty_version ( version) . to_string ( ) ,
237
- os_min : pretty_version ( os_min) . to_string ( ) ,
166
+ version : version. fmt_pretty ( ) . to_string ( ) ,
167
+ os_min : os_min. fmt_pretty ( ) . to_string ( ) ,
238
168
} ) ;
239
169
}
240
170
@@ -263,18 +193,17 @@ pub(super) fn add_version_to_llvm_target(
263
193
let environment = components. next ( ) ;
264
194
assert_eq ! ( components. next( ) , None , "too many LLVM triple components" ) ;
265
195
266
- let ( major, minor, patch) = deployment_target;
267
-
268
196
assert ! (
269
197
!os. contains( |c: char | c. is_ascii_digit( ) ) ,
270
198
"LLVM target must not already be versioned"
271
199
) ;
272
200
201
+ let version = deployment_target. fmt_full ( ) ;
273
202
if let Some ( env) = environment {
274
203
// Insert version into OS, before environment
275
- format ! ( "{arch}-{vendor}-{os}{major}.{minor}.{patch }-{env}" )
204
+ format ! ( "{arch}-{vendor}-{os}{version }-{env}" )
276
205
} else {
277
- format ! ( "{arch}-{vendor}-{os}{major}.{minor}.{patch }" )
206
+ format ! ( "{arch}-{vendor}-{os}{version }" )
278
207
}
279
208
}
280
209
0 commit comments