mirror of
https://gitlab.redox-os.org/redox-os/redox.git
synced 2026-06-25 14:24:18 +08:00
Cache auto deps
This commit is contained in:
parent
16785c25b0
commit
3da709fb1f
1
cook.sh
1
cook.sh
@ -288,6 +288,7 @@ function op {
|
|||||||
;;
|
;;
|
||||||
unstage)
|
unstage)
|
||||||
rm -rfv "${COOKBOOK_STAGE}"
|
rm -rfv "${COOKBOOK_STAGE}"
|
||||||
|
rm -fv "${TARGET_DIR}/auto_deps.toml"
|
||||||
;;
|
;;
|
||||||
pkg)
|
pkg)
|
||||||
pkgar \
|
pkgar \
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
use cookbook::blake3::blake3_progress;
|
use cookbook::blake3::blake3_progress;
|
||||||
use cookbook::recipe::{BuildKind, CookRecipe, Recipe, SourceRecipe};
|
use cookbook::recipe::{AutoDeps, BuildKind, CookRecipe, Recipe, SourceRecipe};
|
||||||
use pkg::package::Package;
|
use pkg::package::Package;
|
||||||
use pkg::{recipes, PackageName};
|
use pkg::{recipes, PackageName};
|
||||||
|
use serde::Serialize;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
use std::{
|
use std::{
|
||||||
@ -187,6 +188,20 @@ fn run_command_stdin(mut command: process::Command, stdin_data: &[u8]) -> Result
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn serialize_and_write<T: Serialize>(file_path: &Path, content: &T) -> Result<(), String> {
|
||||||
|
let toml_content = toml::to_string(content).map_err(|err| {
|
||||||
|
format!(
|
||||||
|
"Failed to serialize content for '{}': {}",
|
||||||
|
file_path.display(),
|
||||||
|
err
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
fs::write(file_path, toml_content)
|
||||||
|
.map_err(|err| format!("Failed to write to file '{}': {}", file_path.display(), err))?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
static SHARED_PRESCRIPT: &str = r#"
|
static SHARED_PRESCRIPT: &str = r#"
|
||||||
function DYNAMIC_INIT {
|
function DYNAMIC_INIT {
|
||||||
COOKBOOK_AUTORECONF="autoreconf"
|
COOKBOOK_AUTORECONF="autoreconf"
|
||||||
@ -704,16 +719,16 @@ fn build(
|
|||||||
let sysroot_dir = target_dir.join("sysroot");
|
let sysroot_dir = target_dir.join("sysroot");
|
||||||
// Rebuild sysroot if source is newer
|
// Rebuild sysroot if source is newer
|
||||||
//TODO: rebuild on recipe changes
|
//TODO: rebuild on recipe changes
|
||||||
if sysroot_dir.is_dir()
|
if sysroot_dir.is_dir() {
|
||||||
&& (modified_dir(&sysroot_dir)? < source_modified
|
let sysroot_modified = modified_dir(&sysroot_dir)?;
|
||||||
|| modified_dir(&sysroot_dir)? < deps_modified)
|
if sysroot_modified < source_modified || sysroot_modified < deps_modified {
|
||||||
{
|
eprintln!(
|
||||||
eprintln!(
|
"DEBUG: '{}' newer than '{}'",
|
||||||
"DEBUG: '{}' newer than '{}'",
|
source_dir.display(),
|
||||||
source_dir.display(),
|
sysroot_dir.display()
|
||||||
sysroot_dir.display()
|
);
|
||||||
);
|
remove_all(&sysroot_dir)?;
|
||||||
remove_all(&sysroot_dir)?;
|
}
|
||||||
}
|
}
|
||||||
if !sysroot_dir.is_dir() {
|
if !sysroot_dir.is_dir() {
|
||||||
// Create sysroot.tmp
|
// Create sysroot.tmp
|
||||||
@ -754,16 +769,16 @@ fn build(
|
|||||||
let stage_dir = target_dir.join("stage");
|
let stage_dir = target_dir.join("stage");
|
||||||
// Rebuild stage if source is newer
|
// Rebuild stage if source is newer
|
||||||
//TODO: rebuild on recipe changes
|
//TODO: rebuild on recipe changes
|
||||||
if stage_dir.is_dir()
|
if stage_dir.is_dir() {
|
||||||
&& (modified_dir(&stage_dir)? < source_modified
|
let stage_modified = modified_dir(&stage_dir)?;
|
||||||
|| modified_dir(&stage_dir)? < deps_modified)
|
if stage_modified < source_modified || stage_modified < deps_modified {
|
||||||
{
|
eprintln!(
|
||||||
eprintln!(
|
"DEBUG: '{}' newer than '{}'",
|
||||||
"DEBUG: '{}' newer than '{}'",
|
source_dir.display(),
|
||||||
source_dir.display(),
|
stage_dir.display()
|
||||||
stage_dir.display()
|
);
|
||||||
);
|
remove_all(&stage_dir)?;
|
||||||
remove_all(&stage_dir)?;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !stage_dir.is_dir() {
|
if !stage_dir.is_dir() {
|
||||||
@ -1069,8 +1084,24 @@ done
|
|||||||
rename(&stage_dir_tmp, &stage_dir)?;
|
rename(&stage_dir_tmp, &stage_dir)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate automatic dependencies
|
let auto_deps_path = target_dir.join("auto_deps.toml");
|
||||||
let auto_deps = auto_deps(&stage_dir, &dep_pkgars);
|
|
||||||
|
if auto_deps_path.is_file() && modified(&auto_deps_path)? < modified(&stage_dir)? {
|
||||||
|
remove_all(&auto_deps_path)?
|
||||||
|
}
|
||||||
|
|
||||||
|
let auto_deps = if auto_deps_path.exists() {
|
||||||
|
let toml_content =
|
||||||
|
fs::read_to_string(&auto_deps_path).map_err(|_| "failed to read cached auto_deps")?;
|
||||||
|
let wrapper: AutoDeps =
|
||||||
|
toml::from_str(&toml_content).map_err(|_| "failed to deserialize cached auto_deps")?;
|
||||||
|
wrapper.packages
|
||||||
|
} else {
|
||||||
|
let packages = auto_deps(&stage_dir, &dep_pkgars);
|
||||||
|
let wrapper = AutoDeps { packages };
|
||||||
|
serialize_and_write(&auto_deps_path, &wrapper)?;
|
||||||
|
wrapper.packages
|
||||||
|
};
|
||||||
|
|
||||||
Ok((stage_dir, auto_deps))
|
Ok((stage_dir, auto_deps))
|
||||||
}
|
}
|
||||||
@ -1137,15 +1168,14 @@ fn package_toml(
|
|||||||
depends.push(dep.clone());
|
depends.push(dep.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let stage_toml = toml::to_string(&Package {
|
let package = Package {
|
||||||
name: name.clone(),
|
name: name.clone(),
|
||||||
version: package_version(recipe),
|
version: package_version(recipe),
|
||||||
target: env::var("TARGET").map_err(|err| format!("failed to read TARGET: {:?}", err))?,
|
target: env::var("TARGET").map_err(|err| format!("failed to read TARGET: {:?}", err))?,
|
||||||
depends,
|
depends,
|
||||||
})
|
};
|
||||||
.map_err(|err| format!("failed to serialize stage.toml: {:?}", err))?;
|
|
||||||
fs::write(target_dir.join("stage.toml"), stage_toml)
|
serialize_and_write(&target_dir.join("stage.toml"), &package)?;
|
||||||
.map_err(|err| format!("failed to write stage.toml: {:?}", err))?;
|
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use std::{convert::TryInto, fs, path::PathBuf};
|
use std::{collections::BTreeSet, convert::TryInto, fs, path::PathBuf};
|
||||||
|
|
||||||
use pkg::{package::PackageError, recipes, PackageName};
|
use pkg::{package::PackageError, recipes, PackageName};
|
||||||
use serde::{
|
use serde::{
|
||||||
@ -215,6 +215,11 @@ impl CookRecipe {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct AutoDeps {
|
||||||
|
pub packages: BTreeSet<PackageName>,
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use pkg::PackageName;
|
use pkg::PackageName;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user