From 31b4282059726632914c9fcf61d5b8ae2c8870a9 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Tue, 3 Nov 2026 06:12:25 +0700 Subject: [PATCH] cookbook: Don't always prune sysroot with clean-target enabled --- src/cook/cook_build.rs | 40 ++++++++++++++++++++++++++++++++-------- src/cook/package.rs | 3 +++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index c059dc125..d18808f3c 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -276,9 +276,21 @@ pub fn build( }; let have_toolchain = !name.is_host() && !dep_host_pkgars.is_empty(); let (sysroot_cached, toolchain_cached) = ( - build_deps_dir(logger, &sysroot_dir, deps_sysroot)?, + build_deps_dir( + logger, + &sysroot_dir, + deps_sysroot, + false, + cook_config.clean_target, + )?, if have_toolchain { - build_deps_dir(logger, &toolchain_dir, &dep_host_pkgars)? + build_deps_dir( + logger, + &toolchain_dir, + &dep_host_pkgars, + false, + cook_config.clean_target, + )? } else { true }, @@ -301,14 +313,12 @@ pub fn build( remove_stage_dir(stage_dir)?; } if cook_config.clean_target { - // no matter what, these two caches are invalid + // both caches are invalid without init tag if sysroot_cached { - fs::remove_all(&sysroot_dir)?; - build_deps_dir(logger, &sysroot_dir, deps_sysroot)?; + build_deps_dir(logger, &sysroot_dir, deps_sysroot, true, true)?; } if toolchain_cached && have_toolchain { - fs::remove_all(&toolchain_dir)?; - build_deps_dir(logger, &toolchain_dir, &dep_host_pkgars)?; + build_deps_dir(logger, &toolchain_dir, &dep_host_pkgars, true, true)?; } } } else { @@ -627,6 +637,8 @@ fn build_deps_dir( logger: &PtyOut, deps_dir: &PathBuf, dep_pkgars: &BTreeSet<(PackageName, PathBuf)>, + check_init_tag: bool, + write_init_tag: bool, ) -> Result { let pkey_path = "build/id_ed25519.pub.toml"; let pkey_file = match PublicKeyFile::open(pkey_path) { @@ -675,7 +687,12 @@ fn build_deps_dir( } } } - if cached { + if cached + && (!check_init_tag || { + let init_tag_file = deps_dir.join(".tags-init"); + std::fs::exists(&init_tag_file).unwrap_or(false) + }) + { return Ok(true); } fs::remove_all(deps_dir)?; @@ -705,6 +722,13 @@ fn build_deps_dir( std::fs::write(&tag_file, hash.as_bytes()).map_err(wrap_io_err!("Writing tag"))?; } + if write_init_tag { + let init_tag_file = deps_dir_tmp.join(".tags-init"); + // this file is used to prevent removing deps dir when clean_target + // is enabled, then clean_deps_dir will remove the tag after build. + std::fs::write(init_tag_file, "").map_err(wrap_io_err!("Writing init tag"))?; + } + // Move sysroot.tmp to sysroot atomically fs::rename(&deps_dir_tmp, deps_dir)?; diff --git a/src/cook/package.rs b/src/cook/package.rs index f49324677..ff8dc8eae 100644 --- a/src/cook/package.rs +++ b/src/cook/package.rs @@ -64,6 +64,9 @@ pub fn package( } if !package_file.is_file() { + if cook_config.compressed && cook_config.verbose { + log_to_pty!(logger, "DEBUG: compressing '{}'", package_file.display()); + } pkgar::create_with_flags( secret_path, package_file.to_str().unwrap(),