cargo build --features nice

This commit is contained in:
R Tyler Croy 2023-05-27 15:12:52 -07:00
parent 5f9b57aacd
commit dc6324ddc3
1 changed files with 36 additions and 0 deletions

View File

@ -0,0 +1,36 @@
---
layout: post
title: "Requiring non-default features to be set in Rust"
tags:
- rust
---
I found myself refactoring a Rust crate in which I had two non-default features
but _at least one_ would need to be set in order for `cargo build` to function.
Cargo allows a `default` feature set, or allows different targets to have
[required-features](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-required-features-field)
defined. My use-case is different unfortunately, I wanted slightly different
semantics to support _either_ `s3` or `azure` features. I stopped by `##rust`
on [libera.chat](https://libera.chat) and as usually happens, got a nudge in
the right direction: `build.rs`:
By adding the following to `build.rs` I was able to forcefully halt the build
operation before it even really got started.
```rust
#[cfg(not(any(feature = "s3", feature = "azure")))]
compile_error!(
"Either the \"s3\" or the \"azure\" feature must be enabled to compile"
);
fn main() {}
```
Using the `compile_error!` macro in `build.rs` ensures that users will _only_
see the following compilation error message, rather than a long list of other
errors which may come from missing feature definitions.
Quick and easy trick to get required non-default features enabled!