use std::{env, path::Path};
use risc0_build_kernel::{KernelBuild, KernelType};
fn main() {
build_cpu_kernels();
if env::var("CARGO_FEATURE_CUDA").is_ok() {
build_cuda_kernels();
}
if env::var("CARGO_CFG_TARGET_OS").is_ok_and(|os| os == "macos" || os == "ios") {
build_metal_kernels();
}
}
fn build_cpu_kernels() {
KernelBuild::new(KernelType::Cpp)
.files([
"cxx/ffi.cpp",
"cxx/poly_fp.cpp",
"cxx/step_compute_accum.cpp",
"cxx/step_exec.cpp",
"cxx/step_verify_accum.cpp",
"cxx/step_verify_bytes.cpp",
"cxx/step_verify_mem.cpp",
])
.compile("circuit");
}
fn build_cuda_kernels() {
KernelBuild::new(KernelType::Cuda)
.files([
"kernels/cuda/eval_check.cu",
"kernels/cuda/ffi.cu",
"kernels/cuda/ffi_supra.cu",
"kernels/cuda/step_compute_accum.cu",
"kernels/cuda/step_verify_accum.cu",
])
.deps(["kernels/cuda/kernels.h"])
.include(env::var("DEP_RISC0_SYS_CUDA_ROOT").unwrap())
.include(env::var("DEP_SPPARK_ROOT").unwrap())
.compile("risc0_recursion_cuda");
}
fn build_metal_kernels() {
const SRCS: &[&str] = &[
"eval_check.metal",
"step_compute_accum.metal",
"step_verify_accum.metal",
];
let dir = Path::new("kernels").join("metal");
let src_paths = SRCS.iter().map(|x| dir.join(x));
KernelBuild::new(KernelType::Metal)
.files(src_paths)
.compile("metal_kernel");
}