From 91d66e0bd81b793277f03ab65d3496d35bd83ab4 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 21 Aug 2025 23:54:39 +0100 Subject: [PATCH] Add file-to-CLI overrides for build isolation configuration (#15437) ## Summary Like #15395, but `--no-build-isolation`. --- crates/uv-cli/src/options.rs | 18 +- .../uv-configuration/src/package_options.rs | 52 ++ crates/uv-settings/src/combine.rs | 13 +- crates/uv-settings/src/settings.rs | 47 +- crates/uv/src/commands/build_frontend.rs | 36 +- crates/uv/src/commands/pip/compile.rs | 29 +- crates/uv/src/commands/pip/install.rs | 26 +- crates/uv/src/commands/pip/sync.rs | 26 +- crates/uv/src/commands/project/add.rs | 21 +- crates/uv/src/commands/project/lock.rs | 21 +- crates/uv/src/commands/project/mod.rs | 74 +-- crates/uv/src/commands/project/sync.rs | 18 +- crates/uv/src/commands/project/tree.rs | 3 +- crates/uv/src/lib.rs | 9 +- crates/uv/src/settings.rs | 48 +- crates/uv/tests/it/show_settings.rs | 524 ++++++++++++++---- 16 files changed, 660 insertions(+), 305 deletions(-) diff --git a/crates/uv-cli/src/options.rs b/crates/uv-cli/src/options.rs index 220ac8737..fe196ce68 100644 --- a/crates/uv-cli/src/options.rs +++ b/crates/uv-cli/src/options.rs @@ -1,7 +1,7 @@ use anstream::eprintln; use uv_cache::Refresh; -use uv_configuration::{Reinstall, Upgrade}; +use uv_configuration::{BuildIsolation, Reinstall, Upgrade}; use uv_distribution_types::{ConfigSettings, PackageConfigSettings, Requirement}; use uv_resolver::{ExcludeNewer, ExcludeNewerPackage, PrereleaseMode}; use uv_settings::{Combine, PipOptions, ResolverInstallerOptions, ResolverOptions}; @@ -355,8 +355,10 @@ pub fn resolver_options( .into_iter() .collect::() }), - no_build_isolation: flag(no_build_isolation, build_isolation, "build-isolation"), - no_build_isolation_package: Some(no_build_isolation_package), + build_isolation: BuildIsolation::from_args( + flag(no_build_isolation, build_isolation, "build-isolation"), + no_build_isolation_package, + ), extra_build_dependencies: None, extra_build_variables: None, exclude_newer: ExcludeNewer::from_args( @@ -470,12 +472,10 @@ pub fn resolver_installer_options( .into_iter() .collect::() }), - no_build_isolation: flag(no_build_isolation, build_isolation, "build-isolation"), - no_build_isolation_package: if no_build_isolation_package.is_empty() { - None - } else { - Some(no_build_isolation_package) - }, + build_isolation: BuildIsolation::from_args( + flag(no_build_isolation, build_isolation, "build-isolation"), + no_build_isolation_package, + ), extra_build_dependencies: None, extra_build_variables: None, exclude_newer, diff --git a/crates/uv-configuration/src/package_options.rs b/crates/uv-configuration/src/package_options.rs index 0e251186d..4cc2218f5 100644 --- a/crates/uv-configuration/src/package_options.rs +++ b/crates/uv-configuration/src/package_options.rs @@ -248,3 +248,55 @@ impl From for Refresh { } } } + +/// Whether to isolate builds. +#[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] +pub enum BuildIsolation { + /// Isolate all builds. + #[default] + Isolate, + + /// Do not isolate any builds. + Shared, + + /// Do not isolate builds for the specified packages. + SharedPackage(Vec), +} + +impl BuildIsolation { + /// Determine the build isolation strategy from the command-line arguments. + pub fn from_args( + no_build_isolation: Option, + no_build_isolation_package: Vec, + ) -> Option { + match no_build_isolation { + Some(true) => Some(Self::Shared), + Some(false) => Some(Self::Isolate), + None if no_build_isolation_package.is_empty() => None, + None => Some(Self::SharedPackage(no_build_isolation_package)), + } + } + + /// Combine a set of [`BuildIsolation`] values. + #[must_use] + pub fn combine(self, other: Self) -> Self { + match self { + // Setting `--build-isolation` or `--no-build-isolation` should clear previous `--no-build-isolation-package` selections. + Self::Isolate | Self::Shared => self, + Self::SharedPackage(self_packages) => match other { + // If `--no-build-isolation` was enabled previously, `--no-build-isolation-package` is subsumed by sharing all builds. + Self::Shared => other, + // If `--build-isolation` was enabled previously, then `--no-build-isolation-package` enables specific packages to be shared. + Self::Isolate => Self::SharedPackage(self_packages), + // If `--no-build-isolation-package` was included twice, combine the packages. + Self::SharedPackage(other_packages) => { + let mut combined = self_packages; + combined.extend(other_packages); + Self::SharedPackage(combined) + } + }, + } + } +} diff --git a/crates/uv-settings/src/combine.rs b/crates/uv-settings/src/combine.rs index 18a3574eb..00c597655 100644 --- a/crates/uv-settings/src/combine.rs +++ b/crates/uv-settings/src/combine.rs @@ -4,8 +4,8 @@ use std::{collections::BTreeMap, num::NonZeroUsize}; use url::Url; use uv_configuration::{ - ExportFormat, IndexStrategy, KeyringProviderType, Reinstall, RequiredVersion, TargetTriple, - TrustedPublishing, Upgrade, + BuildIsolation, ExportFormat, IndexStrategy, KeyringProviderType, Reinstall, RequiredVersion, + TargetTriple, TrustedPublishing, Upgrade, }; use uv_distribution_types::{ ConfigSettings, ExtraBuildVariables, Index, IndexUrl, PackageConfigSettings, PipExtraIndex, @@ -199,6 +199,15 @@ impl Combine for Option { } } +impl Combine for Option { + fn combine(self, other: Self) -> Self { + match (self, other) { + (Some(a), Some(b)) => Some(a.combine(b)), + (a, b) => a.or(b), + } + } +} + impl Combine for serde::de::IgnoredAny { fn combine(self, _other: Self) -> Self { self diff --git a/crates/uv-settings/src/settings.rs b/crates/uv-settings/src/settings.rs index 3680a531b..285b77cf7 100644 --- a/crates/uv-settings/src/settings.rs +++ b/crates/uv-settings/src/settings.rs @@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize}; use uv_cache_info::CacheKey; use uv_configuration::{ - IndexStrategy, KeyringProviderType, PackageNameSpecifier, Reinstall, RequiredVersion, - TargetTriple, TrustedHost, TrustedPublishing, Upgrade, + BuildIsolation, IndexStrategy, KeyringProviderType, PackageNameSpecifier, Reinstall, + RequiredVersion, TargetTriple, TrustedHost, TrustedPublishing, Upgrade, }; use uv_distribution_types::{ ConfigSettings, ExtraBuildVariables, Index, IndexUrl, IndexUrlError, PackageConfigSettings, @@ -341,13 +341,12 @@ pub struct InstallerOptions { pub exclude_newer: Option, pub link_mode: Option, pub compile_bytecode: Option, - pub reinstall: Option, - pub reinstall_package: Option>, + pub reinstall: Option, + pub build_isolation: Option, pub no_build: Option, pub no_build_package: Option>, pub no_binary: Option, pub no_binary_package: Option>, - pub no_build_isolation: Option, pub no_sources: Option, } @@ -370,12 +369,11 @@ pub struct ResolverOptions { pub exclude_newer: ExcludeNewer, pub link_mode: Option, pub upgrade: Option, + pub build_isolation: Option, pub no_build: Option, pub no_build_package: Option>, pub no_binary: Option, pub no_binary_package: Option>, - pub no_build_isolation: Option, - pub no_build_isolation_package: Option>, pub extra_build_dependencies: Option, pub extra_build_variables: Option, pub no_sources: Option, @@ -398,8 +396,7 @@ pub struct ResolverInstallerOptions { pub dependency_metadata: Option>, pub config_settings: Option, pub config_settings_package: Option, - pub no_build_isolation: Option, - pub no_build_isolation_package: Option>, + pub build_isolation: Option, pub extra_build_dependencies: Option, pub extra_build_variables: Option, pub exclude_newer: Option, @@ -463,8 +460,10 @@ impl From for ResolverInstallerOptions { dependency_metadata, config_settings, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation: BuildIsolation::from_args( + no_build_isolation, + no_build_isolation_package.into_iter().flatten().collect(), + ), extra_build_dependencies, extra_build_variables, exclude_newer, @@ -1897,8 +1896,10 @@ impl From for ResolverOptions { no_build_package: value.no_build_package, no_binary: value.no_binary, no_binary_package: value.no_binary_package, - no_build_isolation: value.no_build_isolation, - no_build_isolation_package: value.no_build_isolation_package, + build_isolation: BuildIsolation::from_args( + value.no_build_isolation, + value.no_build_isolation_package.unwrap_or_default(), + ), extra_build_dependencies: value.extra_build_dependencies, extra_build_variables: value.extra_build_variables, no_sources: value.no_sources, @@ -1929,13 +1930,18 @@ impl From for InstallerOptions { .global, link_mode: value.link_mode, compile_bytecode: value.compile_bytecode, - reinstall: value.reinstall, - reinstall_package: value.reinstall_package, + reinstall: Reinstall::from_args( + value.reinstall, + value.reinstall_package.unwrap_or_default(), + ), + build_isolation: BuildIsolation::from_args( + value.no_build_isolation, + value.no_build_isolation_package.unwrap_or_default(), + ), no_build: value.no_build, no_build_package: value.no_build_package, no_binary: value.no_binary, no_binary_package: value.no_binary_package, - no_build_isolation: value.no_build_isolation, no_sources: value.no_sources, } } @@ -1964,8 +1970,7 @@ pub struct ToolOptions { pub dependency_metadata: Option>, pub config_settings: Option, pub config_settings_package: Option, - pub no_build_isolation: Option, - pub no_build_isolation_package: Option>, + pub build_isolation: Option, pub extra_build_dependencies: Option, pub extra_build_variables: Option, pub exclude_newer: Option, @@ -1995,8 +2000,7 @@ impl From for ToolOptions { dependency_metadata: value.dependency_metadata, config_settings: value.config_settings, config_settings_package: value.config_settings_package, - no_build_isolation: value.no_build_isolation, - no_build_isolation_package: value.no_build_isolation_package, + build_isolation: value.build_isolation, extra_build_dependencies: value.extra_build_dependencies, extra_build_variables: value.extra_build_variables, exclude_newer: value.exclude_newer, @@ -2028,8 +2032,7 @@ impl From for ResolverInstallerOptions { dependency_metadata: value.dependency_metadata, config_settings: value.config_settings, config_settings_package: value.config_settings_package, - no_build_isolation: value.no_build_isolation, - no_build_isolation_package: value.no_build_isolation_package, + build_isolation: value.build_isolation, extra_build_dependencies: value.extra_build_dependencies, extra_build_variables: value.extra_build_variables, exclude_newer: value.exclude_newer, diff --git a/crates/uv/src/commands/build_frontend.rs b/crates/uv/src/commands/build_frontend.rs index 230a0eca9..61564ec99 100644 --- a/crates/uv/src/commands/build_frontend.rs +++ b/crates/uv/src/commands/build_frontend.rs @@ -14,8 +14,9 @@ use uv_build_backend::check_direct_build; use uv_cache::{Cache, CacheBucket}; use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - BuildKind, BuildOptions, BuildOutput, Concurrency, Constraints, DependencyGroupsWithDefaults, - HashCheckingMode, IndexStrategy, KeyringProviderType, Preview, SourceStrategy, + BuildIsolation, BuildKind, BuildOptions, BuildOutput, Concurrency, Constraints, + DependencyGroupsWithDefaults, HashCheckingMode, IndexStrategy, KeyringProviderType, Preview, + SourceStrategy, }; use uv_dispatch::{BuildDispatch, SharedState}; use uv_distribution::LoweredExtraBuildDependencies; @@ -38,7 +39,7 @@ use uv_python::{ use uv_requirements::RequirementsSource; use uv_resolver::{ExcludeNewer, FlatIndex}; use uv_settings::PythonInstallMirrors; -use uv_types::{AnyErrorBuild, BuildContext, BuildIsolation, BuildStack, HashStrategy}; +use uv_types::{AnyErrorBuild, BuildContext, BuildStack, HashStrategy}; use uv_workspace::pyproject::ExtraBuildDependencies; use uv_workspace::{DiscoveryOptions, Workspace, WorkspaceCache, WorkspaceError}; @@ -200,8 +201,7 @@ async fn build_impl( dependency_metadata, config_setting, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, exclude_newer, @@ -348,8 +348,7 @@ async fn build_impl( build_logs, force_pep517, build_constraints, - *no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, *index_strategy, @@ -450,8 +449,7 @@ async fn build_package( build_logs: bool, force_pep517: bool, build_constraints: &[RequirementsSource], - no_build_isolation: bool, - no_build_isolation_package: &[PackageName], + build_isolation: &BuildIsolation, extra_build_dependencies: &ExtraBuildDependencies, extra_build_variables: &ExtraBuildVariables, index_strategy: IndexStrategy, @@ -566,14 +564,16 @@ async fn build_package( // Determine whether to enable build isolation. let environment; - let build_isolation = if no_build_isolation { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::SharedPackage(&environment, no_build_isolation_package) + let types_build_isolation = match build_isolation { + BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated, + BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + uv_types::BuildIsolation::Shared(&environment) + } + BuildIsolation::SharedPackage(packages) => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + uv_types::BuildIsolation::SharedPackage(&environment, packages) + } }; // Resolve the flat indexes from `--find-links`. @@ -606,7 +606,7 @@ async fn build_package( index_strategy, config_setting, config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, diff --git a/crates/uv/src/commands/pip/compile.rs b/crates/uv/src/commands/pip/compile.rs index 40aaaca3c..5b1a32400 100644 --- a/crates/uv/src/commands/pip/compile.rs +++ b/crates/uv/src/commands/pip/compile.rs @@ -13,8 +13,8 @@ use tracing::debug; use uv_cache::Cache; use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - BuildOptions, Concurrency, Constraints, ExportFormat, ExtrasSpecification, IndexStrategy, - NoBinary, NoBuild, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, + BuildIsolation, BuildOptions, Concurrency, Constraints, ExportFormat, ExtrasSpecification, + IndexStrategy, NoBinary, NoBuild, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::{BuildDispatch, SharedState}; @@ -45,7 +45,7 @@ use uv_resolver::{ }; use uv_static::EnvVars; use uv_torch::{TorchMode, TorchStrategy}; -use uv_types::{BuildIsolation, EmptyInstalledPackages, HashStrategy}; +use uv_types::{EmptyInstalledPackages, HashStrategy}; use uv_warnings::{warn_user, warn_user_once}; use uv_workspace::WorkspaceCache; use uv_workspace::pyproject::ExtraBuildDependencies; @@ -96,8 +96,7 @@ pub(crate) async fn pip_compile( network_settings: &NetworkSettings, config_settings: ConfigSettings, config_settings_package: PackageConfigSettings, - no_build_isolation: bool, - no_build_isolation_package: Vec, + build_isolation: BuildIsolation, extra_build_dependencies: &ExtraBuildDependencies, extra_build_variables: &ExtraBuildVariables, build_options: BuildOptions, @@ -466,14 +465,16 @@ pub(crate) async fn pip_compile( // Determine whether to enable build isolation. let environment; - let build_isolation = if no_build_isolation { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::SharedPackage(&environment, &no_build_isolation_package) + let types_build_isolation = match build_isolation { + BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated, + BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + uv_types::BuildIsolation::Shared(&environment) + } + BuildIsolation::SharedPackage(ref packages) => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + uv_types::BuildIsolation::SharedPackage(&environment, packages) + } }; // Don't enforce hashes in `pip compile`. @@ -502,7 +503,7 @@ pub(crate) async fn pip_compile( index_strategy, &config_settings, &config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, diff --git a/crates/uv/src/commands/pip/install.rs b/crates/uv/src/commands/pip/install.rs index 2ee1ddc2d..456e664e6 100644 --- a/crates/uv/src/commands/pip/install.rs +++ b/crates/uv/src/commands/pip/install.rs @@ -9,8 +9,8 @@ use tracing::{Level, debug, enabled, warn}; use uv_cache::Cache; use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - BuildOptions, Concurrency, Constraints, DryRun, ExtrasSpecification, HashCheckingMode, - IndexStrategy, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, + BuildIsolation, BuildOptions, Concurrency, Constraints, DryRun, ExtrasSpecification, + HashCheckingMode, IndexStrategy, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::{BuildDispatch, SharedState}; @@ -24,7 +24,6 @@ use uv_fs::Simplified; use uv_install_wheel::LinkMode; use uv_installer::{SatisfiesResult, SitePackages}; use uv_normalize::{DefaultExtras, DefaultGroups}; -use uv_pep508::PackageName; use uv_pypi_types::Conflicts; use uv_python::{ EnvironmentPreference, Prefix, PythonEnvironment, PythonInstallation, PythonPreference, @@ -36,7 +35,7 @@ use uv_resolver::{ PythonRequirement, ResolutionMode, ResolverEnvironment, }; use uv_torch::{TorchMode, TorchStrategy}; -use uv_types::{BuildIsolation, HashStrategy}; +use uv_types::HashStrategy; use uv_warnings::{warn_user, warn_user_once}; use uv_workspace::WorkspaceCache; use uv_workspace::pyproject::ExtraBuildDependencies; @@ -78,8 +77,7 @@ pub(crate) async fn pip_install( installer_metadata: bool, config_settings: &ConfigSettings, config_settings_package: &PackageConfigSettings, - no_build_isolation: bool, - no_build_isolation_package: Vec, + build_isolation: BuildIsolation, extra_build_dependencies: &ExtraBuildDependencies, extra_build_variables: &ExtraBuildVariables, build_options: BuildOptions, @@ -409,12 +407,12 @@ pub(crate) async fn pip_install( }; // Determine whether to enable build isolation. - let build_isolation = if no_build_isolation { - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - BuildIsolation::SharedPackage(&environment, &no_build_isolation_package) + let types_build_isolation = match build_isolation { + BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated, + BuildIsolation::Shared => uv_types::BuildIsolation::Shared(&environment), + BuildIsolation::SharedPackage(ref packages) => { + uv_types::BuildIsolation::SharedPackage(&environment, packages) + } }; // Enforce (but never require) the build constraints, if `--require-hashes` or `--verify-hashes` @@ -453,7 +451,7 @@ pub(crate) async fn pip_install( index_strategy, config_settings, config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, @@ -586,7 +584,7 @@ pub(crate) async fn pip_install( index_strategy, config_settings, config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, diff --git a/crates/uv/src/commands/pip/sync.rs b/crates/uv/src/commands/pip/sync.rs index 29363e72a..46d5a5e0e 100644 --- a/crates/uv/src/commands/pip/sync.rs +++ b/crates/uv/src/commands/pip/sync.rs @@ -8,8 +8,8 @@ use tracing::{debug, warn}; use uv_cache::Cache; use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - BuildOptions, Concurrency, Constraints, DryRun, ExtrasSpecification, HashCheckingMode, - IndexStrategy, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, + BuildIsolation, BuildOptions, Concurrency, Constraints, DryRun, ExtrasSpecification, + HashCheckingMode, IndexStrategy, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::{BuildDispatch, SharedState}; @@ -22,7 +22,6 @@ use uv_fs::Simplified; use uv_install_wheel::LinkMode; use uv_installer::SitePackages; use uv_normalize::{DefaultExtras, DefaultGroups}; -use uv_pep508::PackageName; use uv_pypi_types::Conflicts; use uv_python::{ EnvironmentPreference, Prefix, PythonEnvironment, PythonInstallation, PythonPreference, @@ -34,7 +33,7 @@ use uv_resolver::{ PythonRequirement, ResolutionMode, ResolverEnvironment, }; use uv_torch::{TorchMode, TorchStrategy}; -use uv_types::{BuildIsolation, HashStrategy}; +use uv_types::HashStrategy; use uv_warnings::{warn_user, warn_user_once}; use uv_workspace::WorkspaceCache; use uv_workspace::pyproject::ExtraBuildDependencies; @@ -69,8 +68,7 @@ pub(crate) async fn pip_sync( installer_metadata: bool, config_settings: &ConfigSettings, config_settings_package: &PackageConfigSettings, - no_build_isolation: bool, - no_build_isolation_package: Vec, + build_isolation: BuildIsolation, extra_build_dependencies: &ExtraBuildDependencies, extra_build_variables: &ExtraBuildVariables, build_options: BuildOptions, @@ -332,12 +330,12 @@ pub(crate) async fn pip_sync( }; // Determine whether to enable build isolation. - let build_isolation = if no_build_isolation { - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - BuildIsolation::SharedPackage(&environment, &no_build_isolation_package) + let types_build_isolation = match build_isolation { + BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated, + BuildIsolation::Shared => uv_types::BuildIsolation::Shared(&environment), + BuildIsolation::SharedPackage(ref packages) => { + uv_types::BuildIsolation::SharedPackage(&environment, packages) + } }; // Enforce (but never require) the build constraints, if `--require-hashes` or `--verify-hashes` @@ -381,7 +379,7 @@ pub(crate) async fn pip_sync( index_strategy, config_settings, config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, @@ -516,7 +514,7 @@ pub(crate) async fn pip_sync( index_strategy, config_settings, config_settings_package, - build_isolation, + types_build_isolation, &extra_build_requires, extra_build_variables, link_mode, diff --git a/crates/uv/src/commands/project/add.rs b/crates/uv/src/commands/project/add.rs index df986d54d..dba510ea1 100644 --- a/crates/uv/src/commands/project/add.rs +++ b/crates/uv/src/commands/project/add.rs @@ -409,17 +409,16 @@ pub(crate) async fn add( // Determine whether to enable build isolation. let environment; - let build_isolation = if settings.resolver.no_build_isolation { - environment = PythonEnvironment::from_interpreter(target.interpreter().clone()); - BuildIsolation::Shared(&environment) - } else if settings.resolver.no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(target.interpreter().clone()); - BuildIsolation::SharedPackage( - &environment, - &settings.resolver.no_build_isolation_package, - ) + let build_isolation = match &settings.resolver.build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(target.interpreter().clone()); + BuildIsolation::Shared(&environment) + } + uv_configuration::BuildIsolation::SharedPackage(packages) => { + environment = PythonEnvironment::from_interpreter(target.interpreter().clone()); + BuildIsolation::SharedPackage(&environment, packages) + } }; // Resolve the flat indexes from `--find-links`. diff --git a/crates/uv/src/commands/project/lock.rs b/crates/uv/src/commands/project/lock.rs index 6c021bf14..54c38c589 100644 --- a/crates/uv/src/commands/project/lock.rs +++ b/crates/uv/src/commands/project/lock.rs @@ -433,8 +433,7 @@ async fn do_lock( dependency_metadata, config_setting, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, exclude_newer, @@ -651,14 +650,16 @@ async fn do_lock( // Determine whether to enable build isolation. let environment; - let build_isolation = if *no_build_isolation { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::SharedPackage(&environment, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::Shared(&environment) + } + uv_configuration::BuildIsolation::SharedPackage(packages) => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::SharedPackage(&environment, packages) + } }; let options = OptionsBuilder::new() diff --git a/crates/uv/src/commands/project/mod.rs b/crates/uv/src/commands/project/mod.rs index e90f8e5eb..4807b8fb4 100644 --- a/crates/uv/src/commands/project/mod.rs +++ b/crates/uv/src/commands/project/mod.rs @@ -1707,8 +1707,7 @@ pub(crate) async fn resolve_names( index_strategy, keyring_provider, link_mode, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, prerelease: _, @@ -1741,14 +1740,16 @@ pub(crate) async fn resolve_names( // Determine whether to enable build isolation. let environment; - let build_isolation = if *no_build_isolation { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::SharedPackage(&environment, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::Shared(&environment) + } + uv_configuration::BuildIsolation::SharedPackage(packages) => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::SharedPackage(&environment, packages) + } }; // TODO(charlie): These are all default values. We should consider whether we want to make them @@ -1869,8 +1870,7 @@ pub(crate) async fn resolve_environment( dependency_metadata, config_setting, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, exclude_newer, @@ -1915,14 +1915,16 @@ pub(crate) async fn resolve_environment( // Determine whether to enable build isolation. let environment; - let build_isolation = if *no_build_isolation { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::Shared(&environment) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - environment = PythonEnvironment::from_interpreter(interpreter.clone()); - BuildIsolation::SharedPackage(&environment, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::Shared(&environment) + } + uv_configuration::BuildIsolation::SharedPackage(packages) => { + environment = PythonEnvironment::from_interpreter(interpreter.clone()); + BuildIsolation::SharedPackage(&environment, packages) + } }; let options = OptionsBuilder::new() @@ -2061,8 +2063,7 @@ pub(crate) async fn sync_environment( dependency_metadata, config_setting, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, exclude_newer, @@ -2098,12 +2099,12 @@ pub(crate) async fn sync_environment( .build(); // Determine whether to enable build isolation. - let build_isolation = if no_build_isolation { - BuildIsolation::Shared(&venv) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - BuildIsolation::SharedPackage(&venv, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => BuildIsolation::Shared(&venv), + uv_configuration::BuildIsolation::SharedPackage(packages) => { + BuildIsolation::SharedPackage(&venv, packages) + } }; // TODO(charlie): These are all default values. We should consider whether we want to make them @@ -2146,7 +2147,7 @@ pub(crate) async fn sync_environment( link_mode, build_options, &build_hasher, - exclude_newer, + exclude_newer.clone(), sources, workspace_cache, concurrency, @@ -2235,8 +2236,7 @@ pub(crate) async fn update_environment( index_strategy, keyring_provider, link_mode, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies: _, extra_build_variables, prerelease, @@ -2325,12 +2325,12 @@ pub(crate) async fn update_environment( .build(); // Determine whether to enable build isolation. - let build_isolation = if *no_build_isolation { - BuildIsolation::Shared(&venv) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - BuildIsolation::SharedPackage(&venv, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => BuildIsolation::Shared(&venv), + uv_configuration::BuildIsolation::SharedPackage(packages) => { + BuildIsolation::SharedPackage(&venv, packages) + } }; let options = OptionsBuilder::new() diff --git a/crates/uv/src/commands/project/sync.rs b/crates/uv/src/commands/project/sync.rs index ea1fa359f..3eb07d79b 100644 --- a/crates/uv/src/commands/project/sync.rs +++ b/crates/uv/src/commands/project/sync.rs @@ -583,8 +583,7 @@ pub(super) async fn do_sync( dependency_metadata, config_setting, config_settings_package, - no_build_isolation, - no_build_isolation_package, + build_isolation, extra_build_dependencies, extra_build_variables, exclude_newer, @@ -629,8 +628,7 @@ pub(super) async fn do_sync( index_strategy, keyring_provider, link_mode, - no_build_isolation, - no_build_isolation_package: no_build_isolation_package.to_vec(), + build_isolation: build_isolation.clone(), extra_build_dependencies: extra_build_dependencies.clone(), extra_build_variables: extra_build_variables.clone(), prerelease: PrereleaseMode::default(), @@ -733,12 +731,12 @@ pub(super) async fn do_sync( .build(); // Determine whether to enable build isolation. - let build_isolation = if no_build_isolation { - BuildIsolation::Shared(venv) - } else if no_build_isolation_package.is_empty() { - BuildIsolation::Isolated - } else { - BuildIsolation::SharedPackage(venv, no_build_isolation_package) + let build_isolation = match build_isolation { + uv_configuration::BuildIsolation::Isolate => BuildIsolation::Isolated, + uv_configuration::BuildIsolation::Shared => BuildIsolation::Shared(venv), + uv_configuration::BuildIsolation::SharedPackage(packages) => { + BuildIsolation::SharedPackage(venv, packages) + } }; // Read the build constraints from the lockfile. diff --git a/crates/uv/src/commands/project/tree.rs b/crates/uv/src/commands/project/tree.rs index 2fff48e46..a46c8affd 100644 --- a/crates/uv/src/commands/project/tree.rs +++ b/crates/uv/src/commands/project/tree.rs @@ -201,8 +201,7 @@ pub(crate) async fn tree( dependency_metadata: _, config_setting: _, config_settings_package: _, - no_build_isolation: _, - no_build_isolation_package: _, + build_isolation: _, extra_build_dependencies: _, extra_build_variables: _, exclude_newer: _, diff --git a/crates/uv/src/lib.rs b/crates/uv/src/lib.rs index 48c46788d..5aa42e2d4 100644 --- a/crates/uv/src/lib.rs +++ b/crates/uv/src/lib.rs @@ -514,8 +514,7 @@ async fn run(mut cli: Cli) -> Result { &globals.network_settings, args.settings.config_setting, args.settings.config_settings_package, - args.settings.no_build_isolation, - args.settings.no_build_isolation_package, + args.settings.build_isolation.clone(), &args.settings.extra_build_dependencies, &args.settings.extra_build_variables, args.settings.build_options, @@ -593,8 +592,7 @@ async fn run(mut cli: Cli) -> Result { globals.installer_metadata, &args.settings.config_setting, &args.settings.config_settings_package, - args.settings.no_build_isolation, - args.settings.no_build_isolation_package, + args.settings.build_isolation.clone(), &args.settings.extra_build_dependencies, &args.settings.extra_build_variables, args.settings.build_options, @@ -737,8 +735,7 @@ async fn run(mut cli: Cli) -> Result { globals.installer_metadata, &args.settings.config_setting, &args.settings.config_settings_package, - args.settings.no_build_isolation, - args.settings.no_build_isolation_package, + args.settings.build_isolation.clone(), &args.settings.extra_build_dependencies, &args.settings.extra_build_variables, args.settings.build_options, diff --git a/crates/uv/src/settings.rs b/crates/uv/src/settings.rs index df802b5dc..12b027b65 100644 --- a/crates/uv/src/settings.rs +++ b/crates/uv/src/settings.rs @@ -21,10 +21,11 @@ use uv_cli::{ }; use uv_client::Connectivity; use uv_configuration::{ - BuildOptions, Concurrency, DependencyGroups, DryRun, EditableMode, ExportFormat, - ExtrasSpecification, HashCheckingMode, IndexStrategy, InstallOptions, KeyringProviderType, - NoBinary, NoBuild, Preview, ProjectBuildBackend, Reinstall, RequiredVersion, SourceStrategy, - TargetTriple, TrustedHost, TrustedPublishing, Upgrade, VersionControlSystem, + BuildIsolation, BuildOptions, Concurrency, DependencyGroups, DryRun, EditableMode, + ExportFormat, ExtrasSpecification, HashCheckingMode, IndexStrategy, InstallOptions, + KeyringProviderType, NoBinary, NoBuild, Preview, ProjectBuildBackend, Reinstall, + RequiredVersion, SourceStrategy, TargetTriple, TrustedHost, TrustedPublishing, Upgrade, + VersionControlSystem, }; use uv_distribution_types::{ ConfigSettings, DependencyMetadata, ExtraBuildVariables, Index, IndexLocations, IndexUrl, @@ -2761,11 +2762,10 @@ pub(crate) struct InstallerSettingsRef<'a> { pub(crate) dependency_metadata: &'a DependencyMetadata, pub(crate) config_setting: &'a ConfigSettings, pub(crate) config_settings_package: &'a PackageConfigSettings, - pub(crate) no_build_isolation: bool, - pub(crate) no_build_isolation_package: &'a [PackageName], + pub(crate) build_isolation: &'a BuildIsolation, pub(crate) extra_build_dependencies: &'a ExtraBuildDependencies, pub(crate) extra_build_variables: &'a ExtraBuildVariables, - pub(crate) exclude_newer: ExcludeNewer, + pub(crate) exclude_newer: &'a ExcludeNewer, pub(crate) link_mode: LinkMode, pub(crate) compile_bytecode: bool, pub(crate) reinstall: &'a Reinstall, @@ -2789,8 +2789,7 @@ pub(crate) struct ResolverSettings { pub(crate) index_strategy: IndexStrategy, pub(crate) keyring_provider: KeyringProviderType, pub(crate) link_mode: LinkMode, - pub(crate) no_build_isolation: bool, - pub(crate) no_build_isolation_package: Vec, + pub(crate) build_isolation: BuildIsolation, pub(crate) extra_build_dependencies: ExtraBuildDependencies, pub(crate) extra_build_variables: ExtraBuildVariables, pub(crate) prerelease: PrereleaseMode, @@ -2845,8 +2844,7 @@ impl From for ResolverSettings { keyring_provider: value.keyring_provider.unwrap_or_default(), config_setting: value.config_settings.unwrap_or_default(), config_settings_package: value.config_settings_package.unwrap_or_default(), - no_build_isolation: value.no_build_isolation.unwrap_or_default(), - no_build_isolation_package: value.no_build_isolation_package.unwrap_or_default(), + build_isolation: value.build_isolation.unwrap_or_default(), extra_build_dependencies: value.extra_build_dependencies.unwrap_or_default(), extra_build_variables: value.extra_build_variables.unwrap_or_default(), exclude_newer: value.exclude_newer, @@ -2936,8 +2934,7 @@ impl From for ResolverInstallerSettings { index_strategy: value.index_strategy.unwrap_or_default(), keyring_provider: value.keyring_provider.unwrap_or_default(), link_mode: value.link_mode.unwrap_or_default(), - no_build_isolation: value.no_build_isolation.unwrap_or_default(), - no_build_isolation_package: value.no_build_isolation_package.unwrap_or_default(), + build_isolation: value.build_isolation.unwrap_or_default(), extra_build_dependencies: value.extra_build_dependencies.unwrap_or_default(), extra_build_variables: value.extra_build_variables.unwrap_or_default(), prerelease: value.prerelease.unwrap_or_default(), @@ -2969,8 +2966,7 @@ pub(crate) struct PipSettings { pub(crate) index_strategy: IndexStrategy, pub(crate) keyring_provider: KeyringProviderType, pub(crate) torch_backend: Option, - pub(crate) no_build_isolation: bool, - pub(crate) no_build_isolation_package: Vec, + pub(crate) build_isolation: BuildIsolation, pub(crate) extra_build_dependencies: ExtraBuildDependencies, pub(crate) extra_build_variables: ExtraBuildVariables, pub(crate) build_options: BuildOptions, @@ -3237,14 +3233,15 @@ impl PipSettings { .allow_empty_requirements .combine(allow_empty_requirements) .unwrap_or_default(), - no_build_isolation: args - .no_build_isolation - .combine(no_build_isolation) - .unwrap_or_default(), - no_build_isolation_package: args - .no_build_isolation_package - .combine(no_build_isolation_package) - .unwrap_or_default(), + build_isolation: BuildIsolation::from_args( + args.no_build_isolation, + args.no_build_isolation_package.unwrap_or_default(), + ) + .combine(BuildIsolation::from_args( + no_build_isolation, + no_build_isolation_package.unwrap_or_default(), + )) + .unwrap_or_default(), extra_build_dependencies: args .extra_build_dependencies .combine(extra_build_dependencies) @@ -3369,11 +3366,10 @@ impl<'a> From<&'a ResolverInstallerSettings> for InstallerSettingsRef<'a> { dependency_metadata: &settings.resolver.dependency_metadata, config_setting: &settings.resolver.config_setting, config_settings_package: &settings.resolver.config_settings_package, - no_build_isolation: settings.resolver.no_build_isolation, - no_build_isolation_package: &settings.resolver.no_build_isolation_package, + build_isolation: &settings.resolver.build_isolation, extra_build_dependencies: &settings.resolver.extra_build_dependencies, extra_build_variables: &settings.resolver.extra_build_variables, - exclude_newer: settings.resolver.exclude_newer.clone(), + exclude_newer: &settings.resolver.exclude_newer, link_mode: settings.resolver.link_mode, compile_bytecode: settings.compile_bytecode, reinstall: &settings.reinstall, diff --git a/crates/uv/tests/it/show_settings.rs b/crates/uv/tests/it/show_settings.rs index dbc4e926d..abf5589f0 100644 --- a/crates/uv/tests/it/show_settings.rs +++ b/crates/uv/tests/it/show_settings.rs @@ -184,8 +184,7 @@ fn resolve_uv_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -384,8 +383,7 @@ fn resolve_uv_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -585,8 +583,7 @@ fn resolve_uv_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -818,8 +815,7 @@ fn resolve_pyproject_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -986,8 +982,7 @@ fn resolve_pyproject_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -1198,8 +1193,7 @@ fn resolve_pyproject_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -1458,8 +1452,7 @@ fn resolve_index_url() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -1728,8 +1721,7 @@ fn resolve_index_url() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -1953,8 +1945,7 @@ fn resolve_find_links() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -2143,8 +2134,7 @@ fn resolve_top_level() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -2393,8 +2383,7 @@ fn resolve_top_level() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -2626,8 +2615,7 @@ fn resolve_top_level() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -2815,8 +2803,7 @@ fn resolve_user_configuration() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -2988,8 +2975,7 @@ fn resolve_user_configuration() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -3161,8 +3147,7 @@ fn resolve_user_configuration() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -3336,8 +3321,7 @@ fn resolve_user_configuration() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -3504,8 +3488,7 @@ fn resolve_tool() -> anyhow::Result<()> { dependency_metadata: None, config_settings: None, config_settings_package: None, - no_build_isolation: None, - no_build_isolation_package: None, + build_isolation: None, extra_build_dependencies: None, extra_build_variables: None, exclude_newer: None, @@ -3552,8 +3535,7 @@ fn resolve_tool() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -3716,8 +3698,7 @@ fn resolve_poetry_toml() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -3957,8 +3938,7 @@ fn resolve_both() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -4202,8 +4182,7 @@ fn resolve_both_special_fields() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -4526,8 +4505,7 @@ fn resolve_config_file() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -4792,8 +4770,7 @@ fn resolve_skip_empty() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -4968,8 +4945,7 @@ fn resolve_skip_empty() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -5163,8 +5139,7 @@ fn allow_insecure_host() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -5419,8 +5394,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -5654,8 +5628,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -5895,8 +5868,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -6131,8 +6103,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -6374,8 +6345,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -6610,8 +6580,7 @@ fn index_priority() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -6790,8 +6759,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -6956,8 +6924,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7120,8 +7087,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7286,8 +7252,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7450,8 +7415,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7615,8 +7579,7 @@ fn verify_hashes() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7789,8 +7752,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -7902,8 +7864,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8015,8 +7976,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8128,8 +8088,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8241,8 +8200,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8356,8 +8314,7 @@ fn preview_features() { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8496,8 +8453,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8670,8 +8626,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -8867,8 +8822,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9039,8 +8993,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9205,8 +9158,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9372,8 +9324,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, torch_backend: None, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9591,8 +9542,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9709,8 +9659,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9850,8 +9799,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -9966,8 +9914,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -10072,8 +10019,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -10179,8 +10125,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { index_strategy: FirstIndex, keyring_provider: Disabled, link_mode: Clone, - no_build_isolation: false, - no_build_isolation_package: [], + build_isolation: Isolate, extra_build_dependencies: ExtraBuildDependencies( {}, ), @@ -10243,3 +10188,362 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { Ok(()) } + +/// Test that setting `build-isolation = true` in pyproject.toml followed by +/// `--no-build-isolation-package numpy` on the CLI disables build isolation for `numpy`. +#[test] +#[cfg_attr( + windows, + ignore = "Configuration tests are not yet supported on Windows" +)] +fn build_isolation_override() -> anyhow::Result<()> { + let context = TestContext::new("3.12"); + + // Write a `uv.toml` file to disable build isolation. + let uv_toml = context.temp_dir.child("uv.toml"); + uv_toml.write_str(indoc::indoc! {r" + no-build-isolation = true + "})?; + + let requirements_in = context.temp_dir.child("requirements.in"); + requirements_in.write_str("numpy")?; + + uv_snapshot!(context.filters(), add_shared_args(context.pip_compile(), context.temp_dir.path()) + .arg("--show-settings") + .arg("requirements.in") + .arg("--no-build-isolation-package").arg("numpy"), @r#" + success: true + exit_code: 0 + ----- stdout ----- + GlobalSettings { + required_version: None, + quiet: 0, + verbose: 0, + color: Auto, + network_settings: NetworkSettings { + connectivity: Online, + native_tls: false, + allow_insecure_host: [], + }, + concurrency: Concurrency { + downloads: 50, + builds: 16, + installs: 8, + }, + show_settings: true, + preview: Preview { + flags: PreviewFeatures( + 0x0, + ), + }, + python_preference: Managed, + python_downloads: Automatic, + no_progress: false, + installer_metadata: true, + } + CacheSettings { + no_cache: false, + cache_dir: Some( + "[CACHE_DIR]/", + ), + } + PipCompileSettings { + format: None, + src_file: [ + "requirements.in", + ], + constraints: [], + overrides: [], + build_constraints: [], + constraints_from_workspace: [], + overrides_from_workspace: [], + build_constraints_from_workspace: [], + environments: SupportedEnvironments( + [], + ), + refresh: None( + Timestamp( + SystemTime { + tv_sec: [TIME], + tv_nsec: [TIME], + }, + ), + ), + settings: PipSettings { + index_locations: IndexLocations { + indexes: [], + flat_index: [], + no_index: false, + }, + python: None, + install_mirrors: PythonInstallMirrors { + python_install_mirror: None, + pypy_install_mirror: None, + python_downloads_json_url: None, + }, + system: false, + extras: ExtrasSpecification( + ExtrasSpecificationInner { + include: Some( + [], + ), + exclude: [], + only_extras: false, + history: ExtrasSpecificationHistory { + extra: [], + only_extra: [], + no_extra: [], + all_extras: false, + no_default_extras: false, + defaults: List( + [], + ), + }, + }, + ), + groups: [], + break_system_packages: false, + target: None, + prefix: None, + index_strategy: FirstIndex, + keyring_provider: Disabled, + torch_backend: None, + build_isolation: Shared, + extra_build_dependencies: ExtraBuildDependencies( + {}, + ), + extra_build_variables: ExtraBuildVariables( + {}, + ), + build_options: BuildOptions { + no_binary: None, + no_build: None, + }, + allow_empty_requirements: false, + strict: false, + dependency_mode: Transitive, + resolution: Highest, + prerelease: IfNecessaryOrExplicit, + fork_strategy: RequiresPython, + dependency_metadata: DependencyMetadata( + {}, + ), + output_file: None, + no_strip_extras: false, + no_strip_markers: false, + no_annotate: false, + no_header: false, + custom_compile_command: None, + generate_hashes: false, + config_setting: ConfigSettings( + {}, + ), + config_settings_package: PackageConfigSettings( + {}, + ), + python_version: None, + python_platform: None, + universal: false, + exclude_newer: ExcludeNewer { + global: None, + package: ExcludeNewerPackage( + {}, + ), + }, + no_emit_package: [], + emit_index_url: false, + emit_find_links: false, + emit_build_options: false, + emit_marker_expression: false, + emit_index_annotation: false, + annotation_style: Split, + link_mode: Clone, + compile_bytecode: false, + sources: Enabled, + hash_checking: Some( + Verify, + ), + upgrade: None, + reinstall: None, + }, + } + + ----- stderr ----- + "#); + + // Now enable build isolation for all packages except `numpy`. + uv_toml.write_str(indoc::indoc! {r" + no-build-isolation = false + "})?; + + uv_snapshot!(context.filters(), add_shared_args(context.pip_compile(), context.temp_dir.path()) + .arg("--show-settings") + .arg("requirements.in") + .arg("--no-build-isolation-package").arg("numpy"), @r#" + success: true + exit_code: 0 + ----- stdout ----- + GlobalSettings { + required_version: None, + quiet: 0, + verbose: 0, + color: Auto, + network_settings: NetworkSettings { + connectivity: Online, + native_tls: false, + allow_insecure_host: [], + }, + concurrency: Concurrency { + downloads: 50, + builds: 16, + installs: 8, + }, + show_settings: true, + preview: Preview { + flags: PreviewFeatures( + 0x0, + ), + }, + python_preference: Managed, + python_downloads: Automatic, + no_progress: false, + installer_metadata: true, + } + CacheSettings { + no_cache: false, + cache_dir: Some( + "[CACHE_DIR]/", + ), + } + PipCompileSettings { + format: None, + src_file: [ + "requirements.in", + ], + constraints: [], + overrides: [], + build_constraints: [], + constraints_from_workspace: [], + overrides_from_workspace: [], + build_constraints_from_workspace: [], + environments: SupportedEnvironments( + [], + ), + refresh: None( + Timestamp( + SystemTime { + tv_sec: [TIME], + tv_nsec: [TIME], + }, + ), + ), + settings: PipSettings { + index_locations: IndexLocations { + indexes: [], + flat_index: [], + no_index: false, + }, + python: None, + install_mirrors: PythonInstallMirrors { + python_install_mirror: None, + pypy_install_mirror: None, + python_downloads_json_url: None, + }, + system: false, + extras: ExtrasSpecification( + ExtrasSpecificationInner { + include: Some( + [], + ), + exclude: [], + only_extras: false, + history: ExtrasSpecificationHistory { + extra: [], + only_extra: [], + no_extra: [], + all_extras: false, + no_default_extras: false, + defaults: List( + [], + ), + }, + }, + ), + groups: [], + break_system_packages: false, + target: None, + prefix: None, + index_strategy: FirstIndex, + keyring_provider: Disabled, + torch_backend: None, + build_isolation: SharedPackage( + [ + PackageName( + "numpy", + ), + ], + ), + extra_build_dependencies: ExtraBuildDependencies( + {}, + ), + extra_build_variables: ExtraBuildVariables( + {}, + ), + build_options: BuildOptions { + no_binary: None, + no_build: None, + }, + allow_empty_requirements: false, + strict: false, + dependency_mode: Transitive, + resolution: Highest, + prerelease: IfNecessaryOrExplicit, + fork_strategy: RequiresPython, + dependency_metadata: DependencyMetadata( + {}, + ), + output_file: None, + no_strip_extras: false, + no_strip_markers: false, + no_annotate: false, + no_header: false, + custom_compile_command: None, + generate_hashes: false, + config_setting: ConfigSettings( + {}, + ), + config_settings_package: PackageConfigSettings( + {}, + ), + python_version: None, + python_platform: None, + universal: false, + exclude_newer: ExcludeNewer { + global: None, + package: ExcludeNewerPackage( + {}, + ), + }, + no_emit_package: [], + emit_index_url: false, + emit_find_links: false, + emit_build_options: false, + emit_marker_expression: false, + emit_index_annotation: false, + annotation_style: Split, + link_mode: Clone, + compile_bytecode: false, + sources: Enabled, + hash_checking: Some( + Verify, + ), + upgrade: None, + reinstall: None, + }, + } + + ----- stderr ----- + "#); + + Ok(()) +}