about summary refs log tree commit diff
path: root/scripts/nix-profile.sh.in
blob: 450d683c7f44a7383239798218f615691a01ebc7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
if [ -n "$HOME" ] && [ -n "$USER" ]; then
    __savedpath="$PATH"
    export PATH=@coreutils@

    # Set up the per-user profile.
    # This part should be kept in sync with nixpkgs:nixos/modules/programs/shell.nix

    NIX_LINK=$HOME/.nix-profile

    NIX_USER_PROFILE_DIR=@localstatedir@/nix/profiles/per-user/$USER

    mkdir -m 0755 -p "$NIX_USER_PROFILE_DIR"

    if [ "$(stat --printf '%u' "$NIX_USER_PROFILE_DIR")" != "$(id -u)" ]; then
        echo "Nix: WARNING: bad ownership on "$NIX_USER_PROFILE_DIR", should be $(id -u)" >&2
    fi

    if [ -w "$HOME" ]; then
        if ! [ -L "$NIX_LINK" ]; then
            echo "Nix: creating $NIX_LINK" >&2
            if [ "$USER" != root ]; then
                if ! ln -s "$NIX_USER_PROFILE_DIR"/profile "$NIX_LINK"; then
                    echo "Nix: WARNING: could not create $NIX_LINK -> $NIX_USER_PROFILE_DIR/profile" >&2
                fi
            else
                # Root installs in the system-wide profile by default.
                ln -s @localstatedir@/nix/profiles/default "$NIX_LINK"
            fi
        fi

        # Subscribe the user to the unstable Nixpkgs channel by default.
        if [ ! -e "$HOME/.nix-channels" ]; then
            echo "https://nixos.org/channels/nixpkgs-unstable nixpkgs" > "$HOME/.nix-channels"
        fi

        # Create the per-user garbage collector roots directory.
        __user_gcroots=@localstatedir@/nix/gcroots/per-user/"$USER"
        mkdir -m 0755 -p "$__user_gcroots"
        if [ "$(stat --printf '%u' "$__user_gcroots")" != "$(id -u)" ]; then
            echo "Nix: WARNING: bad ownership on $__user_gcroots, should be $(id -u)" >&2
        fi
        unset __user_gcroots

        # Set up a default Nix expression from which to install stuff.
        __nix_defexpr="$HOME"/.nix-defexpr
        [ -L "$__nix_defexpr" ] && rm -f "$__nix_defexpr"
        mkdir -m 0755 -p "$__nix_defexpr"
        if [ "$USER" != root ] && [ ! -L "$__nix_defexpr"/channels_root ]; then
            ln -s @localstatedir@/nix/profiles/per-user/root/channels "$__nix_defexpr"/channels_root
        fi
        unset __nix_defexpr
    fi

    # Append ~/.nix-defexpr/channels/nixpkgs to $NIX_PATH so that
    # <nixpkgs> paths work when the user has fetched the Nixpkgs
    # channel.
    export NIX_PATH="${NIX_PATH:+$NIX_PATH:}nixpkgs=$HOME/.nix-defexpr/channels/nixpkgs"

    # Set up environment.
    # This part should be kept in sync with nixpkgs:nixos/modules/programs/environment.nix
    NIX_PROFILES="@localstatedir@/nix/profiles/default $NIX_USER_PROFILE_DIR"

    # Set $NIX_SSL_CERT_FILE so that Nixpkgs applications like curl work.
    if [ -e /etc/ssl/certs/ca-certificates.crt ]; then # NixOS, Ubuntu, Debian, Gentoo, Arch
        export NIX_SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
    elif [ -e /etc/ssl/ca-bundle.pem ]; then # openSUSE Tumbleweed
        export NIX_SSL_CERT_FILE=/etc/ssl/ca-bundle.pem
    elif [ -e /etc/ssl/certs/ca-bundle.crt ]; then # Old NixOS
        export NIX_SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt
    elif [ -e /etc/pki/tls/certs/ca-bundle.crt ]; then # Fedora, CentOS
        export NIX_SSL_CERT_FILE=/etc/pki/tls/certs/ca-bundle.crt
    elif [ -e "$NIX_LINK/etc/ssl/certs/ca-bundle.crt" ]; then # fall back to cacert in Nix profile
        export NIX_SSL_CERT_FILE="$NIX_LINK/etc/ssl/certs/ca-bundle.crt"
    elif [ -e "$NIX_LINK/etc/ca-bundle.crt" ]; then # old cacert in Nix profile
        export NIX_SSL_CERT_FILE="$NIX_LINK/etc/ca-bundle.crt"
    fi

    if [ -n ${MANPATH} ]; then
        export MANPATH="$NIX_LINK/share/man:$MANPATH"
    fi

    export PATH="$NIX_LINK/bin:$__savedpath"
    unset __savedpath NIX_LINK NIX_USER_PROFILE_DIR NIX_PROFILES
fi