Crates.io | efg |
lib.rs | efg |
version | 0.1.4 |
source | src |
created_at | 2021-12-06 01:06:13.545436 |
updated_at | 2022-12-18 20:47:07.081728 |
description | Conditional compilation using boolean expression syntax, rather than any(), all(), not(). |
homepage | |
repository | https://github.com/dtolnay/efg |
max_upload_size | |
id | 492932 |
size | 36,814 |
Conditional compilation using boolean expression syntax, rather than any(), all(), not().
[dependencies]
efg = "0.1"
Rust's cfg
and cfg_attr
conditional compilation attributes use a restrictive
domain-specific language for specifying configuration predicates. The syntax is
described in the Conditional compilation page of the Rust reference. The
reason for this syntax as opposed to ordinary boolean expressions was to
accommodate restrictions that old versions of rustc used to have on the grammar
of attributes.
However, all restrictions on the attribute grammar were lifted in Rust 1.18.0 by
rust-lang/rust#40346. This crate explores implementing conditional compilation
using ordinary boolean expressions
instead: &&
, ||
, !
 as usual in Rust syntax.
#[cfg(any(thing1, thing2, …))] | #[efg(thing1 || thing2 || …)] |
#[cfg(all(thing1, thing2, …))] | #[efg(thing1 && thing2 && …)] |
#[cfg(not(thing))] | #[efg(!thing)] |
A real-world example from the quote
crate:
#[efg(feature "proc-macro" && !(target_arch "wasm32" && target_os "unknown"))]
extern crate proc_macro;
and from the proc-macro2
crate:
#[efg(super_unstable || feature "span-locations")]
pub fn start(&self) -> LineColumn {