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 manifests' [target.'cfg()'.dependencies]
sections.
It contains a list of all builtin targets known to rustc as of 1.72.0
that can be used to determine if a particular cfg expression is satisfiable.
```rust use cfgexpr::{targets::getbuiltintargetby_triple, Expression, Predicate};
let specific = Expression::parse( r#"all( targetos = "windows", targetarch = "x86", windows, targetenv = "msvc", targetfeature = "fxsr", targetfeature = "sse", targetfeature = "sse2", targetpointerwidth = "32", targetendian = "little", not(targetvendor = "uwp"), feature = "cool_thing", )"#, ).unwrap();
// cfgexpr includes a list of every builtin target in rustc let x86win = getbuiltintargetbytriple("i686-pc-windows-msvc").unwrap(); let x86pentiumwin = getbuiltintargetbytriple("i586-pc-windows-msvc").unwrap(); let uwpwin = getbuiltintargetbytriple("i686-uwp-windows-msvc").unwrap(); let mac = getbuiltintargetbytriple("x8664-apple-darwin").unwrap();
let availtargetfeats = ["fxsr", "sse", "sse2"];
// This will satisfy all requirements assert!(specific.eval(|pred| { match pred { Predicate::Target(tp) => tp.matches(x86win), Predicate::TargetFeature(feat) => availtargetfeats.contains(feat), Predicate::Feature(feat) => *feat == "coolthing", _ => false, } }));
// This won't, it doesn't have the coolthing feature! assert!(!specific.eval(|pred| { match pred { Predicate::Target(tp) => tp.matches(x86pentiumwin), Predicate::TargetFeature(feat) => availtarget_feats.contains(feat), _ => false, } }));
// This will not satisfy the vendor predicate assert!(!specific.eval(|pred| { match pred { Predicate::Target(tp) => tp.matches(uwpwin), Predicate::TargetFeature(feat) => availtarget_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) => availtargetfeats.contains(feat), _ => false, } })); ```
We welcome community contributions to this project.
Please read our Contributor Guide for more information on how to get started.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.