mirror of
https://gitlab.redox-os.org/redox-os/redox.git
synced 2026-06-25 06:14:18 +08:00
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:
commit
32024767ee
@ -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!(
|
||||
|
||||
@ -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")?;
|
||||
}
|
||||
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user