|
| 1 | +use std::str::FromStr; |
| 2 | + |
| 3 | +use crate::config::*; |
| 4 | +use rustc_target::spec::{LinkerFlavor, LldFlavor}; |
| 5 | + |
| 6 | +/// When adding enrichments to `-C linker-flavor`, we want to ensure the existing `rustc_target` |
| 7 | +/// `LinkerFlavor`s are still supported as-is: they are option values that can be used on |
| 8 | +/// stable. |
| 9 | +#[test] |
| 10 | +pub fn parse_well_known_linker_flavor() { |
| 11 | + // All `LinkerFlavor`s are wrapped as a whole, so there's no particular need to be |
| 12 | + // exhaustive here. |
| 13 | + assert_eq!(LinkerFlavorCli::from_str("gcc"), Ok(LinkerFlavorCli::WellKnown(LinkerFlavor::Gcc))); |
| 14 | + assert_eq!( |
| 15 | + LinkerFlavorCli::from_str("msvc"), |
| 16 | + Ok(LinkerFlavorCli::WellKnown(LinkerFlavor::Msvc)) |
| 17 | + ); |
| 18 | + assert_eq!( |
| 19 | + LinkerFlavorCli::from_str("bpf-linker"), |
| 20 | + Ok(LinkerFlavorCli::WellKnown(LinkerFlavor::BpfLinker)) |
| 21 | + ); |
| 22 | + assert_eq!( |
| 23 | + LinkerFlavorCli::from_str("lld-link"), |
| 24 | + Ok(LinkerFlavorCli::WellKnown(LinkerFlavor::Lld(LldFlavor::Link))) |
| 25 | + ); |
| 26 | + assert_eq!( |
| 27 | + LinkerFlavorCli::from_str("ld64.lld"), |
| 28 | + Ok(LinkerFlavorCli::WellKnown(LinkerFlavor::Lld(LldFlavor::Ld64))) |
| 29 | + ); |
| 30 | + |
| 31 | + // While other invalid values for well-known flavors are already errors |
| 32 | + assert_eq!(LinkerFlavorCli::from_str("unknown_linker"), Err(())); |
| 33 | +} |
| 34 | + |
| 35 | +/// Enrichments can currently allow for the `gcc` flavor to specify for a given linker to be |
| 36 | +/// used, much like you'd use `-fuse-ld` as a link arg. When using `-C |
| 37 | +/// linker-flavor=gcc:$linker`, the `$linker` will be passed directly to `cc`. |
| 38 | +#[test] |
| 39 | +pub fn parse_gcc_enrichment_linker_flavor() { |
| 40 | + assert_eq!( |
| 41 | + LinkerFlavorCli::from_str("gcc:lld"), |
| 42 | + Ok(LinkerFlavorCli::Gcc { use_ld: "lld".to_string() }) |
| 43 | + ); |
| 44 | + assert_eq!( |
| 45 | + LinkerFlavorCli::from_str("gcc:gold"), |
| 46 | + Ok(LinkerFlavorCli::Gcc { use_ld: "gold".to_string() }) |
| 47 | + ); |
| 48 | + |
| 49 | + // No linker actually mentioned |
| 50 | + assert_eq!(LinkerFlavorCli::from_str("gcc:"), Err(())); |
| 51 | + |
| 52 | + // Only one `gcc:` separator allowed |
| 53 | + assert_eq!(LinkerFlavorCli::from_str("gcc:gcc:"), Err(())); |
| 54 | + assert_eq!(LinkerFlavorCli::from_str("gcc:gcc:linker"), Err(())); |
| 55 | +} |
0 commit comments