1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
#![warn(clippy::all)] #![warn(rust_2018_idioms)] //! cfg-expr is a crate that can be used to parse and evaluate Rust cfg() expressions, //! both as declarable in Rust code itself, as well in cargo's `[target.'cfg()'.dependencies]` sections. //! //! It contains a list of all builtin targets known to rustc as of 1.40 that can be used //! to determine if a particular cfg expression is satisfiable. //! //! ``` //! use cfg_expr::{targets::get_target_by_triple, Expression, Predicate}; //! //! let specific = Expression::parse( //! r#"all( //! target_os = "windows", //! target_arch = "x86", //! windows, //! target_env = "msvc", //! target_feature = "fxsr", //! target_feature = "sse", //! target_feature = "sse2", //! target_pointer_width = "32", //! target_endian = "little", //! not(target_vendor = "uwp"), //! feature = "cool_thing", //! )"#, //! ) //! .unwrap(); //! //! // cfg_expr includes a list of every builtin target in rustc (as of 1.40) //! let x86_win = get_target_by_triple("i686-pc-windows-msvc").unwrap(); //! let x86_pentium_win = get_target_by_triple("i586-pc-windows-msvc").unwrap(); //! let uwp_win = get_target_by_triple("i686-uwp-windows-msvc").unwrap(); //! let mac = get_target_by_triple("x86_64-apple-darwin").unwrap(); //! //! let avail_targ_feats = ["fxsr", "sse", "sse2"]; //! //! // This will satisfy all requirements //! assert!(specific.eval(|pred| { //! match pred { //! Predicate::Target(tp) => tp.matches(x86_win), //! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat), //! Predicate::Feature(feat) => *feat == "cool_thing", //! _ => false, //! } //! })); //! //! // This won't, it doesnt' have the cool_thing feature! //! assert!(!specific.eval(|pred| { //! match pred { //! Predicate::Target(tp) => tp.matches(x86_pentium_win), //! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat), //! _ => false, //! } //! })); //! //! // This will *not* satisfy the vendor predicate //! assert!(!specific.eval(|pred| { //! match pred { //! Predicate::Target(tp) => tp.matches(uwp_win), //! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat), //! _ => false, //! } //! })); //! //! // This will *not* satisfy the vendor, os, or env predicates //! assert!(!specific.eval(|pred| { //! match pred { //! Predicate::Target(tp) => tp.matches(mac), //! Predicate::TargetFeature(feat) => avail_targ_feats.contains(feat), //! _ => false, //! } //! })); //! ``` /// Types related to parse errors pub mod error; /// Types related to cfg expressions pub mod expr; /// Types related to rustc targets pub mod targets; pub use error::ParseError; pub use expr::{Expression, Predicate, TargetPredicate};