Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions crates/pixi-build-backend/src/dependencies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ use rattler_conda_types::{
};
use thiserror::Error;

use crate::{specs_conversion::from_source_url_to_source_package, traits::PackageSpec};
use crate::{
specs_conversion::{convert_variant_from_pixi_build_types, from_source_url_to_source_package},
traits::PackageSpec,
};

/// A helper struct to extract match specs from a manifest.
#[derive(Default)]
Expand Down Expand Up @@ -138,7 +141,7 @@ pub fn convert_input_variant_configuration(
(
k.into(),
v.into_iter()
.map(|v| Variable::from_string(&v.to_string()))
.map(convert_variant_from_pixi_build_types)
.collect(),
)
})
Expand Down
86 changes: 68 additions & 18 deletions crates/pixi-build-backend/src/intermediate_backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use std::{
};

use indexmap::{IndexMap, IndexSet};
use itertools::Itertools;
use miette::{Context, IntoDiagnostic};
use ordermap::OrderMap;
use pixi_build_types::{
Expand All @@ -20,11 +21,12 @@ use pixi_build_types::{
},
};
use rattler_build::{
NormalizedKey,
build::{WorkingDirectoryBehavior, run_build},
console_utils::LoggingOutputHandler,
hash::HashInfo,
metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages},
recipe::{ParsingError, Recipe, parser::find_outputs_from_src, variable::Variable},
recipe::{ParsingError, Recipe, parser::find_outputs_from_src},
selectors::SelectorConfig,
source_code::Source,
tool_configuration::Configuration,
Expand All @@ -44,7 +46,10 @@ use crate::{
},
generated_recipe::{BackendConfig, GenerateRecipe, PythonParams},
protocol::{Protocol, ProtocolInstantiator},
specs_conversion::from_build_v1_args_to_finalized_dependencies,
specs_conversion::{
convert_variant_from_pixi_build_types, convert_variant_to_pixi_build_types,
from_build_v1_args_to_finalized_dependencies,
},
tools::{OneOrMultipleOutputs, output_directory},
};

Expand Down Expand Up @@ -438,12 +443,21 @@ where
variant: variant
.iter()
.map(|(key, value)| {
(
Ok((
key.0.clone(),
pixi_build_types::VariantValue::from(value.to_string()),
)
convert_variant_to_pixi_build_types(value.clone()).into_diagnostic()
.with_context(|| {
format!("the output {}/{}={}={} contains a variant for '{}' which cannot be converted to pixi types: {}",
discovered_output.target_platform,
discovered_output.name,
discovered_output.version,
discovered_output.build_string,
key.0,
value)
})?
))
})
.collect(),
.collect::<miette::Result<_>>()?,
},
build_dependencies: Some(CondaOutputDependencies {
depends: convert_dependencies(
Expand Down Expand Up @@ -563,7 +577,7 @@ where
.map(|(k, v)| {
(
k.as_str().into(),
vec![Variable::from_string(&v.to_string())],
vec![convert_variant_from_pixi_build_types(v.clone())],
)
})
.collect();
Expand Down Expand Up @@ -755,23 +769,60 @@ where

pub fn find_matching_output(
expected_output: &CondaBuildV1Output,
discovered_outputs: IndexSet<DiscoveredOutput>,
mut discovered_outputs: IndexSet<DiscoveredOutput>,
) -> miette::Result<DiscoveredOutput> {
// Find the only output that matches the request.
let discovered_output = discovered_outputs
// Filter all outputs that are skipped or dont match the name
discovered_outputs.retain(|output| {
!output.recipe.build.skip() && output.name == expected_output.name.as_normalized()
});

if discovered_outputs.is_empty() {
// There is no output with the expected name
return Err(miette::miette!(
"there is no output defined for the package '{}'",
expected_output.name.as_source(),
));
}

// Check if there is a output that has matching variant keys.
let expected_used_vars: BTreeMap<NormalizedKey, _> = expected_output
.variant
.iter()
.map(|(k, v)| {
(
k.as_str().into(),
convert_variant_from_pixi_build_types(v.clone()),
)
})
.collect();
if let Ok((output_idx, _)) = discovered_outputs
.iter()
.enumerate()
.filter(|(_idx, output)| {
expected_used_vars
.iter()
.all(|(key, value)| output.used_vars.get(key) == Some(value))
})
.exactly_one()
{
return Ok(discovered_outputs
.swap_remove_index(output_idx)
.expect("index must exist"));
}

// Otherwise, match on version, build and subdir.
discovered_outputs
.into_iter()
.find(|output| {
expected_output.name.as_normalized() == output.name
&& expected_output
.build
.as_ref()
.is_none_or(|build_string| build_string == &output.build_string)
expected_output
.build
.as_ref()
.is_none_or(|build_string| build_string == &output.build_string)
&& expected_output
.version
.as_ref()
.is_none_or(|version| version == &output.recipe.package.version)
&& expected_output.subdir == output.target_platform
&& !output.recipe.build.skip()
})
.ok_or_else(|| {
miette::miette!(
Expand All @@ -784,8 +835,7 @@ pub fn find_matching_output(
expected_output.build.as_deref().unwrap_or("??"),
expected_output.subdir
)
})?;
Ok(discovered_output)
})
}

pub fn conda_build_v1_directories(
Expand Down
26 changes: 23 additions & 3 deletions crates/pixi-build-backend/src/specs_conversion.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::sync::Arc;

use minijinja::Value;
use ordermap::OrderMap;
use pixi_build_types::{
BinaryPackageSpecV1, PackageSpecV1, SourcePackageSpecV1, TargetSelectorV1, TargetV1, TargetsV1,
Expand All @@ -8,9 +9,12 @@ use pixi_build_types::{
CondaBuildV1RunExports,
},
};
use rattler_build::render::resolved_dependencies::{
DependencyInfo, FinalizedDependencies, FinalizedRunDependencies, ResolvedDependencies,
RunExportDependency, SourceDependency,
use rattler_build::{
recipe::variable::Variable,
render::resolved_dependencies::{
DependencyInfo, FinalizedDependencies, FinalizedRunDependencies, ResolvedDependencies,
RunExportDependency, SourceDependency,
},
};
use rattler_conda_types::{
Channel, MatchSpec, PackageName, PackageNameMatcher, package::RunExportsJson,
Expand All @@ -20,6 +24,7 @@ use recipe_stage0::{
recipe::{Conditional, ConditionalList, ConditionalRequirements, Item, ListOrItem},
requirements::PackageSpecDependencies,
};
use serde::Deserialize;
use url::Url;

use crate::encoded_source_spec_url::EncodedSourceSpecUrl;
Expand Down Expand Up @@ -55,6 +60,21 @@ impl std::fmt::Display for PlatformKind {
}
}

pub fn convert_variant_from_pixi_build_types(variant: pixi_build_types::VariantValue) -> Variable {
match variant {
pixi_build_types::VariantValue::String(s) => Variable::from(s),
pixi_build_types::VariantValue::Int(i) => Variable::from(i),
pixi_build_types::VariantValue::Bool(b) => Variable::from(b),
}
}

pub fn convert_variant_to_pixi_build_types(
variant: Variable,
) -> Result<pixi_build_types::VariantValue, minijinja::Error> {
let value = Value::from(variant);
pixi_build_types::VariantValue::deserialize(value)
}

pub fn to_rattler_build_selector(
selector: &TargetSelectorV1,
platform_kind: PlatformKind,
Expand Down
12 changes: 5 additions & 7 deletions crates/pixi-build-backend/src/tools.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use rattler_conda_types::{GenericVirtualPackage, Platform, package::ArchiveType}
use rattler_virtual_packages::VirtualPackageOverrides;
use url::Url;

use crate::source::Source;
use crate::{source::Source, specs_conversion::convert_variant_from_pixi_build_types};

/// A `recipe.yaml` file might be accompanied by a `variants.toml` file from
/// which we can read variant configuration for that specific recipe..
Expand Down Expand Up @@ -98,16 +98,14 @@ impl LoadedVariantConfig {

pub fn extend_with_input_variants(
mut self,
input_variant_configuration: &BTreeMap<String, Vec<pixi_build_types::VariantValue>>,
input_variant_configuration: BTreeMap<String, Vec<pixi_build_types::VariantValue>>,
) -> Self {
for (k, v) in input_variant_configuration {
let variables = v
.iter()
.map(|v| rattler_build::recipe::variable::Variable::from_string(&v.to_string()))
.into_iter()
.map(convert_variant_from_pixi_build_types)
.collect();
self.variant_config
.variants
.insert(k.as_str().into(), variables);
self.variant_config.variants.insert(k.into(), variables);
}
self
}
Expand Down
34 changes: 23 additions & 11 deletions crates/pixi-build-rattler-build/src/protocol.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ use std::{

use crate::{config::RattlerBuildBackendConfig, rattler_build::RattlerBuildBackend};
use miette::{Context, IntoDiagnostic};
use pixi_build_backend::specs_conversion::from_build_v1_args_to_finalized_dependencies;
use pixi_build_backend::specs_conversion::{
convert_variant_from_pixi_build_types, convert_variant_to_pixi_build_types,
from_build_v1_args_to_finalized_dependencies,
};
use pixi_build_backend::{
dependencies::{convert_binary_dependencies, convert_dependencies},
intermediate_backend::{conda_build_v1_directories, find_matching_output},
Expand All @@ -30,7 +33,7 @@ use rattler_build::{
console_utils::LoggingOutputHandler,
hash::HashInfo,
metadata::{BuildConfiguration, Debug, Output, PlatformWithVirtualPackages},
recipe::{Jinja, ParsingError, Recipe, parser::find_outputs_from_src, variable::Variable},
recipe::{Jinja, ParsingError, Recipe, parser::find_outputs_from_src},
selectors::SelectorConfig,
tool_configuration::Configuration,
types::{PackageIdentifier, PackagingSettings},
Expand Down Expand Up @@ -79,7 +82,7 @@ impl Protocol for RattlerBuildBackend {
&selector_config_for_variants,
params.variant_files.iter().flatten().map(PathBuf::as_path),
)?
.extend_with_input_variants(&params.variant_configuration.unwrap_or_default());
.extend_with_input_variants(params.variant_configuration.unwrap_or_default());

// Find all outputs from the recipe
let output_nodes = find_outputs_from_src(self.recipe_source.clone())?;
Expand Down Expand Up @@ -163,16 +166,25 @@ impl Protocol for RattlerBuildBackend {
license_family: recipe.about.license_family,
noarch: recipe.build.noarch,
purls: None,
python_site_packages_path: None,
python_site_packages_path: recipe.build.python.site_packages_path.clone(),
variant: variant
.iter()
.map(|(k, v)| {
(
k.0.clone(),
pixi_build_types::VariantValue::from(v.to_string()),
)
.map(|(key, value)| {
Ok((
key.0.clone(),
convert_variant_to_pixi_build_types(value.clone()).into_diagnostic()
.with_context(|| {
format!("the output {}/{}={}={} contains a variant for '{}' which cannot be converted to pixi types: {}",
discovered_output.target_platform,
discovered_output.name,
discovered_output.version,
discovered_output.build_string,
key.0,
value)
})?
))
})
.collect(),
.collect::<miette::Result<_>>()?,
},
build_dependencies: Some(CondaOutputDependencies {
depends: convert_dependencies(
Expand Down Expand Up @@ -292,7 +304,7 @@ impl Protocol for RattlerBuildBackend {
.map(|(k, v)| {
(
k.as_str().into(),
vec![Variable::from_string(&v.to_string())],
vec![convert_variant_from_pixi_build_types(v.clone())],
)
})
.collect(),
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-api-version/recipe.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json
context:
name: pixi-build-api-version
version: "2"
version: "3"

package:
name: ${{ name }}
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-cmake/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements:
- if: unix
then: openssl
run:
- pixi-build-api-version >=2,<3
- pixi-build-api-version >=2,<4

tests:
- script: ${{ name }} --help
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-mojo/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements:
- if: unix
then: openssl
run:
- pixi-build-api-version >=2,<3
- pixi-build-api-version >=2,<4

tests:
- script: ${{ name }} --help
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-python/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements:
- if: unix
then: openssl
run:
- pixi-build-api-version >=2,<3
- pixi-build-api-version >=2,<4

tests:
- script: ${{ name }} --help
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-rattler-build/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements:
- if: unix
then: openssl
run:
- pixi-build-api-version >=0,<3
- pixi-build-api-version >=2,<4

tests:
- script: ${{ name }} --help
Expand Down
1 change: 0 additions & 1 deletion recipe/pixi-build-ros/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ requirements:
- py-rattler
- typing-extensions
- py-pixi-build-backend
- pixi-build-api-version >=2,<3

build:
number: 0
Expand Down
2 changes: 1 addition & 1 deletion recipe/pixi-build-rust/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements:
- if: unix
then: openssl
run:
- pixi-build-api-version >=2,<3
- pixi-build-api-version >=2,<4

tests:
- script: ${{ name }} --help
Expand Down
2 changes: 1 addition & 1 deletion recipe/py-pixi-build-backend/recipe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ requirements:

run:
- python >=3.8
- pixi-build-api-version >=2,<3
- pixi-build-api-version >=2,<4
ignore_run_exports:
from_package:
- cross-python_${{ target_platform }}
Expand Down
Loading
Loading