Skip to content

Commit

Permalink
bootstrap: add config option for nix patching
Browse files Browse the repository at this point in the history
On NixOS systems, bootstrap will patch rustc used in bootstrapping after
checking `/etc/os-release` (to confirm the current distribution is NixOS).
However, when using Nix on a non-NixOS system, it can be desirable for
bootstrap to patch rustc. In this commit, a `patch-binaries-for-nix`
option is added to `config.toml`, which allows for user opt-in to
bootstrap's Nix patching.

Signed-off-by: David Wood <david.wood@huawei.com>
  • Loading branch information
davidtwco committed Oct 2, 2021
1 parent 4e4942d commit e552c0d
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 12 deletions.
6 changes: 6 additions & 0 deletions config.toml.example
Expand Up @@ -313,6 +313,12 @@ changelog-seen = 2
# this setting's very existence, are all subject to change.)
#print-step-rusage = false

# Always patch binaries for usage with Nix toolchains. If `true` then binaries
# will be patched unconditionally. If `false` or unset, binaries will be patched
# only if the current distribution is NixOS. This option is useful when using
# a Nix toolchain on non-NixOS distributions.
#patch-binaries-for-nix = false

# =============================================================================
# General install configuration options
# =============================================================================
Expand Down
28 changes: 16 additions & 12 deletions src/bootstrap/bootstrap.py
Expand Up @@ -594,19 +594,23 @@ def fix_bin_or_dylib(self, fname):
if ostype != "Linux":
return

# Use `/etc/os-release` instead of `/etc/NIXOS`.
# The latter one does not exist on NixOS when using tmpfs as root.
try:
with open("/etc/os-release", "r") as f:
if not any(line.strip() == "ID=nixos" for line in f):
return
except FileNotFoundError:
return
if os.path.exists("/lib"):
return
# If the user has asked binaries to be patched for Nix, then
# don't check for NixOS or `/lib`, just continue to the patching.
if self.get_toml('patch-binaries-for-nix', 'build') != 'true':
# Use `/etc/os-release` instead of `/etc/NIXOS`.
# The latter one does not exist on NixOS when using tmpfs as root.
try:
with open("/etc/os-release", "r") as f:
if not any(line.strip() == "ID=nixos" for line in f):
return
except FileNotFoundError:
return
if os.path.exists("/lib"):
return

# At this point we're pretty sure the user is running NixOS
nix_os_msg = "info: you seem to be running NixOS. Attempting to patch"
# At this point we're pretty sure the user is running NixOS or
# using Nix
nix_os_msg = "info: you seem to be using Nix. Attempting to patch"
print(nix_os_msg, fname)

# Only build `.nix-deps` once.
Expand Down
1 change: 1 addition & 0 deletions src/bootstrap/config.rs
Expand Up @@ -397,6 +397,7 @@ struct Build {
install_stage: Option<u32>,
dist_stage: Option<u32>,
bench_stage: Option<u32>,
patch_binaries_for_nix: Option<bool>,
}

/// TOML representation of various global install decisions.
Expand Down

0 comments on commit e552c0d

Please sign in to comment.