futhark_bindgen/
package.rs

1use crate::*;
2
3/// Compiled Futhark package
4#[derive(Debug, Clone)]
5pub struct Package {
6    /// Manifest, parsed from the manifest file
7    pub manifest: Manifest,
8
9    /// Path to the generated C file
10    pub c_file: std::path::PathBuf,
11
12    /// Path to the generate C header file
13    pub h_file: std::path::PathBuf,
14
15    /// Source file
16    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    /// Link the package
59    ///
60    /// Note: This should only be used in `build.rs`
61    #[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}