Compare commits
3 commits
76a594ca9f
...
25c00be8fd
Author | SHA1 | Date | |
---|---|---|---|
25c00be8fd | |||
fe468eebd7 | |||
7973e2ccd7 |
73
build_hm.sh
73
build_hm.sh
|
@ -1,73 +0,0 @@
|
||||||
#!/usr/bin/env nix-shell
|
|
||||||
#! nix-shell -i bash
|
|
||||||
#! nix-shell -p bash nix-output-monitor
|
|
||||||
|
|
||||||
echo FIXME Not flakes ready
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|
||||||
|
|
||||||
# Parse arguments
|
|
||||||
function help {
|
|
||||||
echo "Usage: $0 [-h|-v|-b] profile"
|
|
||||||
echo "Build Home Manager configuration on the local machine."
|
|
||||||
echo
|
|
||||||
echo "Arguments:"
|
|
||||||
echo " profile: Home Manager profile to use"
|
|
||||||
echo
|
|
||||||
echo "Options:"
|
|
||||||
echo " -h: Display this help message."
|
|
||||||
}
|
|
||||||
|
|
||||||
while getopts "h" OPTION
|
|
||||||
do
|
|
||||||
case "$OPTION" in
|
|
||||||
h)
|
|
||||||
help
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
?)
|
|
||||||
help
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
shift "$(($OPTIND -1))"
|
|
||||||
|
|
||||||
if [ "$#" -ne 1 ]
|
|
||||||
then
|
|
||||||
help
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
profile="$1"
|
|
||||||
|
|
||||||
profile_dir="${SCRIPT_DIR}/${profile}"
|
|
||||||
if [ ! -d "$profile_dir" ]
|
|
||||||
then
|
|
||||||
echo "Profile not found."
|
|
||||||
fi
|
|
||||||
|
|
||||||
home_manager_config="${profile_dir}/hm.nix"
|
|
||||||
if [ ! -f "$home_manager_config" ]
|
|
||||||
then
|
|
||||||
echo "Home Manager configuration not found."
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -x
|
|
||||||
|
|
||||||
nom-build '<home-manager/home-manager/home-manager.nix>' --argstr confPath "${home_manager_config}" -o "${profile_dir}/hm"
|
|
||||||
|
|
||||||
set +x
|
|
||||||
|
|
||||||
echo
|
|
||||||
|
|
||||||
path="$(readlink -f "${profile_dir}/hm")"
|
|
||||||
|
|
||||||
echo "Manual installation instructions:"
|
|
||||||
echo "- Transfer $path and dependencies to the destination machine (somehow)"
|
|
||||||
echo "- Run $path/activate as the destination user"
|
|
||||||
echo "- Log into the user again to make sure everything is sourced"
|
|
||||||
echo "- Transfer necessary private keys (or use ssh -A for testing)"
|
|
||||||
echo "- Run git-sync-init"
|
|
||||||
echo "- Check that the system can build itself"
|
|
|
@ -1,59 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# Runs the command given in a Nix environment, and create it if it doesn't exist.
|
|
||||||
# Useful for environments where nix isn't installed / you do not have root access
|
|
||||||
|
|
||||||
# If you need a fresh slate:
|
|
||||||
# chmod +w .nix -R
|
|
||||||
# rm -rf .nix .nix-defexpr .nix-profile .config/nix .local/state/nix .local/share/nix .cache/nix
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
|
||||||
|
|
||||||
if [ ! -d /nix ]
|
|
||||||
then
|
|
||||||
# Doesn't support architectures other than x86_64
|
|
||||||
NIX_USER_CHROOT_URL=https://github.com/nix-community/nix-user-chroot/releases/download/1.2.2/nix-user-chroot-bin-1.2.2-x86_64-unknown-linux-musl
|
|
||||||
NIX_USER_CHROOT_SHA256SUM=e11aff604bb8d3ffd1d9c0c68cd636816d7eb8da540de18ee3a41ccad7ac0972
|
|
||||||
|
|
||||||
nix_user_chroot="$HOME/.local/bin/nix-user-chroot"
|
|
||||||
mkdir -p "$(dirname "$nix_user_chroot")"
|
|
||||||
|
|
||||||
nix_directory="$HOME/.nix"
|
|
||||||
mkdir -p "$nix_directory"
|
|
||||||
|
|
||||||
if [ ! -x "$nix_user_chroot" ] || ! echo "$NIX_USER_CHROOT_SHA256SUM $nix_user_chroot" | sha256sum --check --status
|
|
||||||
then
|
|
||||||
wget "$NIX_USER_CHROOT_URL" -O "$nix_user_chroot"
|
|
||||||
echo "$NIX_USER_CHROOT_SHA256SUM $nix_user_chroot" | sha256sum --check --status
|
|
||||||
chmod +x "$nix_user_chroot"
|
|
||||||
fi
|
|
||||||
exec "$nix_user_chroot" "$nix_directory" "$0" "$@"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
nix_profile_path="$HOME/.nix-profile/etc/profile.d/nix.sh"
|
|
||||||
|
|
||||||
if [ ! -f "$nix_profile_path" ]
|
|
||||||
then
|
|
||||||
NIX_INSTALLER_URL=https://releases.nixos.org/nix/nix-2.19.2/install
|
|
||||||
NIX_INSTALLER_SHA256SUM=435f0d7e11f7c7dffeeab0ec9cc55723f6d3c03352379d785633cf4ddb5caf90
|
|
||||||
|
|
||||||
nix_installer="$(mktemp)"
|
|
||||||
|
|
||||||
wget "$NIX_INSTALLER_URL" -O "$nix_installer"
|
|
||||||
echo "$NIX_INSTALLER_SHA256SUM $nix_installer" | sha256sum --check --status
|
|
||||||
chmod +x "$nix_installer"
|
|
||||||
|
|
||||||
"$nix_installer" --no-daemon --yes --no-channel-add --no-modify-profile
|
|
||||||
fi
|
|
||||||
|
|
||||||
# TODO This installs nix in nix-env, which conflicts with home-manager activation.
|
|
||||||
# Workaround is temporarily set /nix/store-xxx-nix/bin in PATH
|
|
||||||
|
|
||||||
. "$nix_profile_path"
|
|
||||||
|
|
||||||
# TODO Useful the first time, but it becomes a bit long after a while
|
|
||||||
# "${SCRIPT_DIR}/add_channels.sh"
|
|
||||||
|
|
||||||
exec "$@"
|
|
33
flake.nix
33
flake.nix
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "nixpkgs/nixos-23.11";
|
nixpkgs.url = "nixpkgs/nixos-23.11";
|
||||||
|
unixpkgs.url = "nixpkgs";
|
||||||
# OS
|
# OS
|
||||||
disko = {
|
disko = {
|
||||||
url = "disko";
|
url = "disko";
|
||||||
|
@ -30,19 +31,12 @@
|
||||||
# url = "github:nix-community/nixvim";
|
# url = "github:nix-community/nixvim";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
nixgl = {
|
|
||||||
url = "github:guibou/nixGL";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
nur.url = "github:nix-community/NUR";
|
nur.url = "github:nix-community/NUR";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, disko, nix-on-droid, home-manager, stylix, nixgl, ... }@attrs:
|
outputs = { self, nixpkgs, unixpkgs, disko, nix-on-droid, stylix, ... }@attrs:
|
||||||
let
|
let
|
||||||
nixpkgsConfig = {
|
nixpkgsConfig = {
|
||||||
overlays = [
|
|
||||||
nixgl.overlay
|
|
||||||
];
|
|
||||||
config = {
|
config = {
|
||||||
allowUnfree = true;
|
allowUnfree = true;
|
||||||
# TODO Not sure why, HM needs nixos-option which needs an old Nix?
|
# TODO Not sure why, HM needs nixos-option which needs an old Nix?
|
||||||
|
@ -50,6 +44,15 @@
|
||||||
"nix-2.15.3"
|
"nix-2.15.3"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
overlays = [
|
||||||
|
(final: prev: { unstable = unixpkgs.legacyPackages.${prev.system}.pkgs; })
|
||||||
|
];
|
||||||
|
# Only allows importing packages, not NixOS modules. If that is needed, see:
|
||||||
|
# https://discourse.nixos.org/t/how-to-use-unstable-nixpkgs-in-imports-with-flake/17414/7
|
||||||
|
};
|
||||||
|
homeManagerConfig = {
|
||||||
|
sharedModules = [ self.homeManagerModules.dotfiles ];
|
||||||
|
extraSpecialArgs = attrs;
|
||||||
};
|
};
|
||||||
lib = {
|
lib = {
|
||||||
nixosSystem = { system, modules ? [ ] }: nixpkgs.lib.nixosSystem {
|
nixosSystem = { system, modules ? [ ] }: nixpkgs.lib.nixosSystem {
|
||||||
|
@ -59,10 +62,7 @@
|
||||||
self.nixosModules.dotfiles
|
self.nixosModules.dotfiles
|
||||||
{
|
{
|
||||||
nixpkgs = nixpkgsConfig;
|
nixpkgs = nixpkgsConfig;
|
||||||
home-manager = {
|
home-manager = homeManagerConfig;
|
||||||
sharedModules = [ self.homeManagerModules.dotfiles ];
|
|
||||||
extraSpecialArgs = attrs;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
@ -73,17 +73,10 @@
|
||||||
modules = modules ++ [
|
modules = modules ++ [
|
||||||
self.nixOnDroidModules.dotfiles
|
self.nixOnDroidModules.dotfiles
|
||||||
{
|
{
|
||||||
home-manager.sharedModules = [ self.homeManagerModules.dotfiles ];
|
home-manager = homeManagerConfig;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
homeManagerConfiguration = { system, modules ? [ ] }: home-manager.lib.homeManagerConfiguration {
|
|
||||||
specialArgs = attrs;
|
|
||||||
pkgs = import nixpkgs (nixpkgsConfig // {
|
|
||||||
inherit system;
|
|
||||||
});
|
|
||||||
modules = modules ++ [ self.homeManagerModules.dotfiles ];
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
./ssh.nix
|
./ssh.nix
|
||||||
./theme
|
./theme
|
||||||
./tmux
|
./tmux
|
||||||
./usernix
|
|
||||||
./vim
|
./vim
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
{ pkgs, config, lib, ... }:
|
{ pkgs, config, lib, ... }:
|
||||||
let
|
|
||||||
nixGLIntelPrefix = "${pkgs.nixgl.nixVulkanIntel}/bin/nixVulkanIntel ${pkgs.nixgl.nixGLIntel}/bin/nixGLIntel ";
|
|
||||||
wmPrefix = "${lib.optionalString config.frogeye.desktop.nixGLIntel nixGLIntelPrefix}";
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./audio
|
./audio
|
||||||
|
@ -25,7 +21,6 @@ in
|
||||||
scriptPath = ".config/xsession";
|
scriptPath = ".config/xsession";
|
||||||
profilePath = ".config/xprofile";
|
profilePath = ".config/xprofile";
|
||||||
windowManager = {
|
windowManager = {
|
||||||
command = lib.mkForce "${wmPrefix} ${config.xsession.windowManager.i3.package}/bin/i3";
|
|
||||||
i3.enable = true;
|
i3.enable = true;
|
||||||
};
|
};
|
||||||
numlock.enable = config.frogeye.desktop.numlock;
|
numlock.enable = config.frogeye.desktop.numlock;
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
{ pkgs, lib, config, ... }:
|
|
||||||
let
|
|
||||||
ensureNixPath = "${config.xdg.configHome}/dotfiles/ensure_nix.sh";
|
|
||||||
# TODO Can we maybe use a lighter version of this?
|
|
||||||
in
|
|
||||||
{
|
|
||||||
config = lib.mkIf config.frogeye.userNix {
|
|
||||||
dconf.enable = lib.mkForce false;
|
|
||||||
# Otherwise standalone home-manager complains it can't find /etc/dbus-1/session.conf.
|
|
||||||
# Symlinking it to /usr/share/dbus-1/session.conf goes further but not much.
|
|
||||||
|
|
||||||
home.activation = {
|
|
||||||
# When Nix is installed in the user directory via a proot, systemd --user
|
|
||||||
# is started outside of it, so it cannot access /nix. So we need to:
|
|
||||||
# - Ensure files systemd access aren't via /nix.
|
|
||||||
# Sometimes there's multiple layers of redirection, so easiest way is
|
|
||||||
# to copy the file outside the store.
|
|
||||||
# - Wrap services entrypoints into a proot wrapper
|
|
||||||
prootSystemd = lib.hm.dag.entryBetween [ "reloadSystemd" ] [ "linkGeneration" ] ''
|
|
||||||
cd ${config.xdg.configHome}/systemd/user
|
|
||||||
${pkgs.findutils}/bin/find . -maxdepth 1 -type l | while read path
|
|
||||||
do
|
|
||||||
temp="$(mktemp -p "$PWD")"
|
|
||||||
${pkgs.gnused}/bin/sed 's|^Exec\S\+=|\0${ensureNixPath} |' "$path" > "$temp"
|
|
||||||
$DRY_RUN_CMD mv $VERBOSE_ARG "$temp" "$path"
|
|
||||||
rm -f "$temp"
|
|
||||||
done
|
|
||||||
# Targets (need to be symlinks to original)
|
|
||||||
${pkgs.findutils}/bin/find . -mindepth 2 -maxdepth 2 -type l | while read path
|
|
||||||
do
|
|
||||||
$DRY_RUN_CMD rm $VERBOSE_ARG "$path"
|
|
||||||
$DRY_RUN_CMD ln $VERBOSE_ARG -s "../$(basename "$path")" "$path"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
# Unless files were created by HM, it will complain that something is in the way, so we delete them.
|
|
||||||
# This is very ugly, as you're not supposed to write things before writeBoundary, but hey
|
|
||||||
prootSystemdClean = lib.hm.dag.entryBefore [ "checkLinkTargets" ] ''
|
|
||||||
$DRY_RUN_CMD rm $VERBOSE_ARG -rf ${config.xdg.configHome}/systemd/user
|
|
||||||
'';
|
|
||||||
# I wonder if it's possible to do this in a slightly more Nix way, without causing infinite recursion
|
|
||||||
|
|
||||||
# Create a graphical entrypoint by overriding one of the OS programs
|
|
||||||
graphicalEntrypoints =
|
|
||||||
let
|
|
||||||
graphicalBin = "${config.home.homeDirectory}/.local/bin";
|
|
||||||
graphicalProfile = pkgs.writeTextFile {
|
|
||||||
name = "graphical-profile";
|
|
||||||
text = ''
|
|
||||||
export PATH="${graphicalBin}:$PATH"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
graphicalEntrypoint = pkgs.writeTextFile {
|
|
||||||
name = "graphical-entrypoint";
|
|
||||||
text = ''
|
|
||||||
#!/bin/sh
|
|
||||||
exec ${ensureNixPath} ${config.xsession.scriptPath}
|
|
||||||
'';
|
|
||||||
executable = true;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
# lib.mkIf config.frogeye.desktop.xorg # TODO Removed because wrong ordering or something?
|
|
||||||
lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
|
||||||
$DRY_RUN_CMD cp $VERBOSE_ARG -L -f ${graphicalProfile} ${config.home.homeDirectory}/.xprofile
|
|
||||||
$DRY_RUN_CMD cp $VERBOSE_ARG -L -f ${graphicalEntrypoint} ${graphicalBin}/cinnamon-session-cinnamon
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
# Ubuntu gives you this for some reason, but it just makes warnings
|
|
||||||
xsession.initExtra = ''
|
|
||||||
unset LD_PRELOAD
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Some systemd options don't work if you're running a proot inside, so they need to be relaxed
|
|
||||||
systemd.user = {
|
|
||||||
services = {
|
|
||||||
mpd.Service = {
|
|
||||||
# This tries to override PATH for some reason, which makes ensure_nix not work
|
|
||||||
Environment = lib.mkForce [ ];
|
|
||||||
# Since we're wrapping in ensure_nix, notifications for Type=notify
|
|
||||||
# will come from a process lower
|
|
||||||
NotifyAccess = "all";
|
|
||||||
};
|
|
||||||
# Below might be applicable on all services that use those options, but none is to test right now
|
|
||||||
syncthing.Service = {
|
|
||||||
PrivateUsers = lib.mkForce [ ];
|
|
||||||
RestrictNamespaces = lib.mkForce [ ];
|
|
||||||
SystemCallFilter = lib.mkForce [ ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -3,7 +3,6 @@
|
||||||
options.frogeye = {
|
options.frogeye = {
|
||||||
extra = lib.mkEnableOption "Big software";
|
extra = lib.mkEnableOption "Big software";
|
||||||
gaming = lib.mkEnableOption "Games";
|
gaming = lib.mkEnableOption "Games";
|
||||||
userNix = lib.mkEnableOption "Nix is \"installed\" in ~/.nix";
|
|
||||||
polarity = lib.mkOption {
|
polarity = lib.mkOption {
|
||||||
default = "light";
|
default = "light";
|
||||||
description = "Whether to use light theme or dark theme.";
|
description = "Whether to use light theme or dark theme.";
|
||||||
|
@ -18,7 +17,6 @@
|
||||||
description = "A list of xrandr screen names from left to right.";
|
description = "A list of xrandr screen names from left to right.";
|
||||||
type = lib.types.listOf lib.types.str;
|
type = lib.types.listOf lib.types.str;
|
||||||
};
|
};
|
||||||
nixGLIntel = lib.mkEnableOption "Enable nixGLIntel/nixVulkanIntel for windows manager";
|
|
||||||
maxVideoHeight = lib.mkOption {
|
maxVideoHeight = lib.mkOption {
|
||||||
type = lib.types.int;
|
type = lib.types.int;
|
||||||
description = "Maximum video height in pixel the machine can reasonably watch";
|
description = "Maximum video height in pixel the machine can reasonably watch";
|
||||||
|
|
Loading…
Reference in a new issue