A parser and evaluator for Rust cfg() expressions. Builtin targets as of 1.98.0 are supported.
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.98.0 that can be used to determine if a particular cfg expression is satisfiable.
use cfg_expr::{targets::get_builtin_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 rustclet x86_win = get_builtin_target_by_triple("i686-pc-windows-msvc").unwrap();let uwp_win = get_builtin_target_by_triple("i686-uwp-windows-msvc").unwrap();let mac = get_builtin_target_by_triple("x86_64-apple-darwin").unwrap();let avail_target_feats = ["fxsr","sse","sse2"];// This will satisfy all requirementsassert!(specific.eval(|pred| {match pred {Predicate::Target(tp) => tp.matches(x86_win),Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),Predicate::Feature(feat) => *feat == "cool_thing",
_ => false,}}));// This will *not* satisfy the vendor predicateassert!(!specific.eval(|pred| {match pred {Predicate::Target(tp) => tp.matches(uwp_win),Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
_ => false,}}));// This will *not* satisfy the vendor, os, or env predicatesassert!(!specific.eval(|pred| {match pred {Predicate::Target(tp) => tp.matches(mac),Predicate::TargetFeature(feat) => avail_target_feats.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
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/license/mit)
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.