pub mod cleanup;
pub mod namespace;
pub mod paths;
pub mod resolve;
use super::NormalizedPath;
pub const CACHE_DIR_ENV: &str = "ZCCACHE_CACHE_DIR";
pub const DAEMON_NAMESPACE_ENV: &str = "ZCCACHE_DAEMON_NAMESPACE";
pub const DAEMON_STATE_DIR_ENV: &str = "ZCCACHE_DAEMON_STATE_DIR";
pub const DEFAULT_DAEMON_NAMESPACE: &str = "default";
pub const DEV_DAEMON_NAMESPACE: &str = "dev";
pub const DEFAULT_IDLE_TIMEOUT_SECS: u64 = 3600;
pub const COLOCATE_ENV: &str = "ZCCACHE_COLOCATE";
pub const NO_SPAWN_ENV: &str = "ZCCACHE_NO_SPAWN";
#[must_use]
pub fn daemon_spawn_disabled() -> bool {
no_spawn_from_env_value(std::env::var_os(NO_SPAWN_ENV).as_deref())
}
#[must_use]
pub(crate) fn no_spawn_from_env_value(value: Option<&std::ffi::OsStr>) -> bool {
value
.map(|v| v.to_string_lossy())
.is_some_and(|v| v == "1" || v.eq_ignore_ascii_case("true"))
}
#[must_use]
pub fn no_spawn_error(daemon_name: &str) -> String {
format!(
"{daemon_name} spawn disabled by host ({NO_SPAWN_ENV}=1); \
this host serves compiles through an embedded zccache service"
)
}
pub use cleanup::{cleanup_legacy_temp_root_state, cleanup_stale_depfile_dirs};
pub use namespace::{
daemon_namespace, daemon_namespace_label, sanitize_daemon_namespace, sanitize_ipc_component,
};
pub use paths::{
artifacts_dir, artifacts_dir_from_cache_dir, cargo_registry_cache_dir,
cargo_registry_cache_dir_from_cache_dir, compiler_hash_cache_path_from_cache_dir,
crash_dump_dir, depfile_dir, depfile_dir_from_cache_dir, depgraph_dir, index_path,
index_path_from_cache_dir, log_dir, log_dir_from_cache_dir, metadata_path_from_cache_dir,
symbols_cache_dir, symbols_cache_dir_from_cache_dir, system_includes_cache_path_from_cache_dir,
tmp_dir, tmp_dir_from_cache_dir,
};
pub use resolve::{
cache_dir_override, daemon_state_dir, daemon_state_dir_from_cache_dir,
daemon_state_dir_from_cache_dir_with_namespace, default_cache_dir,
effective_cache_root_from_top_level, is_version_dir_name, prune_stale_version_dirs,
prune_stale_version_dirs_in, read_last_version_marker, resolve_cache_root,
resolve_cache_root_top_level, versioned_subdir, write_last_version_marker,
write_last_version_marker_in, CacheRootSource, PruneReport, LAST_VERSION_MARKER,
};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(default)]
pub struct Config {
pub cache_dir: NormalizedPath,
pub max_cache_size: u64,
pub idle_timeout_secs: u64,
pub enable_watcher: bool,
pub watcher_poll_fallback: bool,
pub log_level: String,
pub max_memory_bytes: u64,
pub eviction_interval_secs: u64,
pub disk_gc_interval_secs: u64,
}
impl Default for Config {
fn default() -> Self {
Self {
cache_dir: default_cache_dir(),
max_cache_size: 10 * 1024 * 1024 * 1024, idle_timeout_secs: DEFAULT_IDLE_TIMEOUT_SECS,
enable_watcher: true,
watcher_poll_fallback: false,
log_level: String::from("info"),
max_memory_bytes: 1_073_741_824, eviction_interval_secs: 30,
disk_gc_interval_secs: 300,
}
}
}
#[cfg(test)]
mod tests;