# `⚙️ cfg-expr` **A parser and evaluator for Rust `cfg()` expressions. Targets as of [Rust 1.58.0](https://forge.rust-lang.org/release/platform-support.html) are supported.** [![Build Status](https://github.com/EmbarkStudios/cfg-expr/workflows/CI/badge.svg)](https://github.com/EmbarkStudios/cfg-expr/actions?workflow=CI) [![Crates.io](https://img.shields.io/crates/v/cfg-expr.svg)](https://crates.io/crates/cfg-expr) [![Docs](https://docs.rs/cfg-expr/badge.svg)](https://docs.rs/cfg-expr) [![Minimum Stable Rust Version](https://img.shields.io/badge/Rust%20MSRV-1.54.0-blue?color=fc8d62&logo=rust)](https://blog.rust-lang.org/2021/07/29/Rust-1.54.0.html) [![Rust Targets](https://img.shields.io/badge/Rust%20Targets-1.58.0-blue.svg)](https://forge.rust-lang.org/release/platform-support.html) [![Contributor Covenant](https://img.shields.io/badge/contributor%20covenant-v2.0%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) [![Embark](https://img.shields.io/badge/embark-open%20source-blueviolet.svg)](https://embark.dev)

Alternatives

Usage

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.58.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, } })); ```

Contributing

We welcome community contributions to this project.

Please read our Contributor Guide for more information on how to get started.

License

Licensed under either of

at your option.

Contribution

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.