Page MenuHomePhorge

install_nix.sh
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

install_nix.sh

#!/usr/bin/env bash
# Do initial nix install if nix is not available in PATH
if ! command -v nix > /dev/null; then
# Stop script if install fails
set -eo pipefail
sh <(curl -L https://nixos.org/nix/install) --daemon
# Rest of script is considered a best try depending on user setup
set +eo pipefail
# Source nix-daemon.sh to add nix to PATH
if [[ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]]; then
# Path doesn't exist in shellcheck CI container
# shellcheck source=/dev/null
. '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'
fi
fi
write_nix_path_to_file() {
target_file="$1"
# Only write to files if they are missing the entry and writeable
if ! grep nix-profile "$target_file" 2>/dev/null \
&& [ -w "$target_file" ] || [ ! -f "$target_file" ]; then
echo "Adding Nix path entry to $target_file" >&2
# We want this to output $PATH without expansion
# shellcheck disable=SC2016
echo 'export PATH="$HOME"/.nix-profile/bin:/nix/var/nix/profiles/default/bin:"${PATH}"' >> "$target_file"
fi
}
# Apple may reset /etc/*rc on system updates which is how Nix exposes itself
# Add user entries to avoid Nix "disappearing" from PATH
if [[ "$OSTYPE" == 'darwin'* ]]; then
write_nix_path_to_file "$HOME/.zshenv"
write_nix_path_to_file "$HOME/.bashrc"
write_nix_path_to_file "$HOME/.bash_profile"
write_nix_path_to_file "$HOME/.profile"
fi
# Figure out how many cores the system has, and set cache default
if [[ "$OSTYPE" == 'darwin'* ]]; then
NPROC=$(sysctl -n hw.physicalcpu)
ADMIN_GROUP="@admin"
elif [[ "$OSTYPE" == 'linux'* ]]; then
NPROC=$(nproc)
ADMIN_GROUP="@wheel @sudo"
fi
# Jobs = The number of different nix packages able to be built at the same time
# Cores = How many cores an individual job may use. This value is
# assigned to $NIX_BUILD_CORES within a nix build environment.
jobs=$((NPROC / 2)) # Use only half of cores for individual jobs
cores=4 # Just a good default for consumer hardware
# NOTE: This has the potential of over-subscribing cores by a factor of 2.
# Potential load = jobs * cores = (n/2) * 4 = 2n
# However, this is probably the best compromise as most builds are largely
# single threaded, with a few exceptions which are massively parrallel.
# Check if nix.conf contains a value, append a default if missing.
add_if_missing_in_nix_conf() {
local key="$1"
local value="$2"
if ! grep "$key" /etc/nix/nix.conf &> /dev/null; then
echo "/etc/nix/nix.conf is missing a value for ${key}. " \
"Appending '${key} = ${value}' to /etc/nix/nix.conf"
# Make sure that user can write to file
if sudo test -w /etc/nix/nix.conf; then
echo "${key} = ${value}" | sudo tee -a /etc/nix/nix.conf &> /dev/null
else
# nix.conf is read only, which is true for NixOS
echo "Unable to write '${key} = ${value}' to nix.conf, " \
"please add the value to your nix.conf"
fi
fi
}
# Add value for a given value, append the additional value
append_value_in_nix_conf() {
local key="$1"
local value="$2"
# Add value for key if it's missing entirely
if ! grep "$key" /etc/nix/nix.conf &> /dev/null; then
add_if_missing_in_nix_conf "$key" "$value";
return $?
fi
# Check that key does not already contain the desired value
if ! grep "$key" /etc/nix/nix.conf | grep "$value" &> /dev/null; then
echo "/etc/nix/nix.conf is missing '${value}' for '${key}'. " \
"Appending '${value}' to '${key}' in /etc/nix/nix.conf"
# Make sure that user can write to file
if sudo test -w /etc/nix/nix.conf; then
# Find the line with the related setting, then append the new value
# Values for nix.conf are space separated
sudo sed -i.bak -e "/$key/s|\$| $value|" /etc/nix/nix.conf
else
# nix.conf is read only, which is true for NixOS
echo "Unable to write to nix.conf, please append '$value' to '$key'" \
"in your nix.conf"
fi
fi
}
# Check if nix.conf is already configured for a given value.
add_if_missing_in_nix_conf "trusted-users" "${ADMIN_GROUP} ${USER}"
add_if_missing_in_nix_conf \
"experimental-features" "flakes nix-command"
add_if_missing_in_nix_conf "cores" "${cores}"
add_if_missing_in_nix_conf "max-jobs" "${jobs}"
# Explictly add default cache for older nix versions to prevent custom cache
# becoming only trusted cache.
append_value_in_nix_conf "substituters" "https://cache.nixos.org"
append_value_in_nix_conf "trusted-public-keys" \
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
append_value_in_nix_conf "substituters" "https://comm.cachix.org"
append_value_in_nix_conf "trusted-public-keys" \
"comm.cachix.org-1:70RF31rkmCEhQ9HrXA2uXcpqQKGcUK3TxLJdgcUCaA4="
# Ask user if they would like to use Powerline for bash prompt
SCRIPT_DIR=$(cd "$(dirname "$0")" || true; pwd -P)
if [[ "$OSTYPE" == 'darwin'* ]]; then
"$SCRIPT_DIR"/prompt_direnv_macos.sh
fi
# Build the nixified script which is aware of Powerline and dependencies
nix build "$SCRIPT_DIR"'/..#better-prompt'
# Source file to apply Powerline bootstrap logic
# shellcheck source=/dev/null
. "$(nix eval --raw "$SCRIPT_DIR"'/..#better-prompt.outPath')/bin/better-prompt"

File Metadata

Mime Type
text/x-shellscript
Expires
Sun, Dec 7, 4:33 PM (1 d, 19 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5017074
Default Alt Text
install_nix.sh (5 KB)

Event Timeline