1 use cfg_expr::{targets::get_builtin_target_by_triple, Expression, Predicate};
2
main()3 fn main() {
4 let specific = Expression::parse(
5 r#"all(
6 target_os = "windows",
7 target_arch = "x86",
8 windows,
9 target_env = "msvc",
10 target_feature = "fxsr",
11 target_feature = "sse",
12 target_feature = "sse2",
13 target_pointer_width = "32",
14 target_endian = "little",
15 not(target_vendor = "uwp"),
16 feature = "cool_thing",
17 )"#,
18 )
19 .unwrap();
20
21 // cfg_expr includes a list of every builtin target in rustc (as of 1.41)
22 let x86_win = get_builtin_target_by_triple("i686-pc-windows-msvc").unwrap();
23 let x86_pentium_win = get_builtin_target_by_triple("i586-pc-windows-msvc").unwrap();
24 let uwp_win = get_builtin_target_by_triple("i686-uwp-windows-msvc").unwrap();
25 let mac = get_builtin_target_by_triple("x86_64-apple-darwin").unwrap();
26
27 let avail_targ_feats = ["fxsr", "sse", "sse2"];
28
29 // This will satisfy all requirements
30 assert!(specific.eval(|pred| {
31 match pred {
32 Predicate::Target(tp) => tp.matches(x86_win),
33 Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
34 Predicate::Feature(feat) => *feat == "cool_thing",
35 _ => false,
36 }
37 }));
38
39 // This won't, it doesnt' have the cool_thing feature!
40 assert!(!specific.eval(|pred| {
41 match pred {
42 Predicate::Target(tp) => tp.matches(x86_pentium_win),
43 Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
44 _ => false,
45 }
46 }));
47
48 // This will *not* satisfy the vendor predicate
49 assert!(!specific.eval(|pred| {
50 match pred {
51 Predicate::Target(tp) => tp.matches(uwp_win),
52 Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
53 _ => false,
54 }
55 }));
56
57 // This will *not* satisfy the vendor, os, or env predicates
58 assert!(!specific.eval(|pred| {
59 match pred {
60 Predicate::Target(tp) => tp.matches(mac),
61 Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat),
62 _ => false,
63 }
64 }));
65 }
66