use std::process::Command;
use std::sync::LazyLock;
use proc_macro::TokenStream;
use quote::quote;
use syn::Item;
use syn::parse_macro_input;
static NVCC_AVAILABLE: LazyLock<bool> = LazyLock::new(|| {
Command::new("nvcc")
.arg("--version")
.output()
.is_ok_and(|o| o.status.success())
});
#[proc_macro_attribute]
pub fn cuda_available(_attr: TokenStream, item: TokenStream) -> TokenStream {
if *NVCC_AVAILABLE {
item
} else {
TokenStream::new()
}
}
#[proc_macro_attribute]
pub fn cuda_not_available(_attr: TokenStream, item: TokenStream) -> TokenStream {
if *NVCC_AVAILABLE {
TokenStream::new()
} else {
item
}
}
#[proc_macro_attribute]
pub fn cuda_tests(_attr: TokenStream, item: TokenStream) -> TokenStream {
if *NVCC_AVAILABLE {
let item = parse_macro_input!(item as Item);
quote! {
#[cfg(test)]
#item
}
.into()
} else {
TokenStream::new()
}
}