From 3558a0a65cc5e6ae4df8ae4c1d95c6003d50af05 Mon Sep 17 00:00:00 2001 From: Andrzej Janik Date: Sun, 28 Nov 2021 23:51:41 +0100 Subject: [PATCH] Add integration tests for injector --- zluda_inject/build.rs | 68 ++++++++++++++++++++ zluda_inject/tests/helpers/direct_cuinit.rs | 9 +++ zluda_inject/tests/helpers/nvcuda.lib | Bin 0 -> 71050 bytes zluda_inject/tests/inject.rs | 13 ++++ 4 files changed, 90 insertions(+) create mode 100644 zluda_inject/build.rs create mode 100644 zluda_inject/tests/helpers/direct_cuinit.rs create mode 100644 zluda_inject/tests/helpers/nvcuda.lib create mode 100644 zluda_inject/tests/inject.rs diff --git a/zluda_inject/build.rs b/zluda_inject/build.rs new file mode 100644 index 0000000..c9146e0 --- /dev/null +++ b/zluda_inject/build.rs @@ -0,0 +1,68 @@ +use std::{ + env::{self, VarError}, + fs::{self, DirEntry}, + io, + path::{self, PathBuf}, + process::Command, +}; + +fn main() -> Result<(), VarError> { + println!("cargo:rerun-if-changed=build.rs"); + if env::var("PROFILE")? != "debug" { + return Ok(()); + } + let rustc_exe = env::var("RUSTC")?; + let out_dir = env::var("OUT_DIR")?; + let target = env::var("TARGET")?; + let is_msvc = env::var("CARGO_CFG_TARGET_ENV")? == "msvc"; + let opt_level = env::var("OPT_LEVEL")?; + let debug = str::parse::(env::var("DEBUG")?.as_str()).unwrap(); + let mut helpers_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); + helpers_dir.push("tests"); + helpers_dir.push("helpers"); + let helpers_dir_as_string = helpers_dir.to_string_lossy(); + for rust_file in fs::read_dir(&helpers_dir).unwrap().filter_map(rust_file) { + let full_file_path = format!( + "{}{}{}", + helpers_dir_as_string, + path::MAIN_SEPARATOR, + rust_file + ); + println!("cargo:rerun-if-changed={}", full_file_path); + let mut rustc_cmd = Command::new(&*rustc_exe); + if debug { + rustc_cmd.arg("-g"); + } + rustc_cmd.arg(format!("-Lnative={}", helpers_dir_as_string)); + if !is_msvc { + // HACK ALERT + // I have no idea why the extra library below have to be linked + rustc_cmd.arg(r"-lucrt"); + } + rustc_cmd + .arg("-ldylib=nvcuda") + .arg("-C") + .arg(format!("opt-level={}", opt_level)) + .arg("--out-dir") + .arg(format!("{}", out_dir)) + .arg("--target") + .arg(format!("{}", target)) + .arg(full_file_path); + assert!(rustc_cmd.status().unwrap().success()); + } + println!("cargo:rustc-env=HELPERS_OUT_DIR={}", &out_dir); + Ok(()) +} + +fn rust_file(entry: io::Result) -> Option { + entry.ok().and_then(|e| { + let os_file_name = e.file_name(); + let file_name = os_file_name.to_string_lossy(); + let is_file = e.file_type().ok().map(|t| t.is_file()).unwrap_or(false); + if is_file && file_name.ends_with(".rs") { + Some(file_name.to_string()) + } else { + None + } + }) +} diff --git a/zluda_inject/tests/helpers/direct_cuinit.rs b/zluda_inject/tests/helpers/direct_cuinit.rs new file mode 100644 index 0000000..8341a60 --- /dev/null +++ b/zluda_inject/tests/helpers/direct_cuinit.rs @@ -0,0 +1,9 @@ +#![crate_type = "bin"] + +extern "system" { + fn cuInit(flags: u32) -> u32; +} + +fn main() { + unsafe { cuInit(0) }; +} diff --git a/zluda_inject/tests/helpers/nvcuda.lib b/zluda_inject/tests/helpers/nvcuda.lib new file mode 100644 index 0000000000000000000000000000000000000000..b793c56e227f0c0374d75e2d6f88c58f5e86a9fd GIT binary patch literal 71050 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 io::Result<()> { + let helpers_dir = env!("HELPERS_OUT_DIR"); + let mut main_exe = Command::new(format!( + "{}{}direct_cuinit.exe", + helpers_dir, + std::path::MAIN_SEPARATOR + )); + assert!(main_exe.status()?.success()); + Ok(()) +}