futhark_bindgen/
package.rs1use crate::*;
2
3#[derive(Debug, Clone)]
5pub struct Package {
6 pub manifest: Manifest,
8
9 pub c_file: std::path::PathBuf,
11
12 pub h_file: std::path::PathBuf,
14
15 pub src: std::path::PathBuf,
17}
18
19impl Package {
20 #[cfg(feature = "build")]
21 fn build(&self, libname: &str) {
22 if self.manifest.backend == Backend::ISPC {
23 let kernels = self.c_file.with_extension("kernels.ispc");
24 let dest = kernels.with_extension("o");
25 std::process::Command::new("ispc")
26 .arg(&kernels)
27 .arg("-o")
28 .arg(&dest)
29 .arg("--pic")
30 .arg("--addressing=64")
31 .arg("--target=host")
32 .arg("-O3")
33 .status()
34 .expect("Unable to run ispc");
35
36 cc::Build::new()
37 .file(&self.c_file)
38 .object(&dest)
39 .flag("-fPIC")
40 .flag("-pthread")
41 .flag("-lm")
42 .flag("-std=c99")
43 .flag("-O3")
44 .extra_warnings(false)
45 .warnings(false)
46 .compile(libname);
47 } else {
48 cc::Build::new()
49 .flag("-std=c99")
50 .flag("-Wno-unused-parameter")
51 .flag("-O3")
52 .file(&self.c_file)
53 .extra_warnings(false)
54 .warnings(false)
55 .compile(libname);
56 }
57 }
58 #[cfg(feature = "build")]
62 pub fn link(&self) {
63 let project = std::env::var("CARGO_PKG_NAME").unwrap();
64 let name = format!("futhark_generate_{project}");
65 self.build(&name);
66
67 println!("cargo:rerun-if-changed={}", self.src.display());
68 println!("cargo:rustc-link-lib={name}");
69
70 let libs = self.manifest.backend.required_c_libs();
71
72 for lib in libs {
73 if cfg!(target_os = "macos") && lib == &"OpenCL" {
74 println!("cargo:rustc-link-lib=framework={}", lib);
75 } else {
76 println!("cargo:rustc-link-lib={}", lib);
77 }
78 }
79 }
80}