1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
pub(crate) use std::collections::BTreeMap;
mod compiler;
mod error;
pub(crate) mod generate;
mod library;
pub mod manifest;
pub use compiler::Compiler;
pub use error::Error;
pub use generate::{Config, Generate, OCaml, Rust};
pub use library::Library;
pub use manifest::Manifest;
#[derive(Debug, serde::Deserialize, PartialEq, Eq, Clone, Copy)]
pub enum Backend {
#[serde(rename = "c")]
C,
#[serde(rename = "cuda")]
CUDA,
#[serde(rename = "opencl")]
OpenCL,
#[serde(rename = "multicore")]
Multicore,
#[serde(rename = "ispc")]
ISPC,
#[serde(rename = "python")]
Python,
#[serde(rename = "pyopencl")]
PyOpenCL,
}
impl Backend {
pub fn to_str(&self) -> &'static str {
match self {
Backend::C => "c",
Backend::CUDA => "cuda",
Backend::OpenCL => "opencl",
Backend::Multicore => "multicore",
Backend::ISPC => "ispc",
Backend::Python => "python",
Backend::PyOpenCL => "pyopencl",
}
}
pub fn required_c_libs(&self) -> &'static [&'static str] {
match self {
Backend::CUDA => &["cuda", "cudart", "nvrtc", "m"],
Backend::OpenCL => &["OpenCL", "m"],
Backend::Multicore => &["pthread", "m"],
_ => &[],
}
}
}
#[cfg(feature = "build")]
pub fn build(
backend: Backend,
src: impl AsRef<std::path::Path>,
dest: impl AsRef<std::path::Path>,
) {
let out = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap());
let dest = std::path::PathBuf::from(&out).join(dest);
let lib = Compiler::new(backend, src)
.with_output_dir(out)
.compile()
.expect("Compilation failed")
.expect("Unable to find manifest file");
let out = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()).join(dest);
let mut config = Config::new(out).expect("Unable to configure codegen");
let mut gen = config.detect().expect("Invalid output language");
gen.generate(&lib, &mut config)
.expect("Code generation failed");
lib.link();
}