extern crate cc; use std::env; use std::process::Command; fn find_library_paths() -> Vec { match env::var("CUDA_PATH") { Ok(path) => { let split_char = if cfg!(target_os = "windows") { ";" } else { ":" }; path.split(split_char).map(|s| s.to_owned()).collect::>() } Err(_) => vec![], } } fn main() { println!("cargo:rerun-if-changed=src/kernel.cu"); let library_paths = find_library_paths(); if library_paths.is_empty() { return; } let out_dir = env::var("OUT_DIR").unwrap(); if cfg!(target_os = "windows") { Command::new("nvcc") .args(&["-O3", "src/kernel.cu", // static library (.lib) を出力させる "-lib", // Cコンパイラのパスを指定 "-ccbin", "cl.exe", // Cコンパイラにwarning 4819を無視するよう指示 "-Xcompiler", "-wd4819", "-o", ]) .arg(&format!("{}/kernel.lib", &out_dir)) .status() .unwrap(); } else { cc::Build::new() .cuda(true) .flag("-cudart=shared") .flag("-gencode") .flag("arch=compute_87,code=sm_87") .flag("-gencode") .flag("arch=compute_86,code=sm_86") .flag("-gencode") .flag("arch=compute_80,code=sm_80") .flag("-gencode") .flag("arch=compute_72,code=sm_72") .flag("-gencode") .flag("arch=compute_61,code=sm_61") .file("src/kernel.cu") .out_dir(&out_dir) .compile("libkernel.a"); println!("cargo:rustc-link-lib=cudart"); } for p in library_paths { println!("cargo:rustc-link-search=native={}/lib/x64", p); } println!("cargo:rustc-link-search=native={}", &out_dir); println!("cargo:rustc-link-lib=static=kernel"); }