Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a compile_error!() when central crate features clash #110

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
11 changes: 9 additions & 2 deletions src/lib.rs
onkoe marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,19 @@
//!
//! Have a look at the examples to learn more about device and buffer management.

#[cfg(feature = "v4l-sys")]
#[cfg(all(feature = "libv4l", feature = "v4l2"))]
compile_error!("You may not enable both `v4l-sys` and `v4l2-sys` features at the same time. Try disabling one of them. If you only specified one feature, you may wish to add `default-features = false` as a dependency key.");

#[cfg(all(feature = "libv4l", not(feature = "v4l2")))]
pub use v4l_sys;

#[cfg(feature = "v4l2-sys")]
#[cfg(all(feature = "v4l2", not(feature = "libv4l")))]
pub use v4l2_sys as v4l_sys;

// calms down rust-analyzer when `rust-analyzer.cargo.features = "all"`
onkoe marked this conversation as resolved.
Show resolved Hide resolved
#[cfg(all(feature = "v4l2", feature = "libv4l"))]
pub use v4l_sys;
Comment on lines +86 to +87
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not do what you've done in the second patch (but the other way around):

  1. Remove these two lines;
  2. Change the above to:
    -#[cfg(all(feature = "libv4l", not(feature = "v4l2")))]
    +#[cfg(feature = "v4l2")]
     pub use v4l2_sys as v4l_sys;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would also prefer this, but I found that doing so breaks one of the features.

On the other hand, it doesn't occur in api.rs since we're not already re-exporting one of its modules. If you find a way to do it, though, please let me know!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would match the choice in api.rs to prefer v4l2 code in the case that both features are contemporarily enabled, but it is less of an issue now that the comment has been removed.

Either way, this seems better to me:

diff --git a/src/lib.rs b/src/lib.rs
index 2272aeb..1237262 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -74,16 +74,12 @@ compile_error!(
     add `default-features = false` as a dependency key."
 );

-#[cfg(all(feature = "libv4l", not(feature = "v4l2")))]
-pub use v4l_sys;
-
-#[cfg(all(feature = "v4l2", not(feature = "libv4l")))]
-pub use v4l2_sys as v4l_sys;
-
-// calms down rust-analyzer when `rust-analyzer.cargo.features = "all"`,
-// though the `compile_error!()` above prevents this from being a valid,
+// calm down rust-analyzer when `rust-analyzer.cargo.features = "all"` by having only one `v4l_sys`
+// crate in scope, even though the `compile_error!()` above prevents this from being a valid,
 // compilable configuration.
-#[cfg(all(feature = "v4l2", feature = "libv4l"))]
+#[cfg(feature = "v4l2")]
+pub use v4l2_sys as v4l_sys;
+#[cfg(all(feature = "libv4l", not(feature = "v4l2")))]
 pub use v4l_sys;

 pub mod v4l2;


pub mod v4l2;

pub mod buffer;
Expand Down