1 /// Asserts that a given configuration is set. 2 /// 3 /// # Examples 4 /// 5 /// A project will simply fail to compile if the given configuration is not set. 6 /// 7 /// ``` 8 /// # #[macro_use] extern crate static_assertions; fn main() {} 9 /// // We're not masochists 10 /// # #[cfg(not(target_pointer_width = "16"))] // Just in case 11 /// assert_cfg!(not(target_pointer_width = "16")); 12 /// ``` 13 /// 14 /// If a project does not support a set of configurations, you may want to 15 /// report why. There is the option of providing a compile error message string: 16 /// 17 /// ``` 18 /// # #[macro_use] extern crate static_assertions; fn main() {} 19 /// # #[cfg(any(unix, windows))] 20 /// assert_cfg!(any(unix, windows), "There is only support for Unix or Windows"); 21 /// 22 /// // User needs to specify a database back-end 23 /// # #[cfg(target_pointer_width = "0")] // Impossible 24 /// assert_cfg!(all(not(all(feature = "mysql", feature = "mongodb")), 25 /// any( feature = "mysql", feature = "mongodb")), 26 /// "Must exclusively use MySQL or MongoDB as database back-end"); 27 /// ``` 28 /// 29 /// Some configurations are impossible. For example, we can't be compiling for 30 /// both macOS _and_ Windows simultaneously: 31 /// 32 /// ```compile_fail 33 /// # #[macro_use] extern crate static_assertions; fn main() {} 34 /// assert_cfg!(all(target_os = "macos", 35 /// target_os = "windows"), 36 /// "No, that's not how it works! ಠ_ಠ"); 37 /// ``` 38 #[macro_export] 39 macro_rules! assert_cfg { 40 () => {}; 41 ($($cfg:meta)+, $msg:expr $(,)?) => { 42 #[cfg(not($($cfg)+))] 43 compile_error!($msg); 44 }; 45 ($($cfg:tt)*) => { 46 #[cfg(not($($cfg)*))] 47 compile_error!(concat!("Cfg does not pass: ", stringify!($($cfg)*))); 48 }; 49 } 50