https://github.com/embarkstudios/cfg-expr
A parser and evaluator for Rust cfg() expressions. Targets as of Rust 1.58.0 are supported.
https://github.com/embarkstudios/cfg-expr
rust
Last synced: about 1 year ago
JSON representation
A parser and evaluator for Rust cfg() expressions. Targets as of Rust 1.58.0 are supported.
- Host: GitHub
- URL: https://github.com/embarkstudios/cfg-expr
- Owner: EmbarkStudios
- License: apache-2.0
- Created: 2019-12-24T21:25:39.000Z (over 6 years ago)
- Default Branch: main
- Last Pushed: 2025-05-16T06:44:47.000Z (about 1 year ago)
- Last Synced: 2025-06-26T20:40:59.917Z (about 1 year ago)
- Topics: rust
- Language: Rust
- Homepage:
- Size: 344 KB
- Stars: 41
- Watchers: 4
- Forks: 17
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE-APACHE
- Code of conduct: CODE_OF_CONDUCT.md
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# `⚙️ cfg-expr`
**A parser and evaluator for Rust `cfg()` expressions. Builtin targets as of [1.87.0] are supported.**
[](https://github.com/EmbarkStudios/cfg-expr/actions?workflow=CI)
[](https://crates.io/crates/cfg-expr)
[](https://docs.rs/cfg-expr)
[](https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html)
[](https://forge.rust-lang.org/release/platform-support.html)
[](CODE_OF_CONDUCT.md)
[](https://embark.dev)
## Alternatives
- [cargo-platform](https://crates.io/crates/cargo-platform)
- [parse_cfg](https://crates.io/crates/parse_cfg)
## 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.87.0] that can be used to determine if a particular cfg expression is satisfiable.
```rust
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 rustc
let 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 requirements
assert!(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 predicate
assert!(!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 predicates
assert!(!specific.eval(|pred| {
match pred {
Predicate::Target(tp) => tp.matches(mac),
Predicate::TargetFeature(feat) => avail_target_feats.contains(feat),
_ => false,
}
}));
```
## Contributing
We welcome community contributions to this project.
Please read our [Contributor Guide](CONTRIBUTING.md) for more information on how to get started.
## License
Licensed under either of
- Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or )
- MIT license ([LICENSE-MIT](LICENSE-MIT) or )
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.
[1.87.0]: (https://forge.rust-lang.org/release/platform-support.html)