Merge branch 'pkg-in-build-deps' into 'master'

Traverse package deps from build deps

See merge request redox-os/cookbook!678
This commit is contained in:
Jeremy Soller 2025-11-02 17:37:19 -07:00
commit 32024767ee
4 changed files with 80 additions and 51 deletions

View File

@ -1,7 +1,6 @@
use std::path::Path;
use std::{env, process};
use cookbook::WALK_DEPTH;
use cookbook::cook::fetch::{fetch, fetch_offline};
use cookbook::cook::fs::create_target_dir;
use cookbook::cook::package::package;
@ -74,7 +73,7 @@ fn main() {
}
if with_package_deps {
recipe_names = match CookRecipe::get_package_deps_recursive(&recipe_names, WALK_DEPTH) {
recipe_names = match CookRecipe::get_package_deps_recursive(&recipe_names, true) {
Ok(ok) => ok,
Err(err) => {
eprintln!(

View File

@ -1,6 +1,5 @@
use ansi_to_tui::IntoText;
use anyhow::{Context, anyhow, bail};
use cookbook::WALK_DEPTH;
use cookbook::config::{CookConfig, get_config, init_config};
use cookbook::cook::cook_build::build;
use cookbook::cook::fetch::{fetch, fetch_offline};
@ -399,7 +398,7 @@ fn parse_args(args: Vec<String>) -> anyhow::Result<(CliConfig, CliCommand, Vec<C
}
}
if config.with_package_deps {
recipe_names = CookRecipe::get_package_deps_recursive(&recipe_names, WALK_DEPTH)
recipe_names = CookRecipe::get_package_deps_recursive(&recipe_names, true)
.context("failed get package deps")?;
}

View File

@ -1,3 +1,4 @@
use pkg::package::PackageError;
use pkg::recipes;
use pkg::{Package, PackageName};
use redoxer::target;
@ -5,9 +6,9 @@ use redoxer::target;
use crate::cook::fs::*;
use crate::cook::pty::PtyOut;
use crate::cook::script::*;
use crate::recipe::AutoDeps;
use crate::recipe::BuildKind;
use crate::recipe::Recipe;
use crate::recipe::{AutoDeps, CookRecipe};
use std::collections::VecDeque;
use std::{
collections::BTreeSet,
@ -37,7 +38,7 @@ macro_rules! log_warn {
};
}
fn auto_deps(
fn auto_deps_from_dynamic_linking(
stage_dir: &Path,
dep_pkgars: &BTreeSet<(PackageName, PathBuf)>,
logger: &PtyOut,
@ -160,6 +161,20 @@ fn auto_deps(
deps
}
fn auto_deps_from_static_package_deps(
build_dep_pkgars: &BTreeSet<(PackageName, PathBuf)>,
dynamic_dep_pkgars: &BTreeSet<PackageName>,
) -> Result<BTreeSet<PackageName>, PackageError> {
let static_dep_pkgars: Vec<PackageName> = build_dep_pkgars
.iter()
.map(|x| x.0.clone())
.filter(|x| !dynamic_dep_pkgars.contains(x))
.collect();
let pkgs = CookRecipe::get_package_deps_recursive(&static_dep_pkgars, false)?;
Ok(pkgs.into_iter().collect())
}
pub fn build(
recipe_dir: &Path,
source_dir: &Path,
@ -394,8 +409,13 @@ fn build_auto_deps(
toml::from_str(&toml_content).map_err(|_| "failed to deserialize cached auto_deps")?;
wrapper.packages
} else {
let packages = auto_deps(stage_dir, &dep_pkgars, logger);
let wrapper = AutoDeps { packages };
let mut packages1 = auto_deps_from_dynamic_linking(stage_dir, &dep_pkgars, logger);
let packages2 =
auto_deps_from_static_package_deps(&dep_pkgars, &packages1).unwrap_or_default();
packages1.extend(packages2);
let wrapper = AutoDeps {
packages: packages1,
};
serialize_and_write(&auto_deps_path, &wrapper)?;
wrapper.packages
};
@ -481,7 +501,7 @@ pub fn build_remote(
mod tests {
use std::os::unix;
use super::auto_deps;
use super::auto_deps_from_dynamic_linking;
#[test]
fn file_system_loop_no_infinite_loop() {
@ -498,7 +518,7 @@ mod tests {
"Expected a loop where {dir:?} points to {root:?}"
);
let entries = auto_deps(root, &Default::default(), &None);
let entries = auto_deps_from_dynamic_linking(root, &Default::default(), &None);
assert!(
entries.is_empty(),
"auto_deps shouldn't have yielded any libraries"

View File

@ -219,6 +219,11 @@ impl CookRecipe {
pub fn new_recursive(
names: &[PackageName],
recurse_build_deps: bool,
recurse_package_deps: bool,
collect_build_deps: bool,
collect_package_deps: bool,
collect_self: bool,
recursion: usize,
) -> Result<Vec<Self>, PackageError> {
if recursion == 0 {
@ -229,21 +234,51 @@ impl CookRecipe {
for name in names {
let recipe = Self::from_name(name.as_str())?;
let dependencies =
Self::new_recursive(&recipe.recipe.build.dependencies, recursion - 1).map_err(
|mut err| {
err.append_recursion(name);
err
},
)?;
if recurse_build_deps {
let dependencies = Self::new_recursive(
&recipe.recipe.build.dependencies,
recurse_build_deps,
recurse_package_deps,
collect_build_deps,
collect_package_deps,
collect_build_deps,
recursion - 1,
)
.map_err(|mut err| {
err.append_recursion(name);
err
})?;
for dependency in dependencies {
if !recipes.contains(&dependency) {
recipes.push(dependency);
for dependency in dependencies {
if !recipes.contains(&dependency) {
recipes.push(dependency);
}
}
}
if !recipes.contains(&recipe) {
if recurse_package_deps {
let dependencies = Self::new_recursive(
&recipe.recipe.package.dependencies,
recurse_build_deps,
recurse_package_deps,
collect_build_deps,
collect_package_deps,
collect_package_deps,
recursion - 1,
)
.map_err(|mut err| {
err.append_recursion(name);
err
})?;
for dependency in dependencies {
if !recipes.contains(&dependency) {
recipes.push(dependency);
}
}
}
if collect_self && !recipes.contains(&recipe) {
recipes.push(recipe);
}
}
@ -255,7 +290,7 @@ impl CookRecipe {
names: &[PackageName],
mark_is_deps: bool,
) -> Result<Vec<Self>, PackageError> {
let mut packages = Self::new_recursive(names, WALK_DEPTH)?;
let mut packages = Self::new_recursive(names, true, false, true, false, true, WALK_DEPTH)?;
if mark_is_deps {
for package in packages.iter_mut() {
@ -268,37 +303,13 @@ impl CookRecipe {
pub fn get_package_deps_recursive(
names: &[PackageName],
recursion: usize,
include_names: bool,
) -> Result<Vec<PackageName>, PackageError> {
if recursion == 0 {
return Err(PackageError::Recursion(Default::default()));
}
// recurse_build_deps == true here as libraries (build deps) can have runtime files (package deps)
let packages =
Self::new_recursive(names, true, true, false, true, include_names, WALK_DEPTH)?;
let mut recipes: Vec<PackageName> = Vec::new();
for name in names {
let recipe = Self::from_name(name.as_str())?;
let dependencies = Self::get_package_deps_recursive(
&recipe.recipe.package.dependencies,
recursion - 1,
)
.map_err(|mut err| {
err.append_recursion(name);
err
})?;
for dependency in dependencies {
if !recipes.contains(&dependency) {
recipes.push(dependency);
}
}
if !recipes.contains(name) {
recipes.push(name.clone());
}
}
Ok(recipes)
Ok(packages.into_iter().map(|p| p.name).collect())
}
}