// SPDX-License-Identifier: MIT //! Utils for s390-tools written in rust. //! Not intened to be used outside of s390-tools. //! //! Copyright IBM Corp. 2023 /// Get the s390-tools release string /// /// Provides the s390-tools release string. /// For release builds this reqquires the environment variable /// `S390_TOOLS_RELEASE` to be present at compile time. /// For debug builds this value defaults to `DEBUG_BUILD` /// if that variable is not present. /// Should only be used by binary targets!! /// /// Collapses to a compile time constant, that is likely to be inlined /// by the compiler in release builds. #[macro_export] macro_rules! release_string { () => {{ #[cfg(debug_assertions)] match option_env!("S390_TOOLS_RELEASE") { Some(ver) => ver, None => "DEBUG BUILD", } #[cfg(not(debug_assertions))] env!("S390_TOOLS_RELEASE", "env 'S390_TOOLS_RELEASE' must be set for release builds. Trigger build using the s390-tools build system or export the variable yourself") }}; } /// Asserts a constant expression evaluates to `true`. /// /// If the expression is not evaluated to `true` the compilation will fail. #[macro_export] macro_rules! static_assert { ($condition:expr) => { const _: () = core::assert!($condition); }; } /// Asserts that a type has a specific size. /// /// Useful to validate structs that are passed to C code. /// If the size has not the expected value the compilation will fail. /// /// # Example /// ```rust /// # use utils::assert_size; /// # fn main() {} /// #[repr(C)] /// struct c_struct { /// v: u64, /// } /// assert_size!(c_struct, 8); /// // assert_size!(c_struct, 7);//won't compile /// ``` #[macro_export] macro_rules! assert_size { ($t:ty, $sz:expr ) => { $crate::static_assert!(::std::mem::size_of::<$t>() == $sz); }; }