From fce4236e9abc94c16187893814b25b9b68492060 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sat, 6 Dec 2025 22:10:04 +0700 Subject: [PATCH] Use file tags for sysroot invalidation --- src/cook/cook_build.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 7651befe1..59d12d7a9 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -434,8 +434,14 @@ fn build_deps_dir( deps_modified: SystemTime, ) -> Result<(), String> { if deps_dir.is_dir() { - let sysroot_modified = modified_dir(deps_dir)?; - if sysroot_modified < source_modified || sysroot_modified < deps_modified { + let tags_dir = deps_dir.join(".tags"); + let sysroot_modified = modified_dir(&tags_dir).unwrap_or(SystemTime::UNIX_EPOCH); + if sysroot_modified < source_modified + || sysroot_modified < deps_modified + || dep_pkgars + .iter() + .any(|(pkg, _)| !tags_dir.join(pkg.as_str()).is_file()) + { log_to_pty!(logger, "DEBUG: updating '{}'", deps_dir.display()); remove_all(deps_dir)?; } @@ -443,20 +449,25 @@ fn build_deps_dir( if !deps_dir.is_dir() { // Create sysroot.tmp create_dir_clean(&deps_dir_tmp)?; + let tags_dir = deps_dir_tmp.join(".tags"); + let usr_dir = deps_dir_tmp.join("usr"); + create_dir(&tags_dir)?; + create_dir(&usr_dir)?; - // Make sure sysroot/usr exists - create_dir(&deps_dir_tmp.join("usr"))?; for folder in &["bin", "include", "lib", "share"] { // Make sure sysroot/usr/$folder exists - create_dir(&deps_dir_tmp.join("usr").join(folder))?; + create_dir(&usr_dir.join(folder))?; // Link sysroot/$folder sysroot/usr/$folder symlink(Path::new("usr").join(folder), &deps_dir_tmp.join(folder))?; } - for (_dep, archive_path) in dep_pkgars { - let public_path = "build/id_ed25519.pub.toml"; - pkgar::extract(public_path, &archive_path, deps_dir_tmp.to_str().unwrap()).map_err( + let pkey_path = "build/id_ed25519.pub.toml"; + for (name, archive_path) in dep_pkgars { + let tag_file = tags_dir.join(name.without_host().as_str()); + fs::write(&tag_file, "") + .map_err(|e| format!("failed to write tag file {}: {:?}", tag_file.display(), e))?; + pkgar::extract(pkey_path, &archive_path, deps_dir_tmp.to_str().unwrap()).map_err( |err| { format!( "failed to install '{}' in '{}': {:?}",