@@ -102,6 +102,18 @@ pub enum LinkerFlavor {
102
102
BpfLinker ,
103
103
}
104
104
105
+ #[ derive( Clone , Copy , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
106
+ pub enum LinkerFlavorCli {
107
+ Em ,
108
+ Gcc ,
109
+ L4Bender ,
110
+ Ld ,
111
+ Msvc ,
112
+ Lld ( LldFlavor ) ,
113
+ PtxLinker ,
114
+ BpfLinker ,
115
+ }
116
+
105
117
#[ derive( Clone , Copy , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
106
118
pub enum LldFlavor {
107
119
Wasm ,
@@ -137,14 +149,37 @@ impl ToJson for LldFlavor {
137
149
}
138
150
}
139
151
140
- impl ToJson for LinkerFlavor {
141
- fn to_json ( & self ) -> Json {
142
- self . desc ( ) . to_json ( )
152
+ impl LinkerFlavor {
153
+ pub fn from_cli ( cli : LinkerFlavorCli ) -> LinkerFlavor {
154
+ match cli {
155
+ LinkerFlavorCli :: Em => LinkerFlavor :: Em ,
156
+ LinkerFlavorCli :: Gcc => LinkerFlavor :: Gcc ,
157
+ LinkerFlavorCli :: L4Bender => LinkerFlavor :: L4Bender ,
158
+ LinkerFlavorCli :: Ld => LinkerFlavor :: Ld ,
159
+ LinkerFlavorCli :: Msvc => LinkerFlavor :: Msvc ,
160
+ LinkerFlavorCli :: Lld ( lld_flavor) => LinkerFlavor :: Lld ( lld_flavor) ,
161
+ LinkerFlavorCli :: PtxLinker => LinkerFlavor :: PtxLinker ,
162
+ LinkerFlavorCli :: BpfLinker => LinkerFlavor :: BpfLinker ,
163
+ }
164
+ }
165
+
166
+ fn to_cli ( self ) -> LinkerFlavorCli {
167
+ match self {
168
+ LinkerFlavor :: Em => LinkerFlavorCli :: Em ,
169
+ LinkerFlavor :: Gcc => LinkerFlavorCli :: Gcc ,
170
+ LinkerFlavor :: L4Bender => LinkerFlavorCli :: L4Bender ,
171
+ LinkerFlavor :: Ld => LinkerFlavorCli :: Ld ,
172
+ LinkerFlavor :: Msvc => LinkerFlavorCli :: Msvc ,
173
+ LinkerFlavor :: Lld ( lld_flavor) => LinkerFlavorCli :: Lld ( lld_flavor) ,
174
+ LinkerFlavor :: PtxLinker => LinkerFlavorCli :: PtxLinker ,
175
+ LinkerFlavor :: BpfLinker => LinkerFlavorCli :: BpfLinker ,
176
+ }
143
177
}
144
178
}
179
+
145
180
macro_rules! flavor_mappings {
146
181
( $( ( ( $( $flavor: tt) * ) , $string: expr) , ) * ) => (
147
- impl LinkerFlavor {
182
+ impl LinkerFlavorCli {
148
183
pub const fn one_of( ) -> & ' static str {
149
184
concat!( "one of: " , $( $string, " " , ) * )
150
185
}
@@ -166,17 +201,23 @@ macro_rules! flavor_mappings {
166
201
}
167
202
168
203
flavor_mappings ! {
169
- ( ( LinkerFlavor :: Em ) , "em" ) ,
170
- ( ( LinkerFlavor :: Gcc ) , "gcc" ) ,
171
- ( ( LinkerFlavor :: L4Bender ) , "l4-bender" ) ,
172
- ( ( LinkerFlavor :: Ld ) , "ld" ) ,
173
- ( ( LinkerFlavor :: Msvc ) , "msvc" ) ,
174
- ( ( LinkerFlavor :: PtxLinker ) , "ptx-linker" ) ,
175
- ( ( LinkerFlavor :: BpfLinker ) , "bpf-linker" ) ,
176
- ( ( LinkerFlavor :: Lld ( LldFlavor :: Wasm ) ) , "wasm-ld" ) ,
177
- ( ( LinkerFlavor :: Lld ( LldFlavor :: Ld64 ) ) , "ld64.lld" ) ,
178
- ( ( LinkerFlavor :: Lld ( LldFlavor :: Ld ) ) , "ld.lld" ) ,
179
- ( ( LinkerFlavor :: Lld ( LldFlavor :: Link ) ) , "lld-link" ) ,
204
+ ( ( LinkerFlavorCli :: Em ) , "em" ) ,
205
+ ( ( LinkerFlavorCli :: Gcc ) , "gcc" ) ,
206
+ ( ( LinkerFlavorCli :: L4Bender ) , "l4-bender" ) ,
207
+ ( ( LinkerFlavorCli :: Ld ) , "ld" ) ,
208
+ ( ( LinkerFlavorCli :: Msvc ) , "msvc" ) ,
209
+ ( ( LinkerFlavorCli :: PtxLinker ) , "ptx-linker" ) ,
210
+ ( ( LinkerFlavorCli :: BpfLinker ) , "bpf-linker" ) ,
211
+ ( ( LinkerFlavorCli :: Lld ( LldFlavor :: Wasm ) ) , "wasm-ld" ) ,
212
+ ( ( LinkerFlavorCli :: Lld ( LldFlavor :: Ld64 ) ) , "ld64.lld" ) ,
213
+ ( ( LinkerFlavorCli :: Lld ( LldFlavor :: Ld ) ) , "ld.lld" ) ,
214
+ ( ( LinkerFlavorCli :: Lld ( LldFlavor :: Link ) ) , "lld-link" ) ,
215
+ }
216
+
217
+ impl ToJson for LinkerFlavorCli {
218
+ fn to_json ( & self ) -> Json {
219
+ self . desc ( ) . to_json ( )
220
+ }
180
221
}
181
222
182
223
#[ derive( Clone , Copy , Debug , PartialEq , Hash , Encodable , Decodable , HashStable_Generic ) ]
@@ -467,6 +508,7 @@ impl fmt::Display for LinkOutputKind {
467
508
}
468
509
469
510
pub type LinkArgs = BTreeMap < LinkerFlavor , Vec < StaticCow < str > > > ;
511
+ pub type LinkArgsCli = BTreeMap < LinkerFlavorCli , Vec < StaticCow < str > > > ;
470
512
471
513
#[ derive( Clone , Copy , Hash , Debug , PartialEq , Eq ) ]
472
514
pub enum SplitDebuginfo {
@@ -1159,6 +1201,7 @@ pub struct TargetOptions {
1159
1201
/// Default linker flavor used if `-C linker-flavor` or `-C linker` are not passed
1160
1202
/// on the command line. Defaults to `LinkerFlavor::Gcc`.
1161
1203
pub linker_flavor : LinkerFlavor ,
1204
+ linker_flavor_json : LinkerFlavorCli ,
1162
1205
1163
1206
/// Linker to invoke
1164
1207
pub linker : Option < StaticCow < str > > ,
@@ -1169,6 +1212,7 @@ pub struct TargetOptions {
1169
1212
1170
1213
/// Linker arguments that are passed *before* any user-defined libraries.
1171
1214
pub pre_link_args : LinkArgs ,
1215
+ pre_link_args_json : LinkArgsCli ,
1172
1216
/// Objects to link before and after all other object code.
1173
1217
pub pre_link_objects : CrtObjects ,
1174
1218
pub post_link_objects : CrtObjects ,
@@ -1181,15 +1225,19 @@ pub struct TargetOptions {
1181
1225
/// user-defined but before post-link objects. Standard platform
1182
1226
/// libraries that should be always be linked to, usually go here.
1183
1227
pub late_link_args : LinkArgs ,
1228
+ late_link_args_json : LinkArgsCli ,
1184
1229
/// Linker arguments used in addition to `late_link_args` if at least one
1185
1230
/// Rust dependency is dynamically linked.
1186
1231
pub late_link_args_dynamic : LinkArgs ,
1232
+ late_link_args_dynamic_json : LinkArgsCli ,
1187
1233
/// Linker arguments used in addition to `late_link_args` if all Rust
1188
1234
/// dependencies are statically linked.
1189
1235
pub late_link_args_static : LinkArgs ,
1236
+ late_link_args_static_json : LinkArgsCli ,
1190
1237
/// Linker arguments that are unconditionally passed *after* any
1191
1238
/// user-defined libraries.
1192
1239
pub post_link_args : LinkArgs ,
1240
+ post_link_args_json : LinkArgsCli ,
1193
1241
/// Optional link script applied to `dylib` and `executable` crate types.
1194
1242
/// This is a string containing the script, not a path. Can only be applied
1195
1243
/// to linkers where `linker_is_gnu` is true.
@@ -1496,6 +1544,36 @@ impl TargetOptions {
1496
1544
fn add_post_link_args ( & mut self , flavor : LinkerFlavor , args : & [ & ' static str ] ) {
1497
1545
add_link_args ( & mut self . post_link_args , flavor, args) ;
1498
1546
}
1547
+
1548
+ fn update_from_cli ( & mut self ) {
1549
+ self . linker_flavor = LinkerFlavor :: from_cli ( self . linker_flavor_json ) ;
1550
+ for ( args, args_json) in [
1551
+ ( & mut self . pre_link_args , & self . pre_link_args_json ) ,
1552
+ ( & mut self . late_link_args , & self . late_link_args_json ) ,
1553
+ ( & mut self . late_link_args_dynamic , & self . late_link_args_dynamic_json ) ,
1554
+ ( & mut self . late_link_args_static , & self . late_link_args_static_json ) ,
1555
+ ( & mut self . post_link_args , & self . post_link_args_json ) ,
1556
+ ] {
1557
+ * args = args_json
1558
+ . iter ( )
1559
+ . map ( |( flavor, args) | ( LinkerFlavor :: from_cli ( * flavor) , args. clone ( ) ) )
1560
+ . collect ( ) ;
1561
+ }
1562
+ }
1563
+
1564
+ fn update_to_cli ( & mut self ) {
1565
+ self . linker_flavor_json = self . linker_flavor . to_cli ( ) ;
1566
+ for ( args, args_json) in [
1567
+ ( & self . pre_link_args , & mut self . pre_link_args_json ) ,
1568
+ ( & self . late_link_args , & mut self . late_link_args_json ) ,
1569
+ ( & self . late_link_args_dynamic , & mut self . late_link_args_dynamic_json ) ,
1570
+ ( & self . late_link_args_static , & mut self . late_link_args_static_json ) ,
1571
+ ( & self . post_link_args , & mut self . post_link_args_json ) ,
1572
+ ] {
1573
+ * args_json =
1574
+ args. iter ( ) . map ( |( flavor, args) | ( flavor. to_cli ( ) , args. clone ( ) ) ) . collect ( ) ;
1575
+ }
1576
+ }
1499
1577
}
1500
1578
1501
1579
impl Default for TargetOptions {
@@ -1511,10 +1589,13 @@ impl Default for TargetOptions {
1511
1589
abi : "" . into ( ) ,
1512
1590
vendor : "unknown" . into ( ) ,
1513
1591
linker_flavor : LinkerFlavor :: Gcc ,
1592
+ linker_flavor_json : LinkerFlavorCli :: Gcc ,
1514
1593
linker : option_env ! ( "CFG_DEFAULT_LINKER" ) . map ( |s| s. into ( ) ) ,
1515
1594
lld_flavor : LldFlavor :: Ld ,
1516
1595
pre_link_args : LinkArgs :: new ( ) ,
1596
+ pre_link_args_json : LinkArgsCli :: new ( ) ,
1517
1597
post_link_args : LinkArgs :: new ( ) ,
1598
+ post_link_args_json : LinkArgsCli :: new ( ) ,
1518
1599
link_script : None ,
1519
1600
asm_args : cvs ! [ ] ,
1520
1601
cpu : "generic" . into ( ) ,
@@ -1555,8 +1636,11 @@ impl Default for TargetOptions {
1555
1636
post_link_objects_self_contained : Default :: default ( ) ,
1556
1637
link_self_contained : LinkSelfContainedDefault :: False ,
1557
1638
late_link_args : LinkArgs :: new ( ) ,
1639
+ late_link_args_json : LinkArgsCli :: new ( ) ,
1558
1640
late_link_args_dynamic : LinkArgs :: new ( ) ,
1641
+ late_link_args_dynamic_json : LinkArgsCli :: new ( ) ,
1559
1642
late_link_args_static : LinkArgs :: new ( ) ,
1643
+ late_link_args_static_json : LinkArgsCli :: new ( ) ,
1560
1644
link_env : cvs ! [ ] ,
1561
1645
link_env_remove : cvs ! [ ] ,
1562
1646
archive_format : "gnu" . into ( ) ,
@@ -1926,13 +2010,13 @@ impl Target {
1926
2010
Some ( Ok ( ( ) ) )
1927
2011
} ) ) . unwrap_or( Ok ( ( ) ) )
1928
2012
} ) ;
1929
- ( $key_name: ident, LinkerFlavor ) => ( {
1930
- let name = ( stringify! ( $key_name ) ) . replace ( "_" , "-" ) ;
1931
- obj. remove( & name) . and_then( |o| o. as_str( ) . and_then( |s| {
1932
- match LinkerFlavor :: from_str( s) {
2013
+ ( $key_name: ident = $json_name : expr , LinkerFlavor ) => ( {
2014
+ let name = $json_name ;
2015
+ obj. remove( name) . and_then( |o| o. as_str( ) . and_then( |s| {
2016
+ match LinkerFlavorCli :: from_str( s) {
1933
2017
Some ( linker_flavor) => base. $key_name = linker_flavor,
1934
2018
_ => return Some ( Err ( format!( "'{}' is not a valid value for linker-flavor. \
1935
- Use {}", s, LinkerFlavor :: one_of( ) ) ) ) ,
2019
+ Use {}", s, LinkerFlavorCli :: one_of( ) ) ) ) ,
1936
2020
}
1937
2021
Some ( Ok ( ( ) ) )
1938
2022
} ) ) . unwrap_or( Ok ( ( ) ) )
@@ -2013,14 +2097,14 @@ impl Target {
2013
2097
base. $key_name = args;
2014
2098
}
2015
2099
} ) ;
2016
- ( $key_name: ident, link_args) => ( {
2017
- let name = ( stringify! ( $key_name ) ) . replace ( "_" , "-" ) ;
2018
- if let Some ( val) = obj. remove( & name) {
2100
+ ( $key_name: ident = $json_name : expr , link_args) => ( {
2101
+ let name = $json_name ;
2102
+ if let Some ( val) = obj. remove( name) {
2019
2103
let obj = val. as_object( ) . ok_or_else( || format!( "{}: expected a \
2020
2104
JSON object with fields per linker-flavor.", name) ) ?;
2021
- let mut args = LinkArgs :: new( ) ;
2105
+ let mut args = LinkArgsCli :: new( ) ;
2022
2106
for ( k, v) in obj {
2023
- let flavor = LinkerFlavor :: from_str( & k) . ok_or_else( || {
2107
+ let flavor = LinkerFlavorCli :: from_str( & k) . ok_or_else( || {
2024
2108
format!( "{}: '{}' is not a valid value for linker-flavor. \
2025
2109
Use 'em', 'gcc', 'ld' or 'msvc'", name, k)
2026
2110
} ) ?;
@@ -2106,19 +2190,19 @@ impl Target {
2106
2190
key ! ( env) ;
2107
2191
key ! ( abi) ;
2108
2192
key ! ( vendor) ;
2109
- key ! ( linker_flavor , LinkerFlavor ) ?;
2193
+ key ! ( linker_flavor_json = "linker-flavor" , LinkerFlavor ) ?;
2110
2194
key ! ( linker, optional) ;
2111
2195
key ! ( lld_flavor, LldFlavor ) ?;
2112
2196
key ! ( pre_link_objects = "pre-link-objects" , link_objects) ;
2113
2197
key ! ( post_link_objects = "post-link-objects" , link_objects) ;
2114
2198
key ! ( pre_link_objects_self_contained = "pre-link-objects-fallback" , link_objects) ;
2115
2199
key ! ( post_link_objects_self_contained = "post-link-objects-fallback" , link_objects) ;
2116
2200
key ! ( link_self_contained = "crt-objects-fallback" , link_self_contained) ?;
2117
- key ! ( pre_link_args , link_args) ;
2118
- key ! ( late_link_args , link_args) ;
2119
- key ! ( late_link_args_dynamic , link_args) ;
2120
- key ! ( late_link_args_static , link_args) ;
2121
- key ! ( post_link_args , link_args) ;
2201
+ key ! ( pre_link_args_json = "pre-link-args" , link_args) ;
2202
+ key ! ( late_link_args_json = "late-link-args" , link_args) ;
2203
+ key ! ( late_link_args_dynamic_json = "late-link-args-dynamic" , link_args) ;
2204
+ key ! ( late_link_args_static_json = "late-link-args-static" , link_args) ;
2205
+ key ! ( post_link_args_json = "post-link-args" , link_args) ;
2122
2206
key ! ( link_script, optional) ;
2123
2207
key ! ( link_env, env) ;
2124
2208
key ! ( link_env_remove, list) ;
@@ -2201,6 +2285,8 @@ impl Target {
2201
2285
// This can cause unfortunate ICEs later down the line.
2202
2286
return Err ( "may not set is_builtin for targets not built-in" . into ( ) ) ;
2203
2287
}
2288
+ base. update_from_cli ( ) ;
2289
+
2204
2290
// Each field should have been read using `Json::remove` so any keys remaining are unused.
2205
2291
let remaining_keys = obj. keys ( ) ;
2206
2292
Ok ( (
@@ -2292,42 +2378,44 @@ impl ToJson for Target {
2292
2378
fn to_json ( & self ) -> Json {
2293
2379
let mut d = serde_json:: Map :: new ( ) ;
2294
2380
let default: TargetOptions = Default :: default ( ) ;
2381
+ let mut target = self . clone ( ) ;
2382
+ target. update_to_cli ( ) ;
2295
2383
2296
2384
macro_rules! target_val {
2297
2385
( $attr: ident) => { {
2298
2386
let name = ( stringify!( $attr) ) . replace( "_" , "-" ) ;
2299
- d. insert( name, self . $attr. to_json( ) ) ;
2387
+ d. insert( name, target . $attr. to_json( ) ) ;
2300
2388
} } ;
2301
2389
}
2302
2390
2303
2391
macro_rules! target_option_val {
2304
2392
( $attr: ident) => { {
2305
2393
let name = ( stringify!( $attr) ) . replace( "_" , "-" ) ;
2306
- if default . $attr != self . $attr {
2307
- d. insert( name, self . $attr. to_json( ) ) ;
2394
+ if default . $attr != target . $attr {
2395
+ d. insert( name, target . $attr. to_json( ) ) ;
2308
2396
}
2309
2397
} } ;
2310
- ( $attr: ident, $key_name : expr) => { {
2311
- let name = $key_name ;
2312
- if default . $attr != self . $attr {
2313
- d. insert( name. into( ) , self . $attr. to_json( ) ) ;
2398
+ ( $attr: ident, $json_name : expr) => { {
2399
+ let name = $json_name ;
2400
+ if default . $attr != target . $attr {
2401
+ d. insert( name. into( ) , target . $attr. to_json( ) ) ;
2314
2402
}
2315
2403
} } ;
2316
- ( link_args - $attr: ident) => { {
2317
- let name = ( stringify! ( $attr ) ) . replace ( "_" , "-" ) ;
2318
- if default . $attr != self . $attr {
2319
- let obj = self
2404
+ ( link_args - $attr: ident, $json_name : expr ) => { {
2405
+ let name = $json_name ;
2406
+ if default . $attr != target . $attr {
2407
+ let obj = target
2320
2408
. $attr
2321
2409
. iter( )
2322
2410
. map( |( k, v) | ( k. desc( ) . to_string( ) , v. clone( ) ) )
2323
2411
. collect:: <BTreeMap <_, _>>( ) ;
2324
- d. insert( name, obj. to_json( ) ) ;
2412
+ d. insert( name. to_string ( ) , obj. to_json( ) ) ;
2325
2413
}
2326
2414
} } ;
2327
2415
( env - $attr: ident) => { {
2328
2416
let name = ( stringify!( $attr) ) . replace( "_" , "-" ) ;
2329
- if default . $attr != self . $attr {
2330
- let obj = self
2417
+ if default . $attr != target . $attr {
2418
+ let obj = target
2331
2419
. $attr
2332
2420
. iter( )
2333
2421
. map( |& ( ref k, ref v) | format!( "{k}={v}" ) )
@@ -2349,19 +2437,19 @@ impl ToJson for Target {
2349
2437
target_option_val ! ( env) ;
2350
2438
target_option_val ! ( abi) ;
2351
2439
target_option_val ! ( vendor) ;
2352
- target_option_val ! ( linker_flavor ) ;
2440
+ target_option_val ! ( linker_flavor_json , "linker-flavor" ) ;
2353
2441
target_option_val ! ( linker) ;
2354
2442
target_option_val ! ( lld_flavor) ;
2355
2443
target_option_val ! ( pre_link_objects) ;
2356
2444
target_option_val ! ( post_link_objects) ;
2357
2445
target_option_val ! ( pre_link_objects_self_contained, "pre-link-objects-fallback" ) ;
2358
2446
target_option_val ! ( post_link_objects_self_contained, "post-link-objects-fallback" ) ;
2359
2447
target_option_val ! ( link_self_contained, "crt-objects-fallback" ) ;
2360
- target_option_val ! ( link_args - pre_link_args ) ;
2361
- target_option_val ! ( link_args - late_link_args ) ;
2362
- target_option_val ! ( link_args - late_link_args_dynamic ) ;
2363
- target_option_val ! ( link_args - late_link_args_static ) ;
2364
- target_option_val ! ( link_args - post_link_args ) ;
2448
+ target_option_val ! ( link_args - pre_link_args_json , "pre-link-args" ) ;
2449
+ target_option_val ! ( link_args - late_link_args_json , "late-link-args" ) ;
2450
+ target_option_val ! ( link_args - late_link_args_dynamic_json , "late-link-args-dynamic" ) ;
2451
+ target_option_val ! ( link_args - late_link_args_static_json , "late-link-args-static" ) ;
2452
+ target_option_val ! ( link_args - post_link_args_json , "post-link-args" ) ;
2365
2453
target_option_val ! ( link_script) ;
2366
2454
target_option_val ! ( env - link_env) ;
2367
2455
target_option_val ! ( link_env_remove) ;
0 commit comments