@@ -127,17 +127,17 @@ impl Zig {
127
127
skip_next_arg = false ;
128
128
continue ;
129
129
}
130
- let arg = if arg. starts_with ( '@' ) && arg. ends_with ( "linker-arguments" ) {
131
- Some ( self . process_linker_response_file (
130
+ let args = if arg. starts_with ( '@' ) && arg. ends_with ( "linker-arguments" ) {
131
+ vec ! [ self . process_linker_response_file(
132
132
arg,
133
133
& rustc_ver,
134
134
& zig_version,
135
135
& target_info,
136
- ) ?)
136
+ ) ?]
137
137
} else {
138
138
self . filter_linker_arg ( arg, & rustc_ver, & zig_version, & target_info)
139
139
} ;
140
- if let Some ( arg) = arg {
140
+ for arg in args {
141
141
if arg == "-Wl,-exported_symbols_list" {
142
142
// Filter out this and the next argument
143
143
skip_next_arg = true ;
@@ -212,7 +212,7 @@ impl Zig {
212
212
} ;
213
213
let mut link_args: Vec < _ > = content
214
214
. split ( '\n' )
215
- . filter_map ( |arg| self . filter_linker_arg ( arg, & rustc_ver, & zig_version, & target_info) )
215
+ . flat_map ( |arg| self . filter_linker_arg ( arg, & rustc_ver, & zig_version, & target_info) )
216
216
. collect ( ) ;
217
217
if self . has_undefined_dynamic_lookup ( & link_args) {
218
218
link_args. push ( "-Wl,-undefined=dynamic_lookup" . to_string ( ) ) ;
@@ -242,35 +242,35 @@ impl Zig {
242
242
rustc_ver : & rustc_version:: Version ,
243
243
zig_version : & semver:: Version ,
244
244
target_info : & TargetInfo ,
245
- ) -> Option < String > {
245
+ ) -> Vec < String > {
246
246
if arg == "-lgcc_s" {
247
247
// Replace libgcc_s with libunwind
248
- return Some ( "-lunwind" . to_string ( ) ) ;
248
+ return vec ! [ "-lunwind" . to_string( ) ] ;
249
249
} else if arg. starts_with ( "--target=" ) {
250
250
// We have already passed target via `-target`
251
- return None ;
251
+ return vec ! [ ] ;
252
252
}
253
253
if ( target_info. is_arm || target_info. is_windows_gnu )
254
254
&& arg. ends_with ( ".rlib" )
255
255
&& arg. contains ( "libcompiler_builtins-" )
256
256
{
257
257
// compiler-builtins is duplicated with zig's compiler-rt
258
- return None ;
258
+ return vec ! [ ] ;
259
259
}
260
260
if target_info. is_windows_gnu {
261
261
#[ allow( clippy:: if_same_then_else) ]
262
262
if arg == "-lgcc_eh" {
263
263
// zig doesn't provide gcc_eh alternative
264
264
// We use libc++ to replace it on windows gnu targets
265
- return Some ( "-lc++" . to_string ( ) ) ;
265
+ return vec ! [ "-lc++" . to_string( ) ] ;
266
266
} else if arg == "-Wl,-Bdynamic" && ( zig_version. major , zig_version. minor ) >= ( 0 , 11 ) {
267
267
// https://github.com/ziglang/zig/pull/16058
268
268
// zig changes the linker behavior, -Bdynamic won't search *.a for mingw, but this may be fixed in the later version
269
269
// here is a workaround to replace the linker switch with -search_paths_first, which will search for *.dll,*lib first,
270
270
// then fallback to *.a
271
- return Some ( "-Wl,-search_paths_first" . to_owned ( ) ) ;
271
+ return vec ! [ "-Wl,-search_paths_first" . to_owned( ) ] ;
272
272
} else if arg == "-lwindows" || arg == "-l:libpthread.a" || arg == "-lgcc" {
273
- return None ;
273
+ return vec ! [ ] ;
274
274
} else if arg == "-Wl,--disable-auto-image-base"
275
275
|| arg == "-Wl,--dynamicbase"
276
276
|| arg == "-Wl,--large-address-aware"
@@ -281,22 +281,22 @@ impl Zig {
281
281
// https://github.com/rust-lang/rust/blob/2fb0e8d162a021f8a795fb603f5d8c0017855160/compiler/rustc_target/src/spec/windows_gnu_base.rs#L22
282
282
// https://github.com/rust-lang/rust/blob/f0bc76ac41a0a832c9ee621e31aaf1f515d3d6a5/compiler/rustc_target/src/spec/i686_pc_windows_gnu.rs#L16
283
283
// zig doesn't support --disable-auto-image-base, --dynamicbase and --large-address-aware
284
- return None ;
284
+ return vec ! [ ] ;
285
285
} else if arg == "-lmsvcrt" {
286
- return None ;
286
+ return vec ! [ ] ;
287
287
}
288
288
} else if arg == "-Wl,--no-undefined-version" {
289
289
// https://github.com/rust-lang/rust/blob/542ed2bf72b232b245ece058fc11aebb1ca507d7/compiler/rustc_codegen_ssa/src/back/linker.rs#L723
290
290
// zig doesn't support --no-undefined-version
291
- return None ;
291
+ return vec ! [ ] ;
292
292
}
293
293
if target_info. is_musl || target_info. is_ohos {
294
294
// Avoids duplicated symbols with both zig musl libc and the libc crate
295
295
if arg. ends_with ( ".o" ) && arg. contains ( "self-contained" ) && arg. contains ( "crt" ) {
296
- return None ;
296
+ return vec ! [ ] ;
297
297
} else if arg == "-Wl,-melf_i386" {
298
298
// unsupported linker arg: -melf_i386
299
- return None ;
299
+ return vec ! [ ] ;
300
300
}
301
301
if rustc_ver. major == 1
302
302
&& rustc_ver. minor < 59
@@ -305,51 +305,64 @@ impl Zig {
305
305
{
306
306
// Rust distributes standalone libc.a in self-contained for musl since 1.59.0
307
307
// See https://github.com/rust-lang/rust/pull/90527
308
- return None ;
308
+ return vec ! [ ] ;
309
309
}
310
310
if arg == "-lc" {
311
- return None ;
311
+ return vec ! [ ] ;
312
312
}
313
313
}
314
314
if arg. starts_with ( "-march=" ) {
315
315
// Ignore `-march` option for arm* targets, we use `generic` + cpu features instead
316
316
if target_info. is_arm || target_info. is_i386 {
317
- return None ;
317
+ return vec ! [ ] ;
318
318
} else if target_info. is_riscv64 {
319
- return Some ( "-march=generic_rv64" . to_string ( ) ) ;
319
+ return vec ! [ "-march=generic_rv64" . to_string( ) ] ;
320
320
} else if arg. starts_with ( "-march=armv8-a" ) {
321
- if target_info
321
+ let mut args_march = if target_info
322
322
. target
323
323
. as_ref ( )
324
324
. map ( |x| x. starts_with ( "aarch64-macos" ) )
325
325
. unwrap_or_default ( )
326
326
{
327
- return Some ( arg. replace ( "armv8-a" , "apple_m1" ) ) ;
327
+ vec ! [ arg. replace( "armv8-a" , "apple_m1" ) ]
328
328
} else if target_info
329
329
. target
330
330
. as_ref ( )
331
331
. map ( |x| x. starts_with ( "aarch64-linux" ) )
332
332
. unwrap_or_default ( )
333
333
{
334
- return Some (
335
- arg. replace ( "armv8-a" , "generic+v8a" )
336
- . replace ( "simd" , "neon" ) ,
337
- ) ;
334
+ vec ! [ arg
335
+ . replace( "armv8-a" , "generic+v8a" )
336
+ . replace( "simd" , "neon" ) ]
337
+ } else {
338
+ vec ! [ arg. to_string( ) ]
339
+ } ;
340
+ if arg == "-march=armv8-a+crypto" {
341
+ // Workaround for building sha1-asm on aarch64
342
+ // See:
343
+ // https://github.com/rust-cross/cargo-zigbuild/issues/149
344
+ // https://github.com/RustCrypto/asm-hashes/blob/master/sha1/build.rs#L17-L19
345
+ // https://github.com/ziglang/zig/issues/10411
346
+ args_march. append ( & mut vec ! [
347
+ "-Xassembler" . to_owned( ) ,
348
+ "-march=armv8-a+crypto" . to_owned( ) ,
349
+ ] ) ;
338
350
}
351
+ return args_march;
339
352
}
340
353
}
341
354
if target_info. is_macos {
342
355
if arg. starts_with ( "-Wl,-exported_symbols_list," ) {
343
356
// zig doesn't support -exported_symbols_list arg
344
357
// https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-exported_symbols_list
345
- return None ;
358
+ return vec ! [ ] ;
346
359
}
347
360
if arg == "-Wl,-dylib" {
348
361
// zig doesn't support -dylib
349
- return None ;
362
+ return vec ! [ ] ;
350
363
}
351
364
}
352
- Some ( arg. to_string ( ) )
365
+ vec ! [ arg. to_string( ) ]
353
366
}
354
367
355
368
fn has_undefined_dynamic_lookup ( & self , args : & [ String ] ) -> bool {
0 commit comments