Skip to content

Commit 91d66e0

Browse files
Add file-to-CLI overrides for build isolation configuration (#15437)
## Summary Like #15395, but `--no-build-isolation`.
1 parent d1e0c26 commit 91d66e0

File tree

16 files changed

+660
-305
lines changed

16 files changed

+660
-305
lines changed

crates/uv-cli/src/options.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use anstream::eprintln;
22

33
use uv_cache::Refresh;
4-
use uv_configuration::{Reinstall, Upgrade};
4+
use uv_configuration::{BuildIsolation, Reinstall, Upgrade};
55
use uv_distribution_types::{ConfigSettings, PackageConfigSettings, Requirement};
66
use uv_resolver::{ExcludeNewer, ExcludeNewerPackage, PrereleaseMode};
77
use uv_settings::{Combine, PipOptions, ResolverInstallerOptions, ResolverOptions};
@@ -355,8 +355,10 @@ pub fn resolver_options(
355355
.into_iter()
356356
.collect::<PackageConfigSettings>()
357357
}),
358-
no_build_isolation: flag(no_build_isolation, build_isolation, "build-isolation"),
359-
no_build_isolation_package: Some(no_build_isolation_package),
358+
build_isolation: BuildIsolation::from_args(
359+
flag(no_build_isolation, build_isolation, "build-isolation"),
360+
no_build_isolation_package,
361+
),
360362
extra_build_dependencies: None,
361363
extra_build_variables: None,
362364
exclude_newer: ExcludeNewer::from_args(
@@ -470,12 +472,10 @@ pub fn resolver_installer_options(
470472
.into_iter()
471473
.collect::<PackageConfigSettings>()
472474
}),
473-
no_build_isolation: flag(no_build_isolation, build_isolation, "build-isolation"),
474-
no_build_isolation_package: if no_build_isolation_package.is_empty() {
475-
None
476-
} else {
477-
Some(no_build_isolation_package)
478-
},
475+
build_isolation: BuildIsolation::from_args(
476+
flag(no_build_isolation, build_isolation, "build-isolation"),
477+
no_build_isolation_package,
478+
),
479479
extra_build_dependencies: None,
480480
extra_build_variables: None,
481481
exclude_newer,

crates/uv-configuration/src/package_options.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,55 @@ impl From<Upgrade> for Refresh {
248248
}
249249
}
250250
}
251+
252+
/// Whether to isolate builds.
253+
#[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
254+
#[serde(rename_all = "kebab-case", deny_unknown_fields)]
255+
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
256+
pub enum BuildIsolation {
257+
/// Isolate all builds.
258+
#[default]
259+
Isolate,
260+
261+
/// Do not isolate any builds.
262+
Shared,
263+
264+
/// Do not isolate builds for the specified packages.
265+
SharedPackage(Vec<PackageName>),
266+
}
267+
268+
impl BuildIsolation {
269+
/// Determine the build isolation strategy from the command-line arguments.
270+
pub fn from_args(
271+
no_build_isolation: Option<bool>,
272+
no_build_isolation_package: Vec<PackageName>,
273+
) -> Option<Self> {
274+
match no_build_isolation {
275+
Some(true) => Some(Self::Shared),
276+
Some(false) => Some(Self::Isolate),
277+
None if no_build_isolation_package.is_empty() => None,
278+
None => Some(Self::SharedPackage(no_build_isolation_package)),
279+
}
280+
}
281+
282+
/// Combine a set of [`BuildIsolation`] values.
283+
#[must_use]
284+
pub fn combine(self, other: Self) -> Self {
285+
match self {
286+
// Setting `--build-isolation` or `--no-build-isolation` should clear previous `--no-build-isolation-package` selections.
287+
Self::Isolate | Self::Shared => self,
288+
Self::SharedPackage(self_packages) => match other {
289+
// If `--no-build-isolation` was enabled previously, `--no-build-isolation-package` is subsumed by sharing all builds.
290+
Self::Shared => other,
291+
// If `--build-isolation` was enabled previously, then `--no-build-isolation-package` enables specific packages to be shared.
292+
Self::Isolate => Self::SharedPackage(self_packages),
293+
// If `--no-build-isolation-package` was included twice, combine the packages.
294+
Self::SharedPackage(other_packages) => {
295+
let mut combined = self_packages;
296+
combined.extend(other_packages);
297+
Self::SharedPackage(combined)
298+
}
299+
},
300+
}
301+
}
302+
}

crates/uv-settings/src/combine.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use std::{collections::BTreeMap, num::NonZeroUsize};
44
use url::Url;
55

66
use uv_configuration::{
7-
ExportFormat, IndexStrategy, KeyringProviderType, Reinstall, RequiredVersion, TargetTriple,
8-
TrustedPublishing, Upgrade,
7+
BuildIsolation, ExportFormat, IndexStrategy, KeyringProviderType, Reinstall, RequiredVersion,
8+
TargetTriple, TrustedPublishing, Upgrade,
99
};
1010
use uv_distribution_types::{
1111
ConfigSettings, ExtraBuildVariables, Index, IndexUrl, PackageConfigSettings, PipExtraIndex,
@@ -199,6 +199,15 @@ impl Combine for Option<Reinstall> {
199199
}
200200
}
201201

202+
impl Combine for Option<BuildIsolation> {
203+
fn combine(self, other: Self) -> Self {
204+
match (self, other) {
205+
(Some(a), Some(b)) => Some(a.combine(b)),
206+
(a, b) => a.or(b),
207+
}
208+
}
209+
}
210+
202211
impl Combine for serde::de::IgnoredAny {
203212
fn combine(self, _other: Self) -> Self {
204213
self

crates/uv-settings/src/settings.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use serde::{Deserialize, Serialize};
44

55
use uv_cache_info::CacheKey;
66
use uv_configuration::{
7-
IndexStrategy, KeyringProviderType, PackageNameSpecifier, Reinstall, RequiredVersion,
8-
TargetTriple, TrustedHost, TrustedPublishing, Upgrade,
7+
BuildIsolation, IndexStrategy, KeyringProviderType, PackageNameSpecifier, Reinstall,
8+
RequiredVersion, TargetTriple, TrustedHost, TrustedPublishing, Upgrade,
99
};
1010
use uv_distribution_types::{
1111
ConfigSettings, ExtraBuildVariables, Index, IndexUrl, IndexUrlError, PackageConfigSettings,
@@ -341,13 +341,12 @@ pub struct InstallerOptions {
341341
pub exclude_newer: Option<ExcludeNewerTimestamp>,
342342
pub link_mode: Option<LinkMode>,
343343
pub compile_bytecode: Option<bool>,
344-
pub reinstall: Option<bool>,
345-
pub reinstall_package: Option<Vec<PackageName>>,
344+
pub reinstall: Option<Reinstall>,
345+
pub build_isolation: Option<BuildIsolation>,
346346
pub no_build: Option<bool>,
347347
pub no_build_package: Option<Vec<PackageName>>,
348348
pub no_binary: Option<bool>,
349349
pub no_binary_package: Option<Vec<PackageName>>,
350-
pub no_build_isolation: Option<bool>,
351350
pub no_sources: Option<bool>,
352351
}
353352

@@ -370,12 +369,11 @@ pub struct ResolverOptions {
370369
pub exclude_newer: ExcludeNewer,
371370
pub link_mode: Option<LinkMode>,
372371
pub upgrade: Option<Upgrade>,
372+
pub build_isolation: Option<BuildIsolation>,
373373
pub no_build: Option<bool>,
374374
pub no_build_package: Option<Vec<PackageName>>,
375375
pub no_binary: Option<bool>,
376376
pub no_binary_package: Option<Vec<PackageName>>,
377-
pub no_build_isolation: Option<bool>,
378-
pub no_build_isolation_package: Option<Vec<PackageName>>,
379377
pub extra_build_dependencies: Option<ExtraBuildDependencies>,
380378
pub extra_build_variables: Option<ExtraBuildVariables>,
381379
pub no_sources: Option<bool>,
@@ -398,8 +396,7 @@ pub struct ResolverInstallerOptions {
398396
pub dependency_metadata: Option<Vec<StaticMetadata>>,
399397
pub config_settings: Option<ConfigSettings>,
400398
pub config_settings_package: Option<PackageConfigSettings>,
401-
pub no_build_isolation: Option<bool>,
402-
pub no_build_isolation_package: Option<Vec<PackageName>>,
399+
pub build_isolation: Option<BuildIsolation>,
403400
pub extra_build_dependencies: Option<ExtraBuildDependencies>,
404401
pub extra_build_variables: Option<ExtraBuildVariables>,
405402
pub exclude_newer: Option<ExcludeNewerTimestamp>,
@@ -463,8 +460,10 @@ impl From<ResolverInstallerSchema> for ResolverInstallerOptions {
463460
dependency_metadata,
464461
config_settings,
465462
config_settings_package,
466-
no_build_isolation,
467-
no_build_isolation_package,
463+
build_isolation: BuildIsolation::from_args(
464+
no_build_isolation,
465+
no_build_isolation_package.into_iter().flatten().collect(),
466+
),
468467
extra_build_dependencies,
469468
extra_build_variables,
470469
exclude_newer,
@@ -1897,8 +1896,10 @@ impl From<ResolverInstallerSchema> for ResolverOptions {
18971896
no_build_package: value.no_build_package,
18981897
no_binary: value.no_binary,
18991898
no_binary_package: value.no_binary_package,
1900-
no_build_isolation: value.no_build_isolation,
1901-
no_build_isolation_package: value.no_build_isolation_package,
1899+
build_isolation: BuildIsolation::from_args(
1900+
value.no_build_isolation,
1901+
value.no_build_isolation_package.unwrap_or_default(),
1902+
),
19021903
extra_build_dependencies: value.extra_build_dependencies,
19031904
extra_build_variables: value.extra_build_variables,
19041905
no_sources: value.no_sources,
@@ -1929,13 +1930,18 @@ impl From<ResolverInstallerSchema> for InstallerOptions {
19291930
.global,
19301931
link_mode: value.link_mode,
19311932
compile_bytecode: value.compile_bytecode,
1932-
reinstall: value.reinstall,
1933-
reinstall_package: value.reinstall_package,
1933+
reinstall: Reinstall::from_args(
1934+
value.reinstall,
1935+
value.reinstall_package.unwrap_or_default(),
1936+
),
1937+
build_isolation: BuildIsolation::from_args(
1938+
value.no_build_isolation,
1939+
value.no_build_isolation_package.unwrap_or_default(),
1940+
),
19341941
no_build: value.no_build,
19351942
no_build_package: value.no_build_package,
19361943
no_binary: value.no_binary,
19371944
no_binary_package: value.no_binary_package,
1938-
no_build_isolation: value.no_build_isolation,
19391945
no_sources: value.no_sources,
19401946
}
19411947
}
@@ -1964,8 +1970,7 @@ pub struct ToolOptions {
19641970
pub dependency_metadata: Option<Vec<StaticMetadata>>,
19651971
pub config_settings: Option<ConfigSettings>,
19661972
pub config_settings_package: Option<PackageConfigSettings>,
1967-
pub no_build_isolation: Option<bool>,
1968-
pub no_build_isolation_package: Option<Vec<PackageName>>,
1973+
pub build_isolation: Option<BuildIsolation>,
19691974
pub extra_build_dependencies: Option<ExtraBuildDependencies>,
19701975
pub extra_build_variables: Option<ExtraBuildVariables>,
19711976
pub exclude_newer: Option<ExcludeNewerTimestamp>,
@@ -1995,8 +2000,7 @@ impl From<ResolverInstallerOptions> for ToolOptions {
19952000
dependency_metadata: value.dependency_metadata,
19962001
config_settings: value.config_settings,
19972002
config_settings_package: value.config_settings_package,
1998-
no_build_isolation: value.no_build_isolation,
1999-
no_build_isolation_package: value.no_build_isolation_package,
2003+
build_isolation: value.build_isolation,
20002004
extra_build_dependencies: value.extra_build_dependencies,
20012005
extra_build_variables: value.extra_build_variables,
20022006
exclude_newer: value.exclude_newer,
@@ -2028,8 +2032,7 @@ impl From<ToolOptions> for ResolverInstallerOptions {
20282032
dependency_metadata: value.dependency_metadata,
20292033
config_settings: value.config_settings,
20302034
config_settings_package: value.config_settings_package,
2031-
no_build_isolation: value.no_build_isolation,
2032-
no_build_isolation_package: value.no_build_isolation_package,
2035+
build_isolation: value.build_isolation,
20332036
extra_build_dependencies: value.extra_build_dependencies,
20342037
extra_build_variables: value.extra_build_variables,
20352038
exclude_newer: value.exclude_newer,

crates/uv/src/commands/build_frontend.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ use uv_build_backend::check_direct_build;
1414
use uv_cache::{Cache, CacheBucket};
1515
use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder};
1616
use uv_configuration::{
17-
BuildKind, BuildOptions, BuildOutput, Concurrency, Constraints, DependencyGroupsWithDefaults,
18-
HashCheckingMode, IndexStrategy, KeyringProviderType, Preview, SourceStrategy,
17+
BuildIsolation, BuildKind, BuildOptions, BuildOutput, Concurrency, Constraints,
18+
DependencyGroupsWithDefaults, HashCheckingMode, IndexStrategy, KeyringProviderType, Preview,
19+
SourceStrategy,
1920
};
2021
use uv_dispatch::{BuildDispatch, SharedState};
2122
use uv_distribution::LoweredExtraBuildDependencies;
@@ -38,7 +39,7 @@ use uv_python::{
3839
use uv_requirements::RequirementsSource;
3940
use uv_resolver::{ExcludeNewer, FlatIndex};
4041
use uv_settings::PythonInstallMirrors;
41-
use uv_types::{AnyErrorBuild, BuildContext, BuildIsolation, BuildStack, HashStrategy};
42+
use uv_types::{AnyErrorBuild, BuildContext, BuildStack, HashStrategy};
4243
use uv_workspace::pyproject::ExtraBuildDependencies;
4344
use uv_workspace::{DiscoveryOptions, Workspace, WorkspaceCache, WorkspaceError};
4445

@@ -200,8 +201,7 @@ async fn build_impl(
200201
dependency_metadata,
201202
config_setting,
202203
config_settings_package,
203-
no_build_isolation,
204-
no_build_isolation_package,
204+
build_isolation,
205205
extra_build_dependencies,
206206
extra_build_variables,
207207
exclude_newer,
@@ -348,8 +348,7 @@ async fn build_impl(
348348
build_logs,
349349
force_pep517,
350350
build_constraints,
351-
*no_build_isolation,
352-
no_build_isolation_package,
351+
build_isolation,
353352
extra_build_dependencies,
354353
extra_build_variables,
355354
*index_strategy,
@@ -450,8 +449,7 @@ async fn build_package(
450449
build_logs: bool,
451450
force_pep517: bool,
452451
build_constraints: &[RequirementsSource],
453-
no_build_isolation: bool,
454-
no_build_isolation_package: &[PackageName],
452+
build_isolation: &BuildIsolation,
455453
extra_build_dependencies: &ExtraBuildDependencies,
456454
extra_build_variables: &ExtraBuildVariables,
457455
index_strategy: IndexStrategy,
@@ -566,14 +564,16 @@ async fn build_package(
566564

567565
// Determine whether to enable build isolation.
568566
let environment;
569-
let build_isolation = if no_build_isolation {
570-
environment = PythonEnvironment::from_interpreter(interpreter.clone());
571-
BuildIsolation::Shared(&environment)
572-
} else if no_build_isolation_package.is_empty() {
573-
BuildIsolation::Isolated
574-
} else {
575-
environment = PythonEnvironment::from_interpreter(interpreter.clone());
576-
BuildIsolation::SharedPackage(&environment, no_build_isolation_package)
567+
let types_build_isolation = match build_isolation {
568+
BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated,
569+
BuildIsolation::Shared => {
570+
environment = PythonEnvironment::from_interpreter(interpreter.clone());
571+
uv_types::BuildIsolation::Shared(&environment)
572+
}
573+
BuildIsolation::SharedPackage(packages) => {
574+
environment = PythonEnvironment::from_interpreter(interpreter.clone());
575+
uv_types::BuildIsolation::SharedPackage(&environment, packages)
576+
}
577577
};
578578

579579
// Resolve the flat indexes from `--find-links`.
@@ -606,7 +606,7 @@ async fn build_package(
606606
index_strategy,
607607
config_setting,
608608
config_settings_package,
609-
build_isolation,
609+
types_build_isolation,
610610
&extra_build_requires,
611611
extra_build_variables,
612612
link_mode,

crates/uv/src/commands/pip/compile.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ use tracing::debug;
1313
use uv_cache::Cache;
1414
use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder};
1515
use uv_configuration::{
16-
BuildOptions, Concurrency, Constraints, ExportFormat, ExtrasSpecification, IndexStrategy,
17-
NoBinary, NoBuild, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade,
16+
BuildIsolation, BuildOptions, Concurrency, Constraints, ExportFormat, ExtrasSpecification,
17+
IndexStrategy, NoBinary, NoBuild, Preview, PreviewFeatures, Reinstall, SourceStrategy, Upgrade,
1818
};
1919
use uv_configuration::{KeyringProviderType, TargetTriple};
2020
use uv_dispatch::{BuildDispatch, SharedState};
@@ -45,7 +45,7 @@ use uv_resolver::{
4545
};
4646
use uv_static::EnvVars;
4747
use uv_torch::{TorchMode, TorchStrategy};
48-
use uv_types::{BuildIsolation, EmptyInstalledPackages, HashStrategy};
48+
use uv_types::{EmptyInstalledPackages, HashStrategy};
4949
use uv_warnings::{warn_user, warn_user_once};
5050
use uv_workspace::WorkspaceCache;
5151
use uv_workspace::pyproject::ExtraBuildDependencies;
@@ -96,8 +96,7 @@ pub(crate) async fn pip_compile(
9696
network_settings: &NetworkSettings,
9797
config_settings: ConfigSettings,
9898
config_settings_package: PackageConfigSettings,
99-
no_build_isolation: bool,
100-
no_build_isolation_package: Vec<PackageName>,
99+
build_isolation: BuildIsolation,
101100
extra_build_dependencies: &ExtraBuildDependencies,
102101
extra_build_variables: &ExtraBuildVariables,
103102
build_options: BuildOptions,
@@ -466,14 +465,16 @@ pub(crate) async fn pip_compile(
466465

467466
// Determine whether to enable build isolation.
468467
let environment;
469-
let build_isolation = if no_build_isolation {
470-
environment = PythonEnvironment::from_interpreter(interpreter.clone());
471-
BuildIsolation::Shared(&environment)
472-
} else if no_build_isolation_package.is_empty() {
473-
BuildIsolation::Isolated
474-
} else {
475-
environment = PythonEnvironment::from_interpreter(interpreter.clone());
476-
BuildIsolation::SharedPackage(&environment, &no_build_isolation_package)
468+
let types_build_isolation = match build_isolation {
469+
BuildIsolation::Isolate => uv_types::BuildIsolation::Isolated,
470+
BuildIsolation::Shared => {
471+
environment = PythonEnvironment::from_interpreter(interpreter.clone());
472+
uv_types::BuildIsolation::Shared(&environment)
473+
}
474+
BuildIsolation::SharedPackage(ref packages) => {
475+
environment = PythonEnvironment::from_interpreter(interpreter.clone());
476+
uv_types::BuildIsolation::SharedPackage(&environment, packages)
477+
}
477478
};
478479

479480
// Don't enforce hashes in `pip compile`.
@@ -502,7 +503,7 @@ pub(crate) async fn pip_compile(
502503
index_strategy,
503504
&config_settings,
504505
&config_settings_package,
505-
build_isolation,
506+
types_build_isolation,
506507
&extra_build_requires,
507508
extra_build_variables,
508509
link_mode,

0 commit comments

Comments
 (0)