Skip to content

Commit aa1ca9d

Browse files
authored
feat: expose common functionality (#92)
This deduplicates a bunch of code :)
1 parent 94bb543 commit aa1ca9d

File tree

14 files changed

+404
-326
lines changed

14 files changed

+404
-326
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use std::collections::BTreeMap;
2+
3+
use miette::IntoDiagnostic;
4+
use pixi_build_types::PlatformAndVirtualPackages;
5+
use rattler_build::{
6+
metadata::{Directories, PlatformWithVirtualPackages},
7+
recipe::variable::Variable,
8+
NormalizedKey,
9+
};
10+
use rattler_conda_types::ChannelUrl;
11+
use rattler_virtual_packages::VirtualPackageOverrides;
12+
use url::Url;
13+
14+
/// Returns the [`BuildConfigurationParams`] that will be used to construct a BuildConfiguration
15+
pub fn build_configuration(
16+
channels: Vec<Url>,
17+
build_platform: Option<PlatformAndVirtualPackages>,
18+
host_platform: Option<PlatformAndVirtualPackages>,
19+
variant: BTreeMap<NormalizedKey, Variable>,
20+
directories: Directories,
21+
) -> miette::Result<BuildConfigurationParams> {
22+
let build_platform = build_platform.map(|p| PlatformWithVirtualPackages {
23+
platform: p.platform,
24+
virtual_packages: p.virtual_packages.unwrap_or_default(),
25+
});
26+
27+
let host_platform = host_platform.map(|p| PlatformWithVirtualPackages {
28+
platform: p.platform,
29+
virtual_packages: p.virtual_packages.unwrap_or_default(),
30+
});
31+
32+
let (build_platform, host_platform) = match (build_platform, host_platform) {
33+
(Some(build_platform), Some(host_platform)) => (build_platform, host_platform),
34+
(build_platform, host_platform) => {
35+
let current_platform = rattler_build::metadata::PlatformWithVirtualPackages::detect(
36+
&VirtualPackageOverrides::from_env(),
37+
)
38+
.into_diagnostic()?;
39+
(
40+
build_platform.unwrap_or_else(|| current_platform.clone()),
41+
host_platform.unwrap_or(current_platform),
42+
)
43+
}
44+
};
45+
46+
let channels = channels.into_iter().map(Into::into).collect();
47+
48+
let params = BuildConfigurationParams {
49+
channels,
50+
build_platform,
51+
host_platform,
52+
variant,
53+
directories,
54+
};
55+
56+
Ok(params)
57+
}
58+
59+
/// The parameters used to construct a BuildConfiguration
60+
#[derive(Debug)]
61+
pub struct BuildConfigurationParams {
62+
pub channels: Vec<ChannelUrl>,
63+
pub build_platform: PlatformWithVirtualPackages,
64+
pub host_platform: PlatformWithVirtualPackages,
65+
pub variant: BTreeMap<NormalizedKey, Variable>,
66+
pub directories: Directories,
67+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//! Common utilities that are shared between the different build backends.
2+
mod configuration;
3+
mod requirements;
4+
mod variants;
5+
6+
pub use configuration::{build_configuration, BuildConfigurationParams};
7+
pub use requirements::requirements;
8+
pub use variants::compute_variants;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::collections::BTreeMap;
2+
3+
use rattler_build::{
4+
recipe::{parser::Requirements, variable::Variable},
5+
NormalizedKey,
6+
};
7+
use rattler_conda_types::ChannelConfig;
8+
9+
use crate::{dependencies::extract_dependencies, traits::Dependencies, ProjectModel, Targets};
10+
11+
/// Return requirements for the given project model
12+
pub fn requirements<P: ProjectModel>(
13+
dependencies: Dependencies<<P::Targets as Targets>::Spec>,
14+
channel_config: &ChannelConfig,
15+
variant: &BTreeMap<NormalizedKey, Variable>,
16+
) -> miette::Result<Requirements> {
17+
// Extract dependencies into requirements
18+
let requirements = Requirements {
19+
build: extract_dependencies(channel_config, dependencies.build, variant)?,
20+
host: extract_dependencies(channel_config, dependencies.host, variant)?,
21+
run: extract_dependencies(channel_config, dependencies.run, variant)?,
22+
..Default::default()
23+
};
24+
Ok(requirements)
25+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//! Variants trait
2+
//!
3+
use std::collections::BTreeMap;
4+
5+
use miette::IntoDiagnostic;
6+
use rattler_build::{recipe::variable::Variable, variant_config::VariantConfig, NormalizedKey};
7+
use rattler_conda_types::Platform;
8+
9+
use crate::ProjectModel;
10+
11+
/// Return variants for the given project model
12+
pub fn compute_variants<P: ProjectModel>(
13+
project_model: &P,
14+
input_variant_configuration: Option<BTreeMap<NormalizedKey, Vec<Variable>>>,
15+
host_platform: Platform,
16+
) -> miette::Result<Vec<BTreeMap<NormalizedKey, Variable>>> {
17+
// Create a variant config from the variant configuration in the parameters.
18+
let variant_config = VariantConfig {
19+
variants: input_variant_configuration.unwrap_or_default(),
20+
pin_run_as_build: None,
21+
zip_keys: None,
22+
};
23+
24+
// Determine the variant keys that are used in the recipe.
25+
let used_variants = project_model.used_variants(Some(host_platform));
26+
27+
// Determine the combinations of the used variants.
28+
variant_config
29+
.combinations(&used_variants, None)
30+
.into_diagnostic()
31+
}

crates/pixi-build-backend/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub mod cli;
22
pub mod protocol;
33
pub mod server;
44

5+
pub mod common;
56
mod consts;
67
pub mod dependencies;
78
pub mod project;

crates/pixi-build-backend/src/traits/project.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use pixi_build_types::{self as pbt};
1111
use rattler_build::NormalizedKey;
1212
use rattler_conda_types::{Platform, Version};
1313

14-
use super::{targets::Targets, PackageSpec};
14+
use super::{targets::Targets, Dependencies, PackageSpec};
1515

1616
/// A trait that defines the project model interface
1717
pub trait ProjectModel {
@@ -21,6 +21,16 @@ pub trait ProjectModel {
2121
/// Return the targets of the project model
2222
fn targets(&self) -> Option<&Self::Targets>;
2323

24+
/// Return the dependencies of the project model
25+
fn dependencies(
26+
&self,
27+
platform: Option<Platform>,
28+
) -> Dependencies<<<Self as ProjectModel>::Targets as Targets>::Spec> {
29+
self.targets()
30+
.map(|t| t.dependencies(platform))
31+
.unwrap_or_default()
32+
}
33+
2434
/// Return the used variants of the project model
2535
fn used_variants(&self, platform: Option<Platform>) -> HashSet<NormalizedKey>;
2636

0 commit comments

Comments
 (0)