diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md index 18ec079..3679f6c 100644 --- a/TROUBLESHOOTING.md +++ b/TROUBLESHOOTING.md @@ -92,13 +92,16 @@ If you are dumping original CUDA use: ### Linux -Known bug: when dumping from original CUDA you should remove (or rename) all the files in `/dump` except `libcuda.so` and `libcuda.so.1`. - -Use it like this: +If dumping from ZLUDA use it like this: ``` LD_LIBRARY_PATH="/dump:$LD_LIBRARY_PATH" ``` +If dumping from NVIDIA CUDA use it like this: +``` +LD_LIBRARY_PATH="/dump_nvidia:$LD_LIBRARY_PATH" +``` + ### Result If all went well you should see lines like this in the console output and in the log file specified by `ZLUDA_DUMP_DIR`: diff --git a/xtask/src/main.rs b/xtask/src/main.rs index aece0d9..1af8dd0 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -113,6 +113,8 @@ struct Project { linux_names: Vec, #[serde(default)] dump_names: Vec, + #[serde(default)] + dump_nvidia_names: Vec, } #[derive(Clone, Copy, Default, PartialEq, Debug)] @@ -260,13 +262,16 @@ mod os { use crate::Workspace; use cargo_metadata::camino::Utf8PathBuf; use flate2::{write::GzEncoder, Compression}; - use std::fs::File; + use std::{fs::File, time::{Duration, SystemTime}}; pub(crate) fn create_dump_dir_and_symlinks(workspace: &Workspace) { use std::fs; let mut dump_dir = workspace.target_directory.clone(); dump_dir.push("dump"); fs::create_dir_all(&dump_dir).unwrap(); + let mut dump_nvidia_dir = dump_dir.clone(); + dump_nvidia_dir.set_file_name("dump_nvidia"); + fs::create_dir_all(&dump_nvidia_dir).unwrap(); for project in workspace.projects.iter() { let dst = format!( "{}{}{}", @@ -285,6 +290,9 @@ mod os { for src_file in project.dump_names.iter() { force_symlink(&dump_dst, &dump_dir, src_file); } + for src_file in project.dump_nvidia_names.iter() { + force_symlink(&dump_dst, &dump_nvidia_dir, src_file); + } } } @@ -317,6 +325,7 @@ mod os { let gz_file = File::create(target_file).unwrap(); let gz = GzEncoder::new(gz_file, Compression::default()); let mut tar = tar::Builder::new(gz); + let time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap_or(Duration::ZERO); for project in workspace.projects { if project.skip_zip { continue; @@ -329,50 +338,44 @@ mod os { project.kind.suffix() )) .unwrap(); - let file_in_archive_path = format!( - "zluda/{}{}{}", + let file_name = format!( + "{}{}{}", project.kind.prefix(), project.target_name, project.kind.suffix() ); - tar.append_file( - format!( - "zluda/{}{}{}", - project.kind.prefix(), - project.target_name, - project.kind.suffix() - ), - &mut src_file, - ) - .unwrap(); - for linux_name in project.linux_names.iter() { - let mut header = tar::Header::new_gnu(); - header.set_entry_type(tar::EntryType::Symlink); - tar.append_link( - &mut header, - format!("zluda/{}", linux_name), - &file_in_archive_path, - ) + tar.append_file(format!("zluda/{file_name}"), &mut src_file) .unwrap(); + for linux_name in project.linux_names.iter() { + let mut header = tar_header_symlink(time); + tar.append_link(&mut header, format!("zluda/{}", linux_name), &file_name) + .unwrap(); if project.skip_dump_link { continue; } - let mut header = tar::Header::new_gnu(); - header.set_entry_type(tar::EntryType::Symlink); + let mut header = tar_header_symlink(time); tar.append_link( &mut header, format!("zluda/dump/{}", linux_name), - &file_in_archive_path, + format!("../{file_name}"), ) .unwrap(); } for dump_name in project.dump_names.iter() { - let mut header = tar::Header::new_gnu(); - header.set_entry_type(tar::EntryType::Symlink); + let mut header = tar_header_symlink(time); tar.append_link( &mut header, format!("zluda/dump/{}", dump_name), - &file_in_archive_path, + format!("../{file_name}"), + ) + .unwrap(); + } + for dump_name in project.dump_nvidia_names.iter() { + let mut header = tar_header_symlink(time); + tar.append_link( + &mut header, + format!("zluda/dump_nvidia/{}", dump_name), + format!("../{file_name}"), ) .unwrap(); } @@ -380,6 +383,13 @@ mod os { tar.finish().unwrap(); 0 } + +fn tar_header_symlink(time: Duration) -> tar::Header { + let mut header = tar::Header::new_gnu(); + header.set_mtime(time.as_secs()); + header.set_entry_type(tar::EntryType::Symlink); + header + } } #[cfg(windows)] diff --git a/zluda_dump/Cargo.toml b/zluda_dump/Cargo.toml index 2ee1592..1499905 100644 --- a/zluda_dump/Cargo.toml +++ b/zluda_dump/Cargo.toml @@ -44,3 +44,4 @@ rand = "0.8.5" # Nominally debug_only, but useful for power users [package.metadata.zluda] dump_names = ["libcuda.so", "libcuda.so.1"] +dump_nvidia_names = ["libcuda.so", "libcuda.so.1"]