format with alejandra and other things

std
Hung 2023-06-17 17:46:31 -07:00
parent 1537fea0bd
commit e7efe1a965
101 changed files with 2630 additions and 2175 deletions

View File

@ -1,5 +1,6 @@
# We use top-level nix-flake, so default.nix is basically just a wrapper around ./flake.nix # We use top-level nix-flake, so default.nix is basically just a wrapper around ./flake.nix
(import (
import
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
@ -7,5 +8,6 @@
in in
c_.fetchTree lock.nodes.flake-compat.locked c_.fetchTree lock.nodes.flake-compat.locked
) )
{ src = ./.; } {src = ./.;}
).defaultNix )
.defaultNix

View File

@ -4,10 +4,12 @@
# Should also incorporate shortcuts like scripts/{hm-switch,conf-sysnix}.sh in here instead # Should also incorporate shortcuts like scripts/{hm-switch,conf-sysnix}.sh in here instead
# #
# It should not contain PDE # It should not contain PDE
{ pkgs ? import <nixpkgs> { } {
, lib pkgs ? import <nixpkgs> {},
, ... lib,
}: pkgs.mkShell { ...
}:
pkgs.mkShell {
# mkShell doesn't care about the differences across nativeBuildInputs, # mkShell doesn't care about the differences across nativeBuildInputs,
# buildInputs, or packages # buildInputs, or packages
buildInputs = [ buildInputs = [
@ -26,4 +28,3 @@
# env vars # env vars
lol = "hello world"; lol = "hello world";
} }

View File

@ -429,11 +429,11 @@
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1686869522, "lastModified": 1686960236,
"narHash": "sha256-tbJ9B8WLCTnVP/LwESRlg0dII6Zyg2LmUU/mB9Lu98E=", "narHash": "sha256-AYCC9rXNLpUWzD9hm+askOfpliLEC9kwAo7ITJc4HIw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "7c67f006ea0e7d0265f16d7df07cc076fdffd91f", "rev": "04af42f3b31dba0ef742d254456dc4c14eedac86",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -9,10 +9,11 @@
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
deploy-rs.url = "github:serokell/deploy-rs"; deploy-rs.url = "github:serokell/deploy-rs";
std.url = "github:divnix/std"; std.url = "github:divnix/std";
hive.url = "github:divnix/hive"; rust-overlay = "github:oxalica/rust-overlay.git";
}; };
outputs = { std, hive, ... }@inputs: std.growOn outputs = {std, ...} @ inputs:
std.growOn
{ {
# boilerplate # boilerplate
inherit inputs; inherit inputs;
@ -21,22 +22,23 @@
cellsFrom = ./nix/cells; cellsFrom = ./nix/cells;
# modules = ./nix/modules; # modules = ./nix/modules;
cellBlocks = cellBlocks = let
let
inherit (std.blockTypes) devshells functions; inherit (std.blockTypes) devshells functions;
in in [
[
(devshells "devshells") (devshells "devshells")
(devshells "userShells") (devshells "userShells")
# (functions "host_profile") (functions "home-profiles")
# (functions "home_profile") (functions "home-modules")
]; ];
} }
{ {
devShells = std.harvest [ [ "dotfiles" "devshells" ] ]; devShells = std.harvest [["dotfiles" "devshells"]];
# nixosConfigurations = std.pick [ [ "dotfiles" "nixos" ] ]; # nixosConfigurations = std.pick [ [ "dotfiles" "nixos" ] ];
# homeConfigurations = std.pick [ [ "dotfiles" "home" ] ]; # homeConfigurations = std.pick [ [ "dotfiles" "home" ] ];
homeModules = std.pick [["repo" "home-modules"]]; homeModules = std.pick [["repo" "home-modules"]];
# TODO: Debug only
homeProfiles = std.pick [["repo" "home-profiles"]];
packages = std.harvest [["repo" "home-configs"]];
}; };
} }

View File

@ -1,15 +1,19 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = [ ]; config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [];
boot.initrd.availableKernelModules = [ ]; boot.initrd.availableKernelModules = [];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
## NOTE: These filesystems are mounted by a wrapper script from nix-wsl ## NOTE: These filesystems are mounted by a wrapper script from nix-wsl
@ -43,25 +47,22 @@
# fsType = "drvfs"; # fsType = "drvfs";
# }; # };
fileSystems."/mnt/c" = fileSystems."/mnt/c" = {
{
device = "C:"; device = "C:";
fsType = "drvfs"; fsType = "drvfs";
}; };
fileSystems."/mnt/d" = fileSystems."/mnt/d" = {
{
device = "D:"; device = "D:";
fsType = "drvfs"; fsType = "drvfs";
}; };
fileSystems."/mnt/f" = fileSystems."/mnt/f" = {
{
device = "F:"; device = "F:";
fsType = "drvfs"; fsType = "drvfs";
}; };
swapDevices = [ ]; swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,12 +1,12 @@
{ nixpkgs {
, agenix nixpkgs,
, home-manager agenix,
, flake-utils home-manager,
, nixgl flake-utils,
, rust-overlay nixgl,
, flake-compat rust-overlay,
, pkgs flake-compat,
, lib pkgs,
, proj_root lib,
}: { } proj_root,
}: {}

View File

@ -1,20 +1,23 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
]; ];
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
# boot.initrd.kernelModules = [ "amdgpu" ]; # boot.initrd.kernelModules = [ "amdgpu" ];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ "kvm-amd" "coretemp" ]; boot.kernelModules = ["kvm-amd" "coretemp"];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" =
# Might be wise to use /dev/nvme0p1 instead # Might be wise to use /dev/nvme0p1 instead
@ -30,7 +33,7 @@
fsType = "vfat"; fsType = "vfat";
}; };
swapDevices = [ ]; swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,18 +1,18 @@
{ nixpkgs {
, agenix nixpkgs,
, home-manager agenix,
, flake-utils home-manager,
, nixgl flake-utils,
, rust-overlay nixgl,
, flake-compat rust-overlay,
, pkgs flake-compat,
, lib pkgs,
, proj_root lib,
, nixosDefaultVersion ? "22.05" proj_root,
, defaultSystem ? "x86_64-linux" nixosDefaultVersion ? "22.05",
, ... defaultSystem ? "x86_64-linux",
}@finalInputs: ...
let } @ finalInputs: let
config = { config = {
bao.metadata = { bao.metadata = {
# req # req
@ -33,26 +33,30 @@ let
]; ];
}; };
}; };
propagate = hostConfig@{ metadata, nixosConfig }: propagate = hostConfig @ {
let metadata,
nixosConfig,
}: let
# req # req
inherit (metadata) hostName; inherit (metadata) hostName;
# opts # opts
ssh_pubkey = lib.attrByPath [ "ssh_pubkey" ] null metadata; # metadata.ssh_pubkey??undefined ssh_pubkey = lib.attrByPath ["ssh_pubkey"] null metadata; # metadata.ssh_pubkey??undefined
users = lib.attrByPath [ "users" ] { } metadata; users = lib.attrByPath ["users"] {} metadata;
nixosVersion = lib.attrByPath [ "nixosVersion" ] nixosDefaultVersion metadata; nixosVersion = lib.attrByPath ["nixosVersion"] nixosDefaultVersion metadata;
system = lib.attrByPath [ "system" ] defaultSystem metadata; system = lib.attrByPath ["system"] defaultSystem metadata;
preset = lib.attrByPath [ "preset" ] "base" metadata; preset = lib.attrByPath ["preset"] "base" metadata;
# infer # infer
hardwareConfig = import "${proj_root.hosts.path}/${hostName}/hardware-configuration.nix"; hardwareConfig = import "${proj_root.hosts.path}/${hostName}/hardware-configuration.nix";
# alias to prevent infinite recursion # alias to prevent infinite recursion
_nixosConfig = nixosConfig; _nixosConfig = nixosConfig;
in in {
{
inherit hostName ssh_pubkey users nixosVersion system preset hardwareConfig; inherit hostName ssh_pubkey users nixosVersion system preset hardwareConfig;
nixosConfig = _nixosConfig // { nixosConfig =
_nixosConfig
// {
inherit system; inherit system;
modules = [ modules =
[
{ {
config._module.args = { config._module.args = {
inherit proj_root; inherit proj_root;
@ -66,21 +70,21 @@ let
users.users = users; users.users = users;
} }
{ {
imports = [ agenix.nixosModule ]; imports = [agenix.nixosModule];
environment.systemPackages = [ agenix.defaultPackage.x86_64-linux ]; environment.systemPackages = [agenix.defaultPackage.x86_64-linux];
} }
(import "${proj_root.modules.path}/secrets.nix") (import "${proj_root.modules.path}/secrets.nix")
(import "${proj_root.modules.path}/${preset}.sys.nix") (import "${proj_root.modules.path}/${preset}.sys.nix")
] ++ _nixosConfig.modules; ]
++ _nixosConfig.modules;
}; };
}; };
# we are blessed by the fact that we engulfed nixpkgs.lib.* at top level # we are blessed by the fact that we engulfed nixpkgs.lib.* at top level
mkHostFromPropagated = propagatedHostConfig@{ nixosConfig, ... }: nixpkgs.lib.nixosSystem nixosConfig; mkHostFromPropagated = propagatedHostConfig @ {nixosConfig, ...}: nixpkgs.lib.nixosSystem nixosConfig;
mkHost = hostConfig: (lib.pipe [ propagate mkHostFromPropagated ] hostConfig); mkHost = hostConfig: (lib.pipe [propagate mkHostFromPropagated] hostConfig);
trimNull = lib.filterAttrsRecursive (name: value: value != null); trimNull = lib.filterAttrsRecursive (name: value: value != null);
flattenPubkey = lib.mapAttrs (hostName: meta_config: meta_config.metadata.ssh_pubkey); flattenPubkey = lib.mapAttrs (hostName: meta_config: meta_config.metadata.ssh_pubkey);
in in {
{
nixosConfigurations = lib.mapAttrs (name: hostConfig: mkHost hostConfig) config; nixosConfigurations = lib.mapAttrs (name: hostConfig: mkHost hostConfig) config;
# {bao = "ssh-ed25519 ..."; another_host = "ssh-rsa ...";} # {bao = "ssh-ed25519 ..."; another_host = "ssh-rsa ...";}
pubKeys = lib.getPubkey config; pubKeys = lib.getPubkey config;

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,17 +23,15 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,17 +23,15 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,11 +1,12 @@
{ nixpkgs {
, agenix nixpkgs,
, home-manager agenix,
, flake-utils home-manager,
, nixgl flake-utils,
, rust-overlay nixgl,
, flake-compat rust-overlay,
, pkgs flake-compat,
, lib pkgs,
, proj_root lib,
}: { } proj_root,
}: {}

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,8 +23,8 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems = { fileSystems = {
"/" = { "/" = {
@ -35,8 +38,7 @@
}; };
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,20 +1,23 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -23,14 +26,12 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,6 +1,6 @@
{ {
imports = [ ./gpu.sys.nix ]; imports = [./gpu.sys.nix];
boot.initrd.kernelModules = [ "amdgpu" ]; boot.initrd.kernelModules = ["amdgpu"];
services.xserver.enable = true; services.xserver.enable = true;
services.xserver.videoDrivers = [ "amdgpu" ]; services.xserver.videoDrivers = ["amdgpu"];
} }

View File

@ -1,7 +1,8 @@
{ pkgs {
, lib pkgs,
, proj_root lib,
, ... proj_root,
...
}: { }: {
imports = [ imports = [
./minimal.sys.nix ./minimal.sys.nix
@ -9,7 +10,6 @@
./tailscale.sys.nix ./tailscale.sys.nix
./ssh.sys.nix ./ssh.sys.nix
]; ];
environment.systemPackages = [ pkgs.lm_sensors ]; environment.systemPackages = [pkgs.lm_sensors];
time.timeZone = "America/Phoenix"; time.timeZone = "America/Phoenix";
} }

View File

@ -1 +1 @@
inputs: { } inputs: {}

View File

@ -1,8 +1,8 @@
{ pkgs, ... }: { {pkgs, ...}: {
environment.systemPackages = [ pkgs.clinfo pkgs.lshw pkgs.glxinfo pkgs.pciutils pkgs.vulkan-tools ]; environment.systemPackages = [pkgs.clinfo pkgs.lshw pkgs.glxinfo pkgs.pciutils pkgs.vulkan-tools];
hardware.opengl = { hardware.opengl = {
enable = true; enable = true;
extraPackages = [ pkgs.rocm-opencl-icd pkgs.rocm-opencl-runtime ]; extraPackages = [pkgs.rocm-opencl-icd pkgs.rocm-opencl-runtime];
# Vulkan # Vulkan
driSupport = true; driSupport = true;
driSupport32Bit = true; driSupport32Bit = true;

View File

@ -1,6 +1,7 @@
{ pkgs {
, my-lib pkgs,
, ... my-lib,
...
}: { }: {
environment.noXlibs = my-lib.mkForce false; environment.noXlibs = my-lib.mkForce false;
# TODO: wireless networking # TODO: wireless networking
@ -11,8 +12,9 @@
services.xserver.displayManager.sddm.enable = true; services.xserver.displayManager.sddm.enable = true;
services.xserver.desktopManager.plasma5 = { services.xserver.desktopManager.plasma5 = {
enable = true; enable = true;
excludePackages = let plasma5 = pkgs.libsForQt5; in excludePackages = let
[ plasma5 = pkgs.libsForQt5;
in [
plasma5.elisa # audio viewer plasma5.elisa # audio viewer
plasma5.konsole # I use alacritty instaed plasma5.konsole # I use alacritty instaed
plasma5.plasma-browser-integration plasma5.plasma-browser-integration

View File

@ -1,10 +1,11 @@
{ pkgs {
, lib pkgs,
, proj_root lib,
, modulesPath proj_root,
, ... modulesPath,
...
}: { }: {
imports = [ "${modulesPath}/profiles/minimal.nix" ]; imports = ["${modulesPath}/profiles/minimal.nix"];
# prune old builds after a while # prune old builds after a while
nix.settings.auto-optimise-store = true; nix.settings.auto-optimise-store = true;
nix.package = pkgs.nixFlakes; # nix flakes nix.package = pkgs.nixFlakes; # nix flakes

View File

@ -1,10 +1,11 @@
{ pkgs
, lib
, config
, ...
}:
let cfg = config.mod.mosh; in
{ {
pkgs,
lib,
config,
...
}: let
cfg = config.mod.mosh;
in {
options.mod.mosh = { options.mod.mosh = {
enable = lib.mkOption { enable = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
@ -14,12 +15,14 @@ let cfg = config.mod.mosh; in
}; };
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.mosh ]; environment.systemPackages = [pkgs.mosh];
networking.firewall = lib.mkIf config.networking.firewall.enable { networking.firewall = lib.mkIf config.networking.firewall.enable {
allowedUDPPortRanges = [ allowedUDPPortRanges = [
{ from = 60000; to = 61000; } # mosh {
from = 60000;
to = 61000;
} # mosh
]; ];
}; };
}; };
} }

View File

@ -1,7 +1,7 @@
{ config, ... }: { {config, ...}: {
imports = [ ./gpu.sys.nix ]; imports = [./gpu.sys.nix];
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
services.xserver.enable = true; services.xserver.enable = true;
services.xserver.videoDrivers = [ "nvidia" ]; services.xserver.videoDrivers = ["nvidia"];
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable; hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable;
} }

View File

@ -1,15 +1,16 @@
{ config, pkgs, lib }: {
let config,
gpu_pkgs = [ pkgs.clinfo pkgs.lshw pkgs.glxinfo pkgs.pciutils pkgs.vulkan-tools ]; pkgs,
lib,
}: let
gpu_pkgs = [pkgs.clinfo pkgs.lshw pkgs.glxinfo pkgs.pciutils pkgs.vulkan-tools];
gpu_conf = { gpu_conf = {
# openCL # openCL
hardware.opengl = { hardware.opengl = {
enable = true; enable = true;
extraPackages = extraPackages = let
let
inherit (pkgs) rocm-opencl-icd rocm-opencl-runtime; inherit (pkgs) rocm-opencl-icd rocm-opencl-runtime;
in in [rocm-opencl-icd rocm-opencl-runtime];
[ rocm-opencl-icd rocm-opencl-runtime ];
# Vulkan # Vulkan
driSupport = true; driSupport = true;
driSupport32Bit = true; driSupport32Bit = true;
@ -18,4 +19,5 @@ let
}; };
environment.systemPackages = gpu_pkgs; environment.systemPackages = gpu_pkgs;
}; };
in gpu_conf in
gpu_conf

View File

@ -1,6 +1,4 @@
{ proj_root {proj_root, ...}: {
, ...
}: {
age.secrets.s3fs = { age.secrets.s3fs = {
file = "${proj_root.secrets.path}/s3fs.age"; file = "${proj_root.secrets.path}/s3fs.age";
# mode = "600"; # owner + group only # mode = "600"; # owner + group only

View File

@ -1,5 +1,10 @@
# Personal configuration on storage solution # Personal configuration on storage solution
{ pkgs, config, lib, ... }: { {
pkgs,
config,
lib,
...
}: {
environment.systemPackages = [ environment.systemPackages = [
pkgs.s3fs pkgs.s3fs
pkgs.cifs-utils pkgs.cifs-utils
@ -9,8 +14,7 @@
# HACK: need to store secret somewhere so that root can access this # HACK: need to store secret somewhere so that root can access this
# because autofs may run as root for now, we enforce putting the secret in this monorepo # because autofs may run as root for now, we enforce putting the secret in this monorepo
# TODO: make this configuration nix-less to show that it's 100% data # TODO: make this configuration nix-less to show that it's 100% data
services.autofs = services.autofs = let
let
# confToBackendArg {lol="what"; empty=""; name_only=null;} -> "lol=what,empty=,name_only" # confToBackendArg {lol="what"; empty=""; name_only=null;} -> "lol=what,empty=,name_only"
# TODO: change null -> true/false. This allows overriding & better self-documentation # TODO: change null -> true/false. This allows overriding & better self-documentation
confToBackendArg = conf: (lib.concatStringsSep "," confToBackendArg = conf: (lib.concatStringsSep ","
@ -24,15 +28,13 @@
# backend_args, so just put the bucket name here # backend_args, so just put the bucket name here
# #
#-> "${mount_dest} ${formatted_args} ${s3fs-bin}#${bucket}" #-> "${mount_dest} ${formatted_args} ${s3fs-bin}#${bucket}"
autofs-s3fs_entry = autofs-s3fs_entry = {
{ mount_dest mount_dest,
, backend_args ? { "-fstype" = "fuse"; } backend_args ? {"-fstype" = "fuse";},
, bucket bucket,
}@inputs: } @ inputs: let
let
s3fs-exec = "${pkgs.s3fs}/bin/s3fs"; s3fs-exec = "${pkgs.s3fs}/bin/s3fs";
in in "${mount_dest} ${confToBackendArg backend_args} :${s3fs-exec}\#${bucket}";
"${mount_dest} ${confToBackendArg backend_args} :${s3fs-exec}\#${bucket}";
personalStorage = [ personalStorage = [
(autofs-s3fs_entry { (autofs-s3fs_entry {
mount_dest = "garden"; mount_dest = "garden";
@ -61,8 +63,7 @@
dir_mode = "0777"; dir_mode = "0777";
file_mode = "0777"; file_mode = "0777";
}; };
in in "felia_d ${confToBackendArg args} ://felia.coati-celsius.ts.net/d"
"felia_d ${confToBackendArg args} ://felia.coati-celsius.ts.net/d"
) )
( (
let let
@ -75,13 +76,11 @@
dir_mode = "0777"; dir_mode = "0777";
file_mode = "0777"; file_mode = "0777";
}; };
in in "felia_f ${confToBackendArg args} ://felia.coati-celsius.ts.net/f"
"felia_f ${confToBackendArg args} ://felia.coati-celsius.ts.net/f"
) )
]; ];
persoConf = pkgs.writeText "auto.personal" (builtins.concatStringsSep "\n" personalStorage); persoConf = pkgs.writeText "auto.personal" (builtins.concatStringsSep "\n" personalStorage);
in in {
{
enable = true; enable = true;
# Creates /perso directory with every subdirectory declared by ${personalStorage} # Creates /perso directory with every subdirectory declared by ${personalStorage}
# as of now (might be stale), /perso/hot is the only mount accessible # as of now (might be stale), /perso/hot is the only mount accessible

View File

@ -1,22 +1,25 @@
{ pkgs {
, config pkgs,
, lib config,
, ... lib,
}: let cfg = config.mod.tailscale; in { ...
}: let
cfg = config.mod.tailscale;
in {
options.mod.tailscale = { options.mod.tailscale = {
enable = lib.mkEnableOption "tailscale"; enable = lib.mkEnableOption "tailscale";
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.tailscale ]; environment.systemPackages = [pkgs.tailscale];
services.tailscale.enable = true; services.tailscale.enable = true;
systemd.services.tailscale-autoconnect = { systemd.services.tailscale-autoconnect = {
description = "Automatically connects to Tailscale"; description = "Automatically connects to Tailscale";
# make sure tailscale is running before trying to connect to tailscale # make sure tailscale is running before trying to connect to tailscale
after = [ "network-pre.target" "tailscale.service" ]; after = ["network-pre.target" "tailscale.service"];
wants = [ "network-pre.target" "tailscale.service" ]; wants = ["network-pre.target" "tailscale.service"];
wantedBy = [ "multi-user.target" ]; wantedBy = ["multi-user.target"];
# set this service as a oneshot job # set this service as a oneshot job
serviceConfig.Type = "oneshot"; serviceConfig.Type = "oneshot";

View File

@ -1,4 +1,4 @@
{ config, ... }: { {config, ...}: {
networking.wireless.enable = true; networking.wireless.enable = true;
networking.wireless.environmentFile = config.age.secrets."wifi.env"; networking.wireless.environmentFile = config.age.secrets."wifi.env";
networking.wireless.networks = { networking.wireless.networks = {

View File

@ -5,8 +5,13 @@ Contains all configurations that are written in their native configuration langu
## Why native language? ## Why native language?
- Easier portability - Easier portability
- Syntax highlighting and robust checking without needing to realize derivation
- Nix can read from [JSON](https://nixos.org/manual/nix/stable/language/builtins.html#builtins-fromJSON), - Nix can read from [JSON](https://nixos.org/manual/nix/stable/language/builtins.html#builtins-fromJSON),
[TOML](https://nixos.org/manual/nix/stable/release-notes/rl-2.6.html#release-26-2022-01-24). [TOML](https://nixos.org/manual/nix/stable/release-notes/rl-2.6.html#release-26-2022-01-24).
- We have also managed to hack together a [fromYaml](./../nix-conf/lib/serde/default.nix), - We have also managed to hack together a [fromYaml](./../nix-conf/lib/serde/default.nix),
though it will not work for strictly pure builds or bootstrapping builds. though it will not work for strictly pure builds or bootstrapping builds.
## When to use Nix to generate config?
- Original configuraiton language requires too much duplication that can be solved with Nix

View File

@ -993,6 +993,29 @@ require('mason-lspconfig').setup_handlers({
}, },
} }
end, end,
["nil_ls"] = function()
require('lspconfig').nil_ls.setup {
on_attach = on_attach,
capabilities = capabilities,
--- refer to https://github.com/oxalica/nil/blob/main/docs/configuration.md
--- for the list of configurations available for `nil_ls`
settings = {
["nil"] = {
formatting = {
command = {"nix", "run", "nixpkgs#alejandra"},
},
nix = {
flake = {
-- calls `nix flake archive` to put a flake and its output to store
autoArchive = true,
-- auto eval flake inputs for improved completion
autoEvalInputs = true,
},
},
},
},
}
end,
}) })
require("rust-tools").setup { require("rust-tools").setup {
tools = { tools = {

View File

@ -1,16 +1,14 @@
{ config {
, proj_root config,
, myLib proj_root,
, ... myLib,
}: ...
let }: let
inherit (myLib) fromYaml; inherit (myLib) fromYaml;
actualConfig = fromYaml (builtins.readFile "${proj_root.config.path}//alacritty/alacritty.yml"); actualConfig = fromYaml (builtins.readFile "${proj_root.config.path}//alacritty/alacritty.yml");
cfg = config.base.alacritty; cfg = config.base.alacritty;
in in {
{ options.base.alacritty = {
options.base.alacritty =
{
font.family = myLib.mkOption { font.family = myLib.mkOption {
type = myLib.types.singleLineStr; type = myLib.types.singleLineStr;
default = actualConfig.font.normal.family; default = actualConfig.font.normal.family;

View File

@ -1,5 +1,9 @@
{ lib, pkgs, config, ... }:
{ {
lib,
pkgs,
config,
...
}: {
# This patch exists since Darwin's search bar requires solid apps and not # This patch exists since Darwin's search bar requires solid apps and not
# symlinked # symlinked
# TODO: QA # TODO: QA
@ -11,15 +15,15 @@
# Copy GUI apps to "~/Applications/Home Manager Apps" # Copy GUI apps to "~/Applications/Home Manager Apps"
# Based on this comment: https://github.com/nix-community/home-manager/issues/1341#issuecomment-778820334 # Based on this comment: https://github.com/nix-community/home-manager/issues/1341#issuecomment-778820334
home.activation.patch-spotlight = home.activation.patch-spotlight =
if pkgs.stdenv.isDarwin then if pkgs.stdenv.isDarwin
let then let
apps = pkgs.buildEnv { apps = pkgs.buildEnv {
name = "home-manager-applications"; name = "home-manager-applications";
paths = config.home.packages; paths = config.home.packages;
pathsToLink = "/Applications"; pathsToLink = "/Applications";
}; };
in in
lib.hm.dag.entryAfter [ "linkGeneration" ] '' lib.hm.dag.entryAfter ["linkGeneration"] ''
# Install MacOS applications to the user environment. # Install MacOS applications to the user environment.
HM_APPS="$HOME/Applications/Home Manager Apps" HM_APPS="$HOME/Applications/Home Manager Apps"
# Reset current state # Reset current state
@ -33,19 +37,18 @@
$DRY_RUN_CMD cp --archive -H --dereference ${apps}/Applications/* "$HM_APPS" $DRY_RUN_CMD cp --archive -H --dereference ${apps}/Applications/* "$HM_APPS"
$DRY_RUN_CMD chmod +w -R "$HM_APPS" $DRY_RUN_CMD chmod +w -R "$HM_APPS"
'' ''
else else "";
"";
# We need this in case upstream home-manager changes the behavior of linking # We need this in case upstream home-manager changes the behavior of linking
# applications # applications
home.activation.remove-patch-spotlight = home.activation.remove-patch-spotlight =
if pkgs.stdenv.isDarwin then if pkgs.stdenv.isDarwin
lib.hm.dag.entryBefore [ "checkLinkTargets" ] '' then
lib.hm.dag.entryBefore ["checkLinkTargets"] ''
HM_APPS="$HOME/Applications/Home Manager Apps" HM_APPS="$HOME/Applications/Home Manager Apps"
# Reset current state # Reset current state
if [ -e "$HM_APPS" ]; then if [ -e "$HM_APPS" ]; then
$DRY_RUN_CMD mv "$HM_APPS" "$HM_APPS.$(date +%Y%m%d%H%M%S)" $DRY_RUN_CMD mv "$HM_APPS" "$HM_APPS.$(date +%Y%m%d%H%M%S)"
fi fi
'' ''
else else "";
"";
} }

View File

@ -1,6 +1,4 @@
{nix-index-database {nix-index-database, ...} @ inputs: {
,...
}@inputs:{
mkModuleArgs = import ./mkModuleArgs.nix; mkModuleArgs = import ./mkModuleArgs.nix;
modules = [ modules = [
./alacritty.nix ./alacritty.nix

View File

@ -1,8 +1,8 @@
{ config {
, myLib config,
, ... myLib,
}: ...
let }: let
cfg = config.base.git; cfg = config.base.git;
baseAliases = { baseAliases = {
a = "add"; a = "add";
@ -15,12 +15,11 @@ let
co = "checkout"; co = "checkout";
b = "branch"; b = "branch";
}; };
in in {
{
options.base.git = { options.base.git = {
aliases = myLib.mkOption { aliases = myLib.mkOption {
type = myLib.types.attrs; type = myLib.types.attrs;
default = { }; default = {};
example = baseAliases; example = baseAliases;
description = '' description = ''
Additional git aliases. This settings comes with base configuration. Additional git aliases. This settings comes with base configuration.
@ -50,7 +49,7 @@ in
.gitignore patterns that are applied in every repository. .gitignore patterns that are applied in every repository.
This is useful for IDE-specific settings. This is useful for IDE-specific settings.
''; '';
example = [ ".direnv" "node_modules" ]; example = [".direnv" "node_modules"];
}; };
enable = myLib.mkOption { enable = myLib.mkOption {
type = myLib.types.bool; type = myLib.types.bool;

View File

@ -1,11 +1,14 @@
{ pkgs, config, lib, ... }: {
let pkgs,
config,
lib,
...
}: let
cfg = config.base.graphics; cfg = config.base.graphics;
cfgEnable = cfg.enable or (cfg.useNixGL.defaultPackage != null); cfgEnable = cfg.enable or (cfg.useNixGL.defaultPackage != null);
types = lib.types; types = lib.types;
in in {
{ imports = [./shells.nix];
imports = [ ./shells.nix ];
options.base.graphics = { options.base.graphics = {
enable = lib.mkEnableOption "graphics"; enable = lib.mkEnableOption "graphics";
_enable = lib.mkOption { _enable = lib.mkOption {
@ -23,7 +26,7 @@ in
]; ];
}; };
defaultPackage = lib.mkOption { defaultPackage = lib.mkOption {
type = types.nullOr (types.enum [ "nixGLIntel" "nixGLNvidia" "nixGLNvidiaBumblebee" ]); type = types.nullOr (types.enum ["nixGLIntel" "nixGLNvidia" "nixGLNvidiaBumblebee"]);
description = "Which nixGL package to be aliased as `nixGL` on the shell"; description = "Which nixGL package to be aliased as `nixGL` on the shell";
default = null; default = null;
example = "nixGLIntel"; example = "nixGLIntel";
@ -41,6 +44,6 @@ in
nixGL = cfg.useNixGL.defaultPackage; nixGL = cfg.useNixGL.defaultPackage;
}; };
}; };
home.packages = [ cfg.useNixGL.package ]; home.packages = [cfg.useNixGL.package];
}; };
} }

View File

@ -1,10 +1,14 @@
{ config, proj_root, pkgs, lib, ... }: {
let config,
proj_root,
pkgs,
lib,
...
}: let
cfg = config.base.keepass; cfg = config.base.keepass;
trimNull = lib.filterAttrsRecursive (name: value: value != null); trimNull = lib.filterAttrsRecursive (name: value: value != null);
in in {
{ imports = [./graphics.nix];
imports = [ ./graphics.nix ];
options.base.keepass = { options.base.keepass = {
enable = lib.mkEnableOption "keepass"; enable = lib.mkEnableOption "keepass";
use_gui = lib.mkOption { use_gui = lib.mkOption {
@ -42,12 +46,18 @@ in
}; };
}; };
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
home.packages = [ home.packages =
[
pkgs.kpcli-py # kp but is in cli pkgs.kpcli-py # kp but is in cli
] ++ (if cfg.use_gui or config.base.graphics._enable then [ ]
++ (
if cfg.use_gui or config.base.graphics._enable
then [
pkgs.keepass # Personal secret management pkgs.keepass # Personal secret management
] else [ ]); ]
home.file.".kp/config.ini".text = lib.generators.toINI { } (trimNull { else []
);
home.file.".kp/config.ini".text = lib.generators.toINI {} (trimNull {
default = { default = {
KEEPASSDB = cfg.path; KEEPASSDB = cfg.path;
KEEPASSDB_KEYFILE = cfg.keyfile_path; KEEPASSDB_KEYFILE = cfg.keyfile_path;

View File

@ -1,20 +1,20 @@
# Turns given inputs into the standardized shape of the inputs to configure # Turns given inputs into the standardized shape of the inputs to configure
# custom base modules in this directory. # custom base modules in this directory.
{ pkgs {
, lib ? pkgs.lib pkgs,
, ... lib ? pkgs.lib,
}@inputs: ...
let } @ inputs: let
recursiveUpdate = lib.recursiveUpdate; recursiveUpdate = lib.recursiveUpdate;
_lib = recursiveUpdate lib (import ../../lib { inherit pkgs lib; }); _lib = recursiveUpdate lib (import ../../lib {inherit pkgs lib;});
proj_root = builtins.toString ./../../..; proj_root = builtins.toString ./../../..;
in in
# TODO: Unpollute inputs # TODO: Unpollute inputs
recursiveUpdate inputs { recursiveUpdate inputs {
proj_root = { proj_root = {
path = proj_root; path = proj_root;
config.path = "${proj_root}/native_configs"; config.path = "${proj_root}/native_configs";
scripts.path = "${proj_root}/scripts"; scripts.path = "${proj_root}/scripts";
}; };
myLib = _lib; myLib = _lib;
} }

View File

@ -2,22 +2,29 @@
# #
# One thing to consider, though, /nix/store of `nix-shell` or `nix-develop` # One thing to consider, though, /nix/store of `nix-shell` or `nix-develop`
# might be different from `home-manager`'s (~/.nix_profile/bin/jq) # might be different from `home-manager`'s (~/.nix_profile/bin/jq)
{ pkgs, lib, config, proj_root, ... }: {
let pkgs,
lib,
config,
proj_root,
...
}: let
# NOTE: Add packages to nvim_pkgs instead, so that it's available at userspace # NOTE: Add packages to nvim_pkgs instead, so that it's available at userspace
# and is added to the path after wrapping. # and is added to the path after wrapping.
# check: nix repl `homeConfigurations.hungtr.config.programs.neovim.finalPackage.buildCommand` # check: nix repl `homeConfigurations.hungtr.config.programs.neovim.finalPackage.buildCommand`
# see: :/--suffix.*PATH # see: :/--suffix.*PATH
# there should be mentions of additional packages # there should be mentions of additional packages
my_neovim = pkgs.neovim-unwrapped; my_neovim = pkgs.neovim-unwrapped;
rust_pkgs = (pkgs.rust-bin.selectLatestNightlyWith rust_pkgs =
pkgs.rust-bin.selectLatestNightlyWith
( (
toolchain: toolchain:
toolchain.default.override { toolchain.default.override {
extensions = [ "rust-src" "rust-analyzer" "rust-docs" "rustfmt" "clippy" "miri" ]; extensions = ["rust-src" "rust-analyzer" "rust-docs" "rustfmt" "clippy" "miri"];
} }
)); );
nvim_pkgs = [ nvim_pkgs =
[
# pkgs.gccStdenv # pkgs.gccStdenv
pkgs.tree-sitter pkgs.tree-sitter
pkgs.fzf # file name fuzzy search pkgs.fzf # file name fuzzy search
@ -48,22 +55,33 @@ let
# pkgs.rust-analyzer # pkgs.rust-analyzer
# rust_pkgs # rust_pkgs
# pkgs.evcxr # Rust REPL for Conjure! # pkgs.evcxr # Rust REPL for Conjure!
] ++ lib.optionals (pkgs.stdenv.isDarwin) ( ]
++ lib.optionals (pkgs.stdenv.isDarwin) (
let let
inherit (pkgs.darwin.apple_sdk.frameworks) System CoreFoundation; in inherit (pkgs.darwin.apple_sdk.frameworks) System CoreFoundation;
[ in [
System System
CoreFoundation CoreFoundation
] ]
); );
in in {
{
options.base.neovim = { options.base.neovim = {
enable = lib.mkOption { enable = lib.mkOption {
default = true; default = true;
description = "enable personalized neovim as default editor"; description = "enable personalized neovim as default editor";
type = lib.types.bool; type = lib.types.bool;
example = false; example = false;
f = let
adder = {
__functor = self: arg:
if builtins.isInt arg
then self // {x = self.x + arg;}
else self.x;
x = 0;
};
in {
what = adder 1 2 3 {};
};
}; };
}; };
config = lib.mkIf config.base.neovim.enable { config = lib.mkIf config.base.neovim.enable {
@ -76,30 +94,25 @@ in
withPython3 = true; withPython3 = true;
withNodeJs = true; withNodeJs = true;
extraPackages = nvim_pkgs; extraPackages = nvim_pkgs;
extraLuaConfig = (builtins.readFile "${proj_root.config.path}//neovim/init.lua"); extraLuaConfig = builtins.readFile "${proj_root.config.path}//neovim/init.lua";
plugins = (let inherit (pkgs.vimPlugins) plugins = let
inherit
(pkgs.vimPlugins)
plenary-nvim plenary-nvim
nvim-treesitter nvim-treesitter
nvim-treesitter-textobjects nvim-treesitter-textobjects
nvim-treesitter-context nvim-treesitter-context
telescope-fzf-native-nvim telescope-fzf-native-nvim
telescope-file-browser-nvim telescope-file-browser-nvim
telescope-nvim telescope-nvim
nvim-lspconfig nvim-lspconfig
gruvbox-community gruvbox-community
neodev-nvim neodev-nvim
cmp-nvim-lsp cmp-nvim-lsp
cmp-path cmp-path
cmp-buffer cmp-buffer
cmp-cmdline cmp-cmdline
nvim-cmp nvim-cmp
lspkind-nvim lspkind-nvim
nvim-autopairs nvim-autopairs
nvim-ts-autotag nvim-ts-autotag
@ -109,7 +122,6 @@ in
luasnip luasnip
fidget-nvim fidget-nvim
rust-tools-nvim rust-tools-nvim
cmp_luasnip cmp_luasnip
gitsigns-nvim gitsigns-nvim
indent-blankline-nvim indent-blankline-nvim
@ -128,8 +140,8 @@ in
vim-dispatch-neovim vim-dispatch-neovim
vim-fugitive vim-fugitive
vim-jack-in vim-jack-in
;
; in [ in [
plenary-nvim plenary-nvim
nvim-treesitter.withAllGrammars nvim-treesitter.withAllGrammars
nvim-treesitter-textobjects nvim-treesitter-textobjects
@ -173,7 +185,7 @@ in
vim-dispatch-neovim vim-dispatch-neovim
vim-fugitive vim-fugitive
vim-jack-in vim-jack-in
]); ];
}; };
# home.packages = nvim_pkgs; # home.packages = nvim_pkgs;
}; };

View File

@ -1,9 +1,13 @@
# TODO: maybe throw if base.graphics is not enabled? # TODO: maybe throw if base.graphics is not enabled?
# Though, headless chromium might be possible # Though, headless chromium might be possible
{ config, pkgs, lib, ... }:
let cfg = config.base.private_chromium;
in
{ {
config,
pkgs,
lib,
...
}: let
cfg = config.base.private_chromium;
in {
options.base.private_chromium = { options.base.private_chromium = {
enable = lib.mkOption { enable = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
@ -19,26 +23,29 @@ in
programs.chromium = { programs.chromium = {
enable = true; enable = true;
package = pkgs.ungoogled-chromium; package = pkgs.ungoogled-chromium;
extensions = extensions = let
let
# TODO: how about a chrome extension registry? # TODO: how about a chrome extension registry?
mkChromiumExtForVersion = browserVersion: { id, sha256, extVersion, ... }: mkChromiumExtForVersion = browserVersion: {
{ id,
sha256,
extVersion,
...
}: {
inherit id; inherit id;
crxPath = builtins.fetchurl { crxPath = builtins.fetchurl {
url = "https://clients2.google.com/service/update2/crx" + url =
"?response=redirect" + "https://clients2.google.com/service/update2/crx"
"&acceptformat=crx2,crx3" + + "?response=redirect"
"&prodversion=${browserVersion}" + + "&acceptformat=crx2,crx3"
"&x=id%3D${id}%26installsource%3Dondemand%26uc"; + "&prodversion=${browserVersion}"
+ "&x=id%3D${id}%26installsource%3Dondemand%26uc";
name = "${id}.crx"; name = "${id}.crx";
inherit sha256; inherit sha256;
}; };
version = extVersion; version = extVersion;
}; };
mkChromiumExt = mkChromiumExtForVersion (lib.versions.major pkgs.ungoogled-chromium.version); mkChromiumExt = mkChromiumExtForVersion (lib.versions.major pkgs.ungoogled-chromium.version);
in in [
[
# vimium # vimium
(mkChromiumExt { (mkChromiumExt {
id = "dbepggeogbaibhgnhhndojpepiihcmeb"; id = "dbepggeogbaibhgnhhndojpepiihcmeb";

View File

@ -1,8 +1,8 @@
# A module that takes care of a GUI-ful, productive desktop environment # A module that takes care of a GUI-ful, productive desktop environment
inputs@{ pkgs, ... }: { inputs @ {pkgs, ...}: {
imports = [ imports = [
# slack # slack
({ pkgs, ... }: { ({pkgs, ...}: {
home.packages = [ home.packages = [
pkgs.slack pkgs.slack
]; ];

View File

@ -1,14 +1,14 @@
# Configurations for shell stuffs. # Configurations for shell stuffs.
# Should probably be decoupled even more for each feature # Should probably be decoupled even more for each feature
{ config
, proj_root
, myLib
, pkgs
, ...
}:
let cfg = config.base.shells;
in
{ {
config,
proj_root,
myLib,
pkgs,
...
}: let
cfg = config.base.shells;
in {
options.base.shells = { options.base.shells = {
enable = myLib.mkOption { enable = myLib.mkOption {
type = myLib.types.bool; type = myLib.types.bool;
@ -30,7 +30,7 @@ in
shellAliases = myLib.mkOption { shellAliases = myLib.mkOption {
type = myLib.types.attrs; type = myLib.types.attrs;
description = "Shell command aliases"; description = "Shell command aliases";
default = { }; default = {};
example = { example = {
nixGL = "nixGLIntel"; nixGL = "nixGLIntel";
}; };
@ -52,8 +52,8 @@ in
programs.tmux = { programs.tmux = {
enable = true; enable = true;
# extraConfigBeforePlugin = builtins.readFile "${proj_root.config.path}/tmux/tmux.conf"; # extraConfigBeforePlugin = builtins.readFile "${proj_root.config.path}/tmux/tmux.conf";
plugins = let inherit (pkgs.tmuxPlugins) cpu net-speed; in [ cpu net-speed ]; plugins = let inherit (pkgs.tmuxPlugins) cpu net-speed; in [cpu net-speed];
extraConfig = (builtins.readFile "${proj_root.config.path}/tmux/tmux.conf"); extraConfig = builtins.readFile "${proj_root.config.path}/tmux/tmux.conf";
}; };
xdg.configFile."tmux/tmux.conf".text = myLib.mkOrder 600 '' xdg.configFile."tmux/tmux.conf".text = myLib.mkOrder 600 ''
set -g status-right '#{cpu_bg_color} CPU: #{cpu_icon} #{cpu_percentage} | %a %h-%d %H:%M ' set -g status-right '#{cpu_bg_color} CPU: #{cpu_icon} #{cpu_percentage} | %a %h-%d %H:%M '
@ -69,13 +69,14 @@ in
enableZshIntegration = true; enableZshIntegration = true;
settings = let settings = let
native = builtins.fromTOML (builtins.readFile "${proj_root.config.path}/starship/starship.toml"); native = builtins.fromTOML (builtins.readFile "${proj_root.config.path}/starship/starship.toml");
patch-nix = pkgs.lib.recursiveUpdate native ({ patch-nix = pkgs.lib.recursiveUpdate native {
c.commands = [ c.commands = [
["nix" "run" "nixpkgs#clang" "--" "--version"] ["nix" "run" "nixpkgs#clang" "--" "--version"]
["nix" "run" "nixpkgs#gcc" "--" "--version"] ["nix" "run" "nixpkgs#gcc" "--" "--version"]
]; ];
}); };
in patch-nix; in
patch-nix;
}; };
# Fuzzy finder. `fzf` for TUI, `fzf -f '<fuzzy query>'` for UNIX piping # Fuzzy finder. `fzf` for TUI, `fzf -f '<fuzzy query>'` for UNIX piping
programs.fzf.enable = true; programs.fzf.enable = true;
@ -88,10 +89,12 @@ in
enable = true; enable = true;
enableCompletion = true; enableCompletion = true;
enableAutosuggestions = true; enableAutosuggestions = true;
shellAliases = { shellAliases =
{
nix-rebuild = "sudo nixos-rebuild switch"; nix-rebuild = "sudo nixos-rebuild switch";
hm-switch = "home-manager switch --flake"; hm-switch = "home-manager switch --flake";
} // (cfg.shellAliases or { }); }
// (cfg.shellAliases or {});
history = { history = {
size = 10000; size = 10000;
path = "${config.xdg.dataHome}/zsh/history"; path = "${config.xdg.dataHome}/zsh/history";
@ -119,10 +122,11 @@ in
ZVM_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :) ZVM_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :)
ZVM_ESCAPE_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :) ZVM_ESCAPE_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :)
}; };
initExtra = (cfg.shellInitExtra or "") + '' initExtra =
(cfg.shellInitExtra or "")
+ ''
source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
''; '';
}; };
}; };
} }

View File

@ -1,11 +1,11 @@
{ config
, proj_root
, myLib
, ...
}:
let cfg = config.base.ssh;
in
{ {
config,
proj_root,
myLib,
...
}: let
cfg = config.base.ssh;
in {
options.base.ssh.enable = myLib.mkOption { options.base.ssh.enable = myLib.mkOption {
type = myLib.types.bool; type = myLib.types.bool;
default = true; default = true;
@ -20,4 +20,3 @@ in
includes = ["${proj_root.config.path}/ssh/config"]; includes = ["${proj_root.config.path}/ssh/config"];
}; };
} }

View File

@ -1,5 +1,6 @@
# We use top-level nix-flake, so default.nix is basically just a wrapper around ./flake.nix # We use top-level nix-flake, so default.nix is basically just a wrapper around ./flake.nix
(import (
import
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
@ -7,5 +8,6 @@
in in
c_.fetchTree lock.nodes.flake-compat.locked c_.fetchTree lock.nodes.flake-compat.locked
) )
{ src = ./.; } {src = ./.;}
).defaultNix )
.defaultNix

View File

@ -833,11 +833,11 @@
}, },
"nixpkgs-latest": { "nixpkgs-latest": {
"locked": { "locked": {
"lastModified": 1686940302, "lastModified": 1687044368,
"narHash": "sha256-hTBVlV53sfi7ZyTkRKIVZy3V26ixnWGZnYrHvb9rCZU=", "narHash": "sha256-7eBtV3lgfgjeyBDa20Xr4O9mlcAHHFYpvo6m16tgLcY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "1f5b5df0d309144d10d409d161b50adc94157ef6", "rev": "b621273236ab985db5ff7e91171624f2e07e82a1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -882,11 +882,11 @@
}, },
"nixpkgs_10": { "nixpkgs_10": {
"locked": { "locked": {
"lastModified": 1686869522, "lastModified": 1686960236,
"narHash": "sha256-tbJ9B8WLCTnVP/LwESRlg0dII6Zyg2LmUU/mB9Lu98E=", "narHash": "sha256-AYCC9rXNLpUWzD9hm+askOfpliLEC9kwAo7ITJc4HIw=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "7c67f006ea0e7d0265f16d7df07cc076fdffd91f", "rev": "04af42f3b31dba0ef742d254456dc4c14eedac86",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1327,11 +1327,11 @@
"nixpkgs": "nixpkgs_11" "nixpkgs": "nixpkgs_11"
}, },
"locked": { "locked": {
"lastModified": 1686882360, "lastModified": 1686968542,
"narHash": "sha256-6iWVGIdIzmx/CgXPVLPyyxxBhPGYMl8sG09S8hpQ6pc=", "narHash": "sha256-Gjlj7UeHqMFRAYyefeoLnSjLo8V+0XheIamojNEyTbE=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "b519b1d7a31f1bd35423990398adecc6f7dd4dd2", "rev": "01d84cd842e48e89be67e4c2d9dc46aa7709adc5",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -43,66 +43,70 @@
}; };
}; };
outputs = outputs = flake_inputs @ {
flake_inputs@{ nixpkgs nixpkgs,
, home-manager home-manager,
, nixgl nixgl,
, rust-overlay rust-overlay,
, flake-utils flake-utils,
, kpcli-py kpcli-py,
, neovim-nightly-overlay neovim-nightly-overlay,
, nix-boost nix-boost,
, nixpkgs-latest nixpkgs-latest,
, ... ...
}: }: let
let
# config_fn:: system -> config # config_fn:: system -> config
cross_platform = config_fn: ({ cross_platform = config_fn: {
packages = builtins.foldl' packages =
(prev: system: prev // { builtins.foldl'
(prev: system:
prev
// {
"${system}" = config_fn system; "${system}" = config_fn system;
}) })
{ } {}
flake-utils.lib.defaultSystems; flake-utils.lib.defaultSystems;
}); };
in in
cross_platform (system: cross_platform (system: let
let overlays = import ./overlays.nix (flake_inputs // {inherit system;});
overlays = import ./overlays.nix (flake_inputs // { inherit system; });
# pkgs = nixpkgs.legacyPackages.${system}.appendOverlays overlays; # pkgs = nixpkgs.legacyPackages.${system}.appendOverlays overlays;
pkgs = import nixpkgs { pkgs = import nixpkgs {
inherit system overlays; inherit system overlays;
config = { allowUnfree = true; }; config = {allowUnfree = true;};
}; };
# lib = (import ../lib { inherit pkgs; lib = pkgs.lib; }); # lib = (import ../lib { inherit pkgs; lib = pkgs.lib; });
base = import ./base flake_inputs; base = import ./base flake_inputs;
inherit (base) mkModuleArgs; inherit (base) mkModuleArgs;
nerd_font_module = { config, pkgs, ... }: { nerd_font_module = {
config,
pkgs,
...
}: {
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
home.packages = [ home.packages = [
# list of fonts are available at https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/data/fonts/nerdfonts/shas.nix # list of fonts are available at https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/data/fonts/nerdfonts/shas.nix
(pkgs.nerdfonts.override { fonts = [ "Hack" ]; }) (pkgs.nerdfonts.override {fonts = ["Hack"];})
]; ];
base.alacritty.font.family = "Hack Nerd Font Mono"; base.alacritty.font.family = "Hack Nerd Font Mono";
}; };
in in {
{
debug = { debug = {
inherit overlays pkgs base; inherit overlays pkgs base;
}; };
homeConfigurations = homeConfigurations = let
let
x11_wsl = '' x11_wsl = ''
# x11 output for WSL # x11 output for WSL
export DISPLAY=$(ip route list default | awk '{print $3}'):0 export DISPLAY=$(ip route list default | awk '{print $3}'):0
export LIBGL_ALWAYS_INDIRECT=1 export LIBGL_ALWAYS_INDIRECT=1
''; '';
in in {
{
"hungtr" = home-manager.lib.homeManagerConfiguration { "hungtr" = home-manager.lib.homeManagerConfiguration {
inherit pkgs; inherit pkgs;
modules = base.modules ++ [ modules =
base.modules
++ [
./home.nix ./home.nix
]; ];
# optionally pass inarguments to module # optionally pass inarguments to module
@ -118,7 +122,9 @@
}; };
"hungtr@bao" = home-manager.lib.homeManagerConfiguration { "hungtr@bao" = home-manager.lib.homeManagerConfiguration {
inherit pkgs; inherit pkgs;
modules = base.modules ++ [ modules =
base.modules
++ [
./home.nix ./home.nix
nerd_font_module nerd_font_module
./base/productive_desktop.nix ./base/productive_desktop.nix
@ -145,7 +151,9 @@
# Personal darwin, effectively serves as the Darwin edge channel # Personal darwin, effectively serves as the Darwin edge channel
"hungtran" = home-manager.lib.homeManagerConfiguration { "hungtran" = home-manager.lib.homeManagerConfiguration {
inherit pkgs; inherit pkgs;
modules = base.modules ++ [ modules =
base.modules
++ [
./home.nix ./home.nix
{ {
base.graphics.enable = false; base.graphics.enable = false;
@ -177,7 +185,9 @@
# Work darwin # Work darwin
"htran" = home-manager.lib.homeManagerConfiguration { "htran" = home-manager.lib.homeManagerConfiguration {
inherit pkgs; inherit pkgs;
modules = base.modules ++ [ modules =
base.modules
++ [
./home.nix ./home.nix
./base/productive_desktop.nix ./base/productive_desktop.nix
./base/darwin-spotlight.nix ./base/darwin-spotlight.nix
@ -198,7 +208,7 @@
pkgs.postman pkgs.postman
]; ];
} }
{ base.keepass.enable = pkgs.lib.mkForce false; } {base.keepass.enable = pkgs.lib.mkForce false;}
]; ];
extraSpecialArgs = mkModuleArgs { extraSpecialArgs = mkModuleArgs {
inherit pkgs; inherit pkgs;
@ -214,8 +224,10 @@
./home.nix ./home.nix
{ {
base.shells = { base.shells = {
shellInitExtra = '' shellInitExtra =
'' + x11_wsl; ''
''
+ x11_wsl;
}; };
} }
]; ];
@ -233,7 +245,9 @@
# Personal laptop # Personal laptop
hwtr = home-manager.lib.homeManagerConfiguration { hwtr = home-manager.lib.homeManagerConfiguration {
inherit pkgs; inherit pkgs;
modules = base.modules ++ [ modules =
base.modules
++ [
./home.nix ./home.nix
./base/graphics.nix ./base/graphics.nix
{ {

View File

@ -3,18 +3,17 @@
# This file represents the base settings for each machine # This file represents the base settings for each machine
# Additional configurations goes to profiles/<user> # Additional configurations goes to profiles/<user>
# or inlined in flake.nix # or inlined in flake.nix
{ config # Represents the realized final configuration
, pkgs # This is by default just ``= import <nixpkgs>{}`
, myHome
, myLib
, option # The options we're given, this might be useful for typesafety?
, proj_root
, ...
}:
let
inherit (myLib) fromYaml;
in
{ {
config, # Represents the realized final configuration
pkgs, # This is by default just ``= import <nixpkgs>{}`
myHome,
myLib,
option, # The options we're given, this might be useful for typesafety?
proj_root,
...
}: let
inherit (myLib) fromYaml;
in {
imports = [ imports = [
./base/neovim.nix ./base/neovim.nix
./base/keepass.nix ./base/keepass.nix
@ -24,7 +23,8 @@ in
homeDirectory = myHome.homeDirectory; homeDirectory = myHome.homeDirectory;
stateVersion = myHome.stateVersion or "22.05"; stateVersion = myHome.stateVersion or "22.05";
}; };
home.packages = pkgs.lib.unique ([ home.packages = pkgs.lib.unique (
[
# pkgs.ncdu # pkgs.ncdu
pkgs.rclone # cloud file operations pkgs.rclone # cloud file operations
pkgs.htop # system diagnostics in CLI pkgs.htop # system diagnostics in CLI
@ -46,9 +46,15 @@ in
# pkgs.python310.numpy # pkgs.python310.numpy
# pkgs.python310Packages.tensorflow # pkgs.python310Packages.tensorflow
# pkgs.python310Packages.scikit-learn # pkgs.python310Packages.scikit-learn
] ++ (myHome.packages or [ ]) ++ (if pkgs.system == "x86_64-linux" then [ ]
++ (myHome.packages or [])
++ (
if pkgs.system == "x86_64-linux"
then [
pkgs.logseq pkgs.logseq
] else [ ]) ]
else []
)
); );
## Configs ## ## Configs ##

View File

@ -1,14 +1,14 @@
flake_input@{ kpcli-py flake_input @ {
, nixgl kpcli-py,
, rust-overlay nixgl,
, neovim-nightly-overlay rust-overlay,
, system neovim-nightly-overlay,
, nix-boost system,
, nixpkgs-latest nix-boost,
, ... nixpkgs-latest,
}: ...
let }: let
kpcli-py = (final: prev: { kpcli-py = final: prev: {
# use python3.9, which works because of cython somehow? # use python3.9, which works because of cython somehow?
kpcli-py = final.poetry2nix.mkPoetryApplication { kpcli-py = final.poetry2nix.mkPoetryApplication {
projectDir = flake_input.kpcli-py; projectDir = flake_input.kpcli-py;
@ -16,12 +16,12 @@ let
# tableformatter requires setuptools # tableformatter requires setuptools
tableformatter = super.tableformatter.overridePythonAttrs ( tableformatter = super.tableformatter.overridePythonAttrs (
old: { old: {
buildInputs = (old.buildInputs or [ ]) ++ [ self.setuptools self.cython_3 ]; buildInputs = (old.buildInputs or []) ++ [self.setuptools self.cython_3];
src = old.src; src = old.src;
} }
); );
kpcli = super.kpcli.overridePythonAttrs (old: { kpcli = super.kpcli.overridePythonAttrs (old: {
buildInputs = (old.buildInputs or [ ]) ++ [ self.setuptools ]; buildInputs = (old.buildInputs or []) ++ [self.setuptools];
}); });
# ubersmith = super.ubersmith.overridePythonAttrs (old: { # ubersmith = super.ubersmith.overridePythonAttrs (old: {
@ -37,34 +37,30 @@ let
# sha256 = "sha256-Dystt7CBtjpLkgzCsAif8WkkYYeLyh7VMehAtwoDGuM="; # sha256 = "sha256-Dystt7CBtjpLkgzCsAif8WkkYYeLyh7VMehAtwoDGuM=";
# }; # };
# }); # });
}); });
}; };
}); };
rust = (final: prev: rust = final: prev: let
let nightlyRustWithExts = exts:
nightlyRustWithExts = exts: final.rust-bin.selectLatestNightlyWith ( final.rust-bin.selectLatestNightlyWith (
toolchain: (toolchain.minimal.override { toolchain: (toolchain.minimal.override {
extensions = exts; extensions = exts;
}) })
); );
# https://rust-lang.github.io/rustup/concepts/profiles.html # https://rust-lang.github.io/rustup/concepts/profiles.html
rust-default-components = [ "rust-docs" "rustfmt" "clippy" ]; rust-default-components = ["rust-docs" "rustfmt" "clippy"];
rust-dev-components = rust-default-components ++ [ "rust-src" "rust-analyzer" "miri" ]; rust-dev-components = rust-default-components ++ ["rust-src" "rust-analyzer" "miri"];
in in {
{
rust4devs = nightlyRustWithExts rust-dev-components; rust4devs = nightlyRustWithExts rust-dev-components;
rust4cargo = nightlyRustWithExts [ ]; rust4cargo = nightlyRustWithExts [];
rust4normi = nightlyRustWithExts rust-default-components; rust4normi = nightlyRustWithExts rust-default-components;
}); };
vimPlugins = final: prev: {
vimPlugins = (final: prev: {
inherit (nixpkgs-latest.legacyPackages.${system}) vimPlugins; inherit (nixpkgs-latest.legacyPackages.${system}) vimPlugins;
}); };
in in [
[
nix-boost.overlays.default nix-boost.overlays.default
nixgl.overlays.default nixgl.overlays.default
rust-overlay.overlays.default rust-overlay.overlays.default

View File

@ -1,5 +1,8 @@
# main module exporter for different configuration profiles # main module exporter for different configuration profiles
{ pkgs, libs, ... } @ inputs:
{ {
pkgs,
libs,
...
} @ inputs: {
hwtr = import ./hwtr.nix; hwtr = import ./hwtr.nix;
} }

View File

@ -1,12 +1,12 @@
{ pkgs {
, lib ? pkgs.lib pkgs,
, ... lib ? pkgs.lib,
}@flake_import: ...
let } @ flake_import: let
serde = import ./serde { inherit pkgs lib; }; serde = import ./serde {inherit pkgs lib;};
recursiveUpdate = lib.recursiveUpdate; recursiveUpdate = lib.recursiveUpdate;
in in
recursiveUpdate (recursiveUpdate pkgs.lib lib) { recursiveUpdate (recursiveUpdate pkgs.lib lib) {
fromYaml = serde.fromYaml; fromYaml = serde.fromYaml;
fromYamlPath = serde.fromYamlPath; fromYamlPath = serde.fromYamlPath;
} }

View File

@ -1,31 +1,38 @@
# Takes care of serializing and deserializing to some formats # Takes care of serializing and deserializing to some formats
# Blame: Pegasust<pegasucksgg@gmail.com> # Blame: Pegasust<pegasucksgg@gmail.com>
# TODO: Add to* formats from pkgs.formats.* # TODO: Add to* formats from pkgs.formats.*
{ pkgs {
, lib pkgs,
} @ inputs: lib,
let } @ inputs: let
yamlToJsonDrv = yamlContent: outputPath: pkgs.callPackage yamlToJsonDrv = yamlContent: outputPath:
({ runCommand }: pkgs.callPackage
({runCommand}:
# runCommand source: https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/trivial-builders.nix#L33 # runCommand source: https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/trivial-builders.nix#L33
runCommand outputPath { inherit yamlContent; nativeBuildInputs = [ pkgs.yq ]; } runCommand outputPath {
inherit yamlContent;
nativeBuildInputs = [pkgs.yq];
}
# run yq which outputs '.' (no filter) on file at yamlPath # run yq which outputs '.' (no filter) on file at yamlPath
# note that $out is passed onto the bash/sh script for execution # note that $out is passed onto the bash/sh script for execution
'' ''
echo "$yamlContent" | yq >$out echo "$yamlContent" | yq >$out
'') '')
{ }; {};
in in {
{
# Takes in a yaml string and produces a derivation with translated JSON at $outputPath # Takes in a yaml string and produces a derivation with translated JSON at $outputPath
# similar to builtins.fromJSON, turns a YAML string to nix attrset # similar to builtins.fromJSON, turns a YAML string to nix attrset
fromYaml = yamlContent: builtins.fromJSON (builtins.readFile (yamlToJsonDrv yamlContent "any_output.json")); fromYaml = yamlContent: builtins.fromJSON (builtins.readFile (yamlToJsonDrv yamlContent "any_output.json"));
fromYamlPath = yamlPath: builtins.fromJSON ( fromYamlPath = yamlPath:
builtins.fromJSON (
builtins.readFile ( builtins.readFile (
yamlToJsonDrv yamlToJsonDrv
( (
builtins.readFile yamlPath) builtins.readFile yamlPath
"any-output.json")); )
"any-output.json"
)
);
fromTOML = builtins.fromTOML; fromTOML = builtins.fromTOML;
fromJSON = builtins.fromJSON; fromJSON = builtins.fromJSON;
} }

View File

@ -1,10 +1,11 @@
# This module aims to be merge (not inject/override) with top-level pkgs to provide # This module aims to be merge (not inject/override) with top-level pkgs to provide
# personalized/custom packages # personalized/custom packages
{ pkgs {
, lib pkgs,
, naersk # rust packages lib,
, ... naersk, # rust packages
}@pkgs_input: { ...
} @ pkgs_input: {
# dot-hwtr = import "./dot-hwtr" pkgs_input; # dot-hwtr = import "./dot-hwtr" pkgs_input;
cargo-bacon = pkgs.rustPlatform.buildRustPackage rec { cargo-bacon = pkgs.rustPlatform.buildRustPackage rec {
pname = "bacon"; pname = "bacon";

View File

@ -4,10 +4,12 @@
rust-overlay.url = "github:oxalica/rust-overlay"; rust-overlay.url = "github:oxalica/rust-overlay";
naersk.url = "gihub:nix-community/naersk"; naersk.url = "gihub:nix-community/naersk";
}; };
outputs = { nixpkgs, rust-overlay, naersk }: outputs = {
let nixpkgs,
pkgs = import nixpkgs { overlays = [ rust-overlay.overlays.default ]; }; rust-overlay,
naersk,
}: let
pkgs = import nixpkgs {overlays = [rust-overlay.overlays.default];};
lib = pkgs.lib; lib = pkgs.lib;
in in (import ./default.nix {inherit pkgs lib naersk;});
(import ./default.nix { inherit pkgs lib naersk; });
} }

View File

@ -10,10 +10,8 @@ let
all = users // systems; all = users // systems;
# stands for calculus # stands for calculus
c_ = builtins; c_ = builtins;
in in {
{ "system/secrets/s3fs.age".publicKeys = c_.attrValues all;
"system/secrets/s3fs.age".publicKeys = c_.attrValues (all); "system/secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues all;
"system/secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues (all); "system/secrets/_nhitrl.age".publicKeys = c_.attrValues all;
"system/secrets/_nhitrl.age".publicKeys = c_.attrValues (all);
} }

View File

@ -1,18 +1,29 @@
{ lib, pkgs, config, modulesPath, specialArgs, ... }: {
let lib,
pkgs,
config,
modulesPath,
specialArgs,
...
}: let
hostname = specialArgs.hostname; hostname = specialArgs.hostname;
enableSSH = specialArgs.enableSSH or true; enableSSH = specialArgs.enableSSH or true;
_networking = lib.recursiveUpdate { hostName = hostname; } (specialArgs._networking or { }); _networking = lib.recursiveUpdate {hostName = hostname;} (specialArgs._networking or {});
_boot = specialArgs._boot or { }; _boot = specialArgs._boot or {};
_services = specialArgs._services or { }; _services = specialArgs._services or {};
includeHardware = specialArgs.includeHardware or true; includeHardware = specialArgs.includeHardware or true;
proj_root = builtins.toString ./../..; proj_root = builtins.toString ./../..;
in in
with lib; with lib; {
{ imports =
imports = (if includeHardware then [ (
if includeHardware
then [
"${proj_root}/hosts/${hostname}/hardware-configuration.nix" "${proj_root}/hosts/${hostname}/hardware-configuration.nix"
] else [ ]) ++ [ ]
else []
)
++ [
"${modulesPath}/profiles/minimal.nix" "${modulesPath}/profiles/minimal.nix"
"${proj_root}/modules/tailscale.sys.nix" "${proj_root}/modules/tailscale.sys.nix"
"${proj_root}/modules/mosh.sys.nix" "${proj_root}/modules/mosh.sys.nix"
@ -31,7 +42,7 @@ with lib;
isNormalUser = true; isNormalUser = true;
home = "/home/hungtr"; home = "/home/hungtr";
description = "pegasust/hungtr"; description = "pegasust/hungtr";
extraGroups = [ "wheel" "networkmanager" "audio" ]; extraGroups = ["wheel" "networkmanager" "audio"];
}; };
users.users.root = { users.users.root = {
# openssh runs in root, no? This is because port < 1024 requires root. # openssh runs in root, no? This is because port < 1024 requires root.
@ -57,5 +68,4 @@ with lib;
pkgs.mtr # network diag pkgs.mtr # network diag
pkgs.sysstat # sys diag pkgs.sysstat # sys diag
]; ];
} }

View File

@ -7,8 +7,12 @@
}; };
}; };
outputs = { self, nixpkgs, agenix, ... }: outputs = {
let self,
nixpkgs,
agenix,
...
}: let
lib = nixpkgs.lib; lib = nixpkgs.lib;
proj_root = ./../..; proj_root = ./../..;
# TODO: Change respectively to the system or make a nix shell to alias `nix run github:ryantm/agenix -- ` # TODO: Change respectively to the system or make a nix shell to alias `nix run github:ryantm/agenix -- `
@ -27,15 +31,16 @@
age.secrets._nhitrl_cred = { age.secrets._nhitrl_cred = {
file = ../../secrets/_nhitrl.age; file = ../../secrets/_nhitrl.age;
}; };
environment.systemPackages = [ agenix.defaultPackage.x86_64-linux ]; environment.systemPackages = [agenix.defaultPackage.x86_64-linux];
} }
]; ];
in in {
{
# Windows with NixOS WSL # Windows with NixOS WSL
nixosConfigurations.Felia = nixpkgs.lib.nixosSystem { nixosConfigurations.Felia = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./wsl-configuration.nix ./wsl-configuration.nix
{ {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -52,7 +57,9 @@
}; };
nixosConfigurations.lizzi = nixpkgs.lib.nixosSystem { nixosConfigurations.lizzi = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
{ {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -62,13 +69,15 @@
specialArgs = { specialArgs = {
hostname = "lizzi"; hostname = "lizzi";
_networking = { _networking = {
interfaces.eth1.ipv4.addresses = [{ interfaces.eth1.ipv4.addresses = [
{
address = "71.0.0.1"; address = "71.0.0.1";
prefixLength = 24; prefixLength = 24;
}]; }
];
firewall = { firewall = {
enable = true; enable = true;
allowedTCPPorts = [ 80 443 22 ]; allowedTCPPorts = [80 443 22];
}; };
useDHCP = false; useDHCP = false;
# required so that we get IP address from linode # required so that we get IP address from linode
@ -112,7 +121,9 @@
# Generic machine # Generic machine
nixosConfigurations.pixi = nixpkgs.lib.nixosSystem { nixosConfigurations.pixi = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
{ {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -127,7 +138,7 @@
# }]; # }];
firewall = { firewall = {
enable = false; enable = false;
allowedTCPPorts = [ 80 443 22 ]; allowedTCPPorts = [80 443 22];
}; };
useDHCP = false; useDHCP = false;
# interfaces.eth0.useDHCP = true; # interfaces.eth0.useDHCP = true;
@ -168,7 +179,9 @@
}; };
nixosConfigurations.nyx = nixpkgs.lib.nixosSystem { nixosConfigurations.nyx = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
{ {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -178,10 +191,12 @@
hostname = "nyx"; hostname = "nyx";
_networking = { _networking = {
enableIPv6 = false; enableIPv6 = false;
interfaces.eth1.ipv4.addresses = [{ interfaces.eth1.ipv4.addresses = [
{
address = "71.0.0.2"; address = "71.0.0.2";
prefixLength = 24; prefixLength = 24;
}]; }
];
firewall.enable = true; firewall.enable = true;
useDHCP = false; useDHCP = false;
interfaces.eth0.useDHCP = true; interfaces.eth0.useDHCP = true;
@ -196,7 +211,9 @@
}; };
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem { nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
{ {
system.stateVersion = "22.05"; system.stateVersion = "22.05";
@ -208,7 +225,9 @@
}; };
nixosConfigurations.htran-dev = nixpkgs.lib.nixosSystem { nixosConfigurations.htran-dev = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
{ {
system.stateVersion = "22.11"; system.stateVersion = "22.11";
@ -218,7 +237,10 @@
# interface = "ens32"; # interface = "ens32";
}; };
networking.interfaces.ens32.ipv4.addresses = [ networking.interfaces.ens32.ipv4.addresses = [
{ address = "10.100.200.230"; prefixLength = 24; } {
address = "10.100.200.230";
prefixLength = 24;
}
]; ];
} }
]; ];
@ -240,7 +262,9 @@
nixosConfigurations.bao = nixpkgs.lib.nixosSystem { nixosConfigurations.bao = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
specialArgs.hostname = "bao"; specialArgs.hostname = "bao";
modules = base_modules ++ [ modules =
base_modules
++ [
./configuration.nix ./configuration.nix
./../../modules/storage.perso.sys.nix ./../../modules/storage.perso.sys.nix
./../../modules/kde.sys.nix ./../../modules/kde.sys.nix
@ -248,8 +272,12 @@
./../../modules/pulseaudio.sys.nix ./../../modules/pulseaudio.sys.nix
./../../modules/opengl.sys.nix ./../../modules/opengl.sys.nix
./../../modules/nvgpu.sys.nix ./../../modules/nvgpu.sys.nix
({ config, pkgs, lib, ... }: ({
{ config,
pkgs,
lib,
...
}: {
mod.tailscale.enable = true; mod.tailscale.enable = true;
# Use UEFI # Use UEFI
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
@ -275,7 +303,7 @@
# Just an initial user to get this started lol # Just an initial user to get this started lol
users.users.user = { users.users.user = {
initialPassword = "pw123"; initialPassword = "pw123";
extraGroups = [ "wheel" "networkmanager" "audio" ]; extraGroups = ["wheel" "networkmanager" "audio"];
isNormalUser = true; isNormalUser = true;
}; };

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,17 +23,15 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -10,4 +10,5 @@
) )
{ {
src = ./.; src = ./.;
}).defaultNix })
.defaultNix

View File

@ -11,9 +11,13 @@
}; };
}; };
outputs = { self, nixpkgs, flake-utils, ... }: outputs = {
self,
nixpkgs,
flake-utils,
...
}:
{ {
nixosModules.wsl = { nixosModules.wsl = {
imports = [ imports = [
./modules/build-tarball.nix ./modules/build-tarball.nix
@ -31,25 +35,24 @@
./configuration.nix ./configuration.nix
]; ];
}; };
}
} // // flake-utils.lib.eachSystem
flake-utils.lib.eachSystem (with flake-utils.lib.system; ["x86_64-linux" "aarch64-linux"])
(with flake-utils.lib.system; [ "x86_64-linux" "aarch64-linux" ]) (
(system: system: let
let pkgs = import nixpkgs {inherit system;};
pkgs = import nixpkgs { inherit system; }; in {
in checks.check-format =
pkgs.runCommand "check-format"
{ {
checks.check-format = pkgs.runCommand "check-format" buildInputs = with pkgs; [nixpkgs-fmt];
{
buildInputs = with pkgs; [ nixpkgs-fmt ];
} '' } ''
nixpkgs-fmt --check ${./.} nixpkgs-fmt --check ${./.}
mkdir $out # success mkdir $out # success
''; '';
devShell = pkgs.mkShell { devShell = pkgs.mkShell {
nativeBuildInputs = with pkgs; [ nixpkgs-fmt ]; nativeBuildInputs = with pkgs; [nixpkgs-fmt];
}; };
} }
); );

View File

@ -1,12 +1,22 @@
{ config, pkgs, lib, ... }: {
with builtins; with lib; config,
let pkgs,
pkgs2storeContents = l: map (x: { object = x; symlink = "none"; }) l; lib,
...
}:
with builtins; with lib; let
pkgs2storeContents = l:
map (x: {
object = x;
symlink = "none";
})
l;
nixpkgs = lib.cleanSource pkgs.path; nixpkgs = lib.cleanSource pkgs.path;
channelSources = pkgs.runCommand "nixos-${config.system.nixos.version}" channelSources =
{ preferLocalBuild = true; } pkgs.runCommand "nixos-${config.system.nixos.version}"
{preferLocalBuild = true;}
'' ''
mkdir -p $out mkdir -p $out
cp -prd ${nixpkgs.outPath} $out/nixos cp -prd ${nixpkgs.outPath} $out/nixos
@ -58,10 +68,7 @@ let
sed -i 's|import \./default\.nix|import \./nixos-wsl|' ./etc/nixos/configuration.nix sed -i 's|import \./default\.nix|import \./nixos-wsl|' ./etc/nixos/configuration.nix
''} ''}
''; '';
in {
in
{
options.wsl.tarball = { options.wsl.tarball = {
includeConfig = mkOption { includeConfig = mkOption {
type = types.bool; type = types.bool;
@ -70,13 +77,12 @@ in
}; };
}; };
config = mkIf config.wsl.enable { config = mkIf config.wsl.enable {
# These options make no sense without the wsl-distro module anyway # These options make no sense without the wsl-distro module anyway
system.build.tarball = pkgs.callPackage "${nixpkgs}/nixos/lib/make-system-tarball.nix" { system.build.tarball = pkgs.callPackage "${nixpkgs}/nixos/lib/make-system-tarball.nix" {
# No contents, structure will be added by prepare script # No contents, structure will be added by prepare script
contents = [ ]; contents = [];
fileName = "nixos-wsl-${pkgs.hostPlatform.system}"; fileName = "nixos-wsl-${pkgs.hostPlatform.system}";
@ -92,6 +98,5 @@ in
compressCommand = "gzip"; compressCommand = "gzip";
compressionExtension = ".gz"; compressionExtension = ".gz";
}; };
}; };
} }

View File

@ -1,20 +1,23 @@
{ config, lib, pkgs, ... }: {
with builtins; with lib; { config,
lib,
pkgs,
...
}:
with builtins;
with lib; {
imports = [ imports = [
(mkRenamedOptionModule [ "wsl" "docker" ] [ "wsl" "docker-desktop" ]) (mkRenamedOptionModule ["wsl" "docker"] ["wsl" "docker-desktop"])
]; ];
options.wsl.docker-desktop = with types; { options.wsl.docker-desktop = with types; {
enable = mkEnableOption "Docker Desktop integration"; enable = mkEnableOption "Docker Desktop integration";
}; };
config = config = let
let
cfg = config.wsl.docker-desktop; cfg = config.wsl.docker-desktop;
in in
mkIf (config.wsl.enable && cfg.enable) { mkIf (config.wsl.enable && cfg.enable) {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
docker docker
docker-compose docker-compose
@ -25,7 +28,7 @@ with builtins; with lib; {
script = '' script = ''
${config.wsl.automountPath}/wsl/docker-desktop/docker-desktop-user-distro proxy --docker-desktop-root ${config.wsl.automountPath}/wsl/docker-desktop ${config.wsl.automountPath}/wsl/docker-desktop/docker-desktop-user-distro proxy --docker-desktop-root ${config.wsl.automountPath}/wsl/docker-desktop
''; '';
wantedBy = [ "multi-user.target" ]; wantedBy = ["multi-user.target"];
serviceConfig = { serviceConfig = {
Restart = "on-failure"; Restart = "on-failure";
RestartSec = "30s"; RestartSec = "30s";
@ -35,7 +38,5 @@ with builtins; with lib; {
users.groups.docker.members = [ users.groups.docker.members = [
config.wsl.defaultUser config.wsl.defaultUser
]; ];
}; };
} }

View File

@ -1,6 +1,11 @@
{ config, lib, pkgs, ... }: {
with builtins; with lib; { config,
lib,
pkgs,
...
}:
with builtins;
with lib; {
options.wsl.docker-native = with types; { options.wsl.docker-native = with types; {
enable = mkEnableOption "Native Docker integration in NixOS."; enable = mkEnableOption "Native Docker integration in NixOS.";
@ -15,14 +20,13 @@ with builtins; with lib; {
}; };
}; };
config = config = let
let
cfg = config.wsl.docker-native; cfg = config.wsl.docker-native;
in in
mkIf (config.wsl.enable && cfg.enable) { mkIf (config.wsl.enable && cfg.enable) {
nixpkgs.overlays = [ nixpkgs.overlays = [
(self: super: { (self: super: {
docker = super.docker.override { iptables = pkgs.iptables-legacy; }; docker = super.docker.override {iptables = pkgs.iptables-legacy;};
}) })
]; ];

View File

@ -1,11 +1,19 @@
{ config, lib, pkgs, ... }: {
with builtins; with lib; { config,
lib,
pkgs,
...
}:
with builtins;
with lib; {
config = mkIf config.wsl.enable ( config = mkIf config.wsl.enable (
let let
mkTarball = pkgs.callPackage "${lib.cleanSource pkgs.path}/nixos/lib/make-system-tarball.nix"; mkTarball = pkgs.callPackage "${lib.cleanSource pkgs.path}/nixos/lib/make-system-tarball.nix";
pkgs2storeContents = map (x: { object = x; symlink = "none"; }); pkgs2storeContents = map (x: {
object = x;
symlink = "none";
});
rootfs = let tarball = config.system.build.tarball; in "${tarball}/tarball/${tarball.fileName}.tar${tarball.extension}"; rootfs = let tarball = config.system.build.tarball; in "${tarball}/tarball/${tarball.fileName}.tar${tarball.extension}";
@ -39,25 +47,39 @@ with builtins; with lib; {
passwd = pkgs.writeText "passwd" '' passwd = pkgs.writeText "passwd" ''
root:x:0:0:System administrator:/root:${installer} root:x:0:0:System administrator:/root:${installer}
''; '';
in in {
{
system.build.installer = mkTarball { system.build.installer = mkTarball {
fileName = "nixos-wsl-installer"; fileName = "nixos-wsl-installer";
compressCommand = "gzip"; compressCommand = "gzip";
compressionExtension = ".gz"; compressionExtension = ".gz";
extraArgs = "--hard-dereference"; extraArgs = "--hard-dereference";
storeContents = with pkgs; pkgs2storeContents [ storeContents = with pkgs;
pkgs2storeContents [
installer installer
]; ];
contents = [ contents = [
{ source = config.environment.etc."wsl.conf".source; target = "/etc/wsl.conf"; } {
{ source = config.environment.etc."fstab".source; target = "/etc/fstab"; } source = config.environment.etc."wsl.conf".source;
{ source = passwd; target = "/etc/passwd"; } target = "/etc/wsl.conf";
{ source = "${pkgs.busybox}/bin/busybox"; target = "/bin/sh"; } }
{ source = "${pkgs.busybox}/bin/busybox"; target = "/bin/mount"; } {
source = config.environment.etc."fstab".source;
target = "/etc/fstab";
}
{
source = passwd;
target = "/etc/passwd";
}
{
source = "${pkgs.busybox}/bin/busybox";
target = "/bin/sh";
}
{
source = "${pkgs.busybox}/bin/busybox";
target = "/bin/mount";
}
]; ];
extraCommands = pkgs.writeShellScript "prepare" '' extraCommands = pkgs.writeShellScript "prepare" ''
@ -66,8 +88,6 @@ with builtins; with lib; {
ln -s /init bin/wslpath ln -s /init bin/wslpath
''; '';
}; };
} }
); );
} }

View File

@ -1,9 +1,12 @@
{ lib, pkgs, config, ... }:
with builtins; with lib;
{ {
lib,
pkgs,
config,
...
}:
with builtins; with lib; {
imports = [ imports = [
(mkRenamedOptionModule [ "wsl" "compatibility" "interopPreserveArgvZero" ] [ "wsl" "interop" "preserveArgvZero" ]) (mkRenamedOptionModule ["wsl" "compatibility" "interopPreserveArgvZero"] ["wsl" "interop" "preserveArgvZero"])
]; ];
options.wsl.interop = with types; { options.wsl.interop = with types; {
@ -32,15 +35,12 @@ with builtins; with lib;
}; };
}; };
config = config = let
let
cfg = config.wsl.interop; cfg = config.wsl.interop;
in in
mkIf config.wsl.enable { mkIf config.wsl.enable {
boot.binfmt.registrations = mkIf cfg.register { boot.binfmt.registrations = mkIf cfg.register {
WSLInterop = WSLInterop = let
let
compat = cfg.preserveArgvZero; compat = cfg.preserveArgvZero;
# WSL Preview 0.58 and up registers the /init binfmt interp for Windows executable # WSL Preview 0.58 and up registers the /init binfmt interp for Windows executable
@ -61,12 +61,17 @@ with builtins; with lib;
''; '';
# use the autodetect hack if unset, otherwise call /init directly # use the autodetect hack if unset, otherwise call /init directly
interpreter = if compat == null then compatWrapper else "/init"; interpreter =
if compat == null
then compatWrapper
else "/init";
# enable for the wrapper and autodetect hack # enable for the wrapper and autodetect hack
preserveArgvZero = if compat == false then false else true; preserveArgvZero =
in if compat == false
{ then false
else true;
in {
magicOrExtension = "MZ"; magicOrExtension = "MZ";
fixBinary = true; fixBinary = true;
wrapInterpreterInShell = false; wrapInterpreterInShell = false;
@ -77,12 +82,9 @@ with builtins; with lib;
# Include Windows %PATH% in Linux $PATH. # Include Windows %PATH% in Linux $PATH.
environment.extraInit = mkIf cfg.includePath ''PATH="$PATH:$WSLPATH"''; environment.extraInit = mkIf cfg.includePath ''PATH="$PATH:$WSLPATH"'';
warnings = warnings = let
let
registrations = config.boot.binfmt.registrations; registrations = config.boot.binfmt.registrations;
in in
optional (!(registrations ? WSLInterop) && (length (attrNames config.boot.binfmt.registrations)) != 0) "Having any binfmt registrations without re-registering WSLInterop (wsl.interop.register) will break running .exe files from WSL2"; optional (!(registrations ? WSLInterop) && (length (attrNames config.boot.binfmt.registrations)) != 0) "Having any binfmt registrations without re-registering WSLInterop (wsl.interop.register) will break running .exe files from WSL2";
}; };
} }

View File

@ -1,12 +1,13 @@
{ lib, pkgs, config, ... }:
with builtins; with lib;
{ {
options.wsl = with types; lib,
let pkgs,
coercedToStr = coercedTo (oneOf [ bool path int ]) (toString) str; config,
in ...
{ }:
with builtins; with lib; {
options.wsl = with types; let
coercedToStr = coercedTo (oneOf [bool path int]) toString str;
in {
enable = mkEnableOption "support for running NixOS as a WSL distribution"; enable = mkEnableOption "support for running NixOS as a WSL distribution";
automountPath = mkOption { automountPath = mkOption {
type = str; type = str;
@ -25,18 +26,20 @@ with builtins; with lib;
}; };
startMenuLaunchers = mkEnableOption "shortcuts for GUI applications in the windows start menu"; startMenuLaunchers = mkEnableOption "shortcuts for GUI applications in the windows start menu";
wslConf = mkOption { wslConf = mkOption {
type = attrsOf (attrsOf (oneOf [ string int bool ])); type = attrsOf (attrsOf (oneOf [string int bool]));
description = "Entries that are added to /etc/wsl.conf"; description = "Entries that are added to /etc/wsl.conf";
}; };
}; };
config = config = let
let
cfg = config.wsl; cfg = config.wsl;
syschdemd = import ../syschdemd.nix { inherit lib pkgs config; inherit (cfg) automountPath defaultUser; defaultUserHome = config.users.users.${cfg.defaultUser}.home; }; syschdemd = import ../syschdemd.nix {
inherit lib pkgs config;
inherit (cfg) automountPath defaultUser;
defaultUserHome = config.users.users.${cfg.defaultUser}.home;
};
in in
mkIf cfg.enable { mkIf cfg.enable {
wsl.wslConf = { wsl.wslConf = {
automount = { automount = {
enabled = true; enabled = true;
@ -57,9 +60,8 @@ with builtins; with lib;
hardware.opengl.enable = true; # Enable GPU acceleration hardware.opengl.enable = true; # Enable GPU acceleration
environment = { environment = {
etc = { etc = {
"wsl.conf".text = generators.toINI { } cfg.wslConf; "wsl.conf".text = generators.toINI {} cfg.wslConf;
# DNS settings are managed by WSL # DNS settings are managed by WSL
hosts.enable = !config.wsl.wslConf.network.generateHosts; hosts.enable = !config.wsl.wslConf.network.generateHosts;
@ -67,7 +69,7 @@ with builtins; with lib;
}; };
systemPackages = [ systemPackages = [
(pkgs.runCommand "wslpath" { } '' (pkgs.runCommand "wslpath" {} ''
mkdir -p $out/bin mkdir -p $out/bin
ln -s /init $out/bin/wslpath ln -s /init $out/bin/wslpath
'') '')
@ -79,13 +81,13 @@ with builtins; with lib;
users.users.${cfg.defaultUser} = { users.users.${cfg.defaultUser} = {
isNormalUser = true; isNormalUser = true;
uid = 1000; uid = 1000;
extraGroups = [ "wheel" ]; # Allow the default user to use sudo extraGroups = ["wheel"]; # Allow the default user to use sudo
}; };
users.users.root = { users.users.root = {
shell = "${syschdemd}/bin/syschdemd"; shell = "${syschdemd}/bin/syschdemd";
# Otherwise WSL fails to login as root with "initgroups failed 5" # Otherwise WSL fails to login as root with "initgroups failed 5"
extraGroups = [ "root" ]; extraGroups = ["root"];
}; };
security.sudo = { security.sudo = {
@ -97,7 +99,7 @@ with builtins; with lib;
system.activationScripts = { system.activationScripts = {
copy-launchers = mkIf cfg.startMenuLaunchers ( copy-launchers = mkIf cfg.startMenuLaunchers (
stringAfter [ ] '' stringAfter [] ''
for x in applications icons; do for x in applications icons; do
echo "Copying /usr/share/$x" echo "Copying /usr/share/$x"
mkdir -p /usr/share/$x mkdir -p /usr/share/$x
@ -105,7 +107,7 @@ with builtins; with lib;
done done
'' ''
); );
populateBin = stringAfter [ ] '' populateBin = stringAfter [] ''
echo "setting up /bin..." echo "setting up /bin..."
ln -sf /init /bin/wslpath ln -sf /init /bin/wslpath
ln -sf ${pkgs.bashInteractive}/bin/bash /bin/sh ln -sf ${pkgs.bashInteractive}/bin/bash /bin/sh
@ -134,6 +136,6 @@ with builtins; with lib;
enableEmergencyMode = false; enableEmergencyMode = false;
}; };
warnings = (optional (config.systemd.services.systemd-resolved.enable && config.wsl.wslConf.network.generateResolvConf) "systemd-resolved is enabled, but resolv.conf is managed by WSL"); warnings = optional (config.systemd.services.systemd-resolved.enable && config.wsl.wslConf.network.generateResolvConf) "systemd-resolved is enabled, but resolv.conf is managed by WSL";
}; };
} }

View File

@ -1,19 +1,19 @@
{ lib {
, pkgs lib,
, config pkgs,
, automountPath config,
, defaultUser automountPath,
, defaultUserHome ? "/home/${defaultUser}" defaultUser,
, ... defaultUserHome ? "/home/${defaultUser}",
...
}: }:
pkgs.substituteAll { pkgs.substituteAll {
name = "syschdemd"; name = "syschdemd";
src = ./syschdemd.sh; src = ./syschdemd.sh;
dir = "bin"; dir = "bin";
isExecutable = true; isExecutable = true;
buildInputs = with pkgs; [ daemonize ]; buildInputs = with pkgs; [daemonize];
inherit defaultUser defaultUserHome; inherit defaultUser defaultUserHome;
inherit (pkgs) daemonize; inherit (pkgs) daemonize;

View File

@ -1,15 +1,19 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = [ ]; config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [];
boot.initrd.availableKernelModules = [ ]; boot.initrd.availableKernelModules = [];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
## NOTE: These filesystems are mounted by a wrapper script from nix-wsl ## NOTE: These filesystems are mounted by a wrapper script from nix-wsl
@ -43,25 +47,22 @@
# fsType = "drvfs"; # fsType = "drvfs";
# }; # };
fileSystems."/mnt/c" = fileSystems."/mnt/c" = {
{
device = "C:"; device = "C:";
fsType = "drvfs"; fsType = "drvfs";
}; };
fileSystems."/mnt/d" = fileSystems."/mnt/d" = {
{
device = "D:"; device = "D:";
fsType = "drvfs"; fsType = "drvfs";
}; };
fileSystems."/mnt/f" = fileSystems."/mnt/f" = {
{
device = "F:"; device = "F:";
fsType = "drvfs"; fsType = "drvfs";
}; };
swapDevices = [ ]; swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,19 +1,22 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
]; ];
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod"];
# boot.initrd.kernelModules = [ "amdgpu" ]; # boot.initrd.kernelModules = [ "amdgpu" ];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ "kvm-amd" "coretemp" ]; boot.kernelModules = ["kvm-amd" "coretemp"];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" =
# Might be wise to use /dev/nvme0p1 instead # Might be wise to use /dev/nvme0p1 instead
@ -29,7 +32,7 @@
fsType = "vfat"; fsType = "vfat";
}; };
swapDevices = [ ]; swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,17 +23,15 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,17 +23,15 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,17 +1,20 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -20,8 +23,8 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
fileSystems = { fileSystems = {
"/" = { "/" = {
@ -35,8 +38,7 @@
}; };
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,20 +1,23 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }:
{ {
imports = config,
[ lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "virtio_pci" "virtio_scsi" "ahci" "sd_mod" ]; boot.initrd.availableKernelModules = ["virtio_pci" "virtio_scsi" "ahci" "sd_mod"];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [];
boot.kernelModules = [ ]; boot.kernelModules = [];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [];
boot.kernelParams = [ "console=ttyS0,19200n8" ]; boot.kernelParams = ["console=ttyS0,19200n8"];
boot.loader.grub.extraConfig = '' boot.loader.grub.extraConfig = ''
serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1 serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial; terminal_input serial;
@ -23,14 +26,12 @@
boot.loader.grub.forceInstall = true; boot.loader.grub.forceInstall = true;
boot.loader.grub.device = "nodev"; boot.loader.grub.device = "nodev";
boot.loader.timeout = 10; boot.loader.timeout = 10;
fileSystems."/" = fileSystems."/" = {
{
device = "/dev/sda"; device = "/dev/sda";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = swapDevices = [{device = "/dev/sdb";}];
[{ device = "/dev/sdb"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's

View File

@ -1,10 +1,7 @@
{ lib, ... }: {lib, ...}:
with lib; let
with lib;
let
nixos-wsl = import ./nixos-wsl; nixos-wsl = import ./nixos-wsl;
in in {
{
imports = [ imports = [
./configuration.nix ./configuration.nix
nixos-wsl.nixosModules.wsl nixos-wsl.nixosModules.wsl
@ -21,9 +18,7 @@ in
# Enable integration with Docker Desktop (needs to be installed) # Enable integration with Docker Desktop (needs to be installed)
docker-desktop.enable = true; docker-desktop.enable = true;
}; };
# users.users.<defaultUser>.uid = 1000; # users.users.<defaultUser>.uid = 1000;
# networking.hostName = "nixos"; # networking.hostName = "nixos";
} }

View File

@ -1,6 +1,8 @@
{inputs, cell}: let {
inputs,
cell,
}: let
inherit (inputs) std nixpkgs; inherit (inputs) std nixpkgs;
in { in {
default = std.lib.dev.mkShell { default = std.lib.dev.mkShell {
name = "default"; name = "default";

View File

@ -0,0 +1,6 @@
{
inputs,
cell,
}: let
in {
}

View File

@ -0,0 +1,5 @@
{
inputs,
cell,
}: {
}

View File

@ -102,7 +102,7 @@ in {
}; };
font.size = lib.mkOption { font.size = lib.mkOption {
type = lib.types.nullOr lib.types.number; type = lib.types.nullOr lib.types.number;
default = null; default = 11.0;
description = '' description = ''
The default font size for Alacritty. This is probably measured in px. The default font size for Alacritty. This is probably measured in px.
''; '';
@ -116,7 +116,7 @@ in {
''; '';
example = true; example = true;
}; };
config-file = lib.mkOption { config-path = lib.mkOption {
type = lib.types.path; type = lib.types.path;
description = "Path to alacritty yaml"; description = "Path to alacritty yaml";
default = null; default = null;
@ -126,12 +126,10 @@ in {
config.programs.alacritty = { config.programs.alacritty = {
enable = cfg.enable; enable = cfg.enable;
settings = let ; settings = let ;
actualConfig = if cfg.config-file != null then fromYAML (builtins.readFile cfg.config-file) else {}; actualConfig = if cfg.config-path != null then fromYAML (builtins.readFile cfg.config-path) else {};
in lib.recursiveUpdate actualConfig { in lib.recursiveUpdate actualConfig {
font.normal.family = opt-toNullable(opt-leftmostSome (builtins.map opt-fromNullable [ font.normal.family = lib.mkIf (font.family != null) font.family;
cfg.font.family actualConfig.font.family actualConfig.font.normal.family font.size = lib.mkIf (font.size != null) font.size;
]));
font.size = cfg.font.size or actualConfig.font.size or 7.0;
}; };
}; };
}; };

View File

@ -1,11 +1,18 @@
{inputs, cell, namespace}: { pkgs, config, lib, ... }: {
let inputs,
cell,
namespace,
}: {
pkgs,
config,
lib,
...
}: let
cfg = config."${namespace}".graphics; cfg = config."${namespace}".graphics;
cfgEnable = cfg.enable or (cfg.useNixGL.defaultPackage != null); cfgEnable = cfg.enable or (cfg.useNixGL.defaultPackage != null);
types = lib.types; types = lib.types;
in in {
{ imports = [./shells.nix];
imports = [ ./shells.nix ];
options."${namespace}".nixgl = { options."${namespace}".nixgl = {
enable = lib.mkEnableOption "nixgl"; enable = lib.mkEnableOption "nixgl";
useNixGL = { useNixGL = {
@ -17,7 +24,7 @@ in
]; ];
}; };
defaultPackage = lib.mkOption { defaultPackage = lib.mkOption {
type = types.nullOr (types.enum [ "nixGLIntel" "nixGLNvidia" "nixGLNvidiaBumblebee" ]); type = types.nullOr (types.enum ["nixGLIntel" "nixGLNvidia" "nixGLNvidiaBumblebee"]);
description = "Which nixGL package to be aliased as `nixGL` on the shell"; description = "Which nixGL package to be aliased as `nixGL` on the shell";
default = null; default = null;
example = "nixGLIntel"; example = "nixGLIntel";
@ -35,6 +42,6 @@ in
nixGL = cfg.useNixGL.defaultPackage; nixGL = cfg.useNixGL.defaultPackage;
}; };
}; };
home.packages = [ cfg.useNixGL.package ]; home.packages = [cfg.useNixGL.package];
}; };
} }

View File

@ -1,15 +1,27 @@
_imports@{inputs, cell}: let # This creates a layer that is specific to some profiles, but may require
# some variants in environment like username/email, work-oriented or personal
# and many more
_imports @ {
inputs,
cell,
}: let
# TODO: I don't think abstracting namespace away is a good idea in this case
namespace = "repo"; namespace = "repo";
imports = _imports // {inherit namespace;}; imports = _imports // {inherit namespace;};
in { in {
neovim = import ./neovim.nix imports; neovim = import ./neovim.nix imports;
nerd_font_module = {config, pkgs, ...}: { nerd_font_module = {
config,
pkgs,
...
}: {
imports = [ imports = [
import inputs.cells."${namespace}" import
inputs.cells."${namespace}"
]; ];
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
home.packages = [ home.packages = [
(pkgs.nerdfonts.override { fonts = [ "Hack" ]; }) (pkgs.nerdfonts.override {fonts = ["Hack"];})
]; ];
"${namespace}".alacritty.font.family = "Hack Nerd Font Mono"; "${namespace}".alacritty.font.family = "Hack Nerd Font Mono";
}; };
@ -32,7 +44,13 @@ in {
}; };
}; };
ssh = {config, lib, ...}: let cfg = config."${namespace}".ssh; in { ssh = {
config,
lib,
...
}: let
cfg = config."${namespace}".ssh;
in {
options."${namespace}".ssh.enable = lib.mkOption { options."${namespace}".ssh.enable = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
default = true; default = true;
@ -48,13 +66,79 @@ in {
}; };
}; };
alacritty = {config, lib,...}: let cfg = config."${namespace}".alacritty; in { alacritty = {
config,
lib,
...
}: let
cfg = config."${namespace}".alacritty;
in {
imports = [ imports = [
import "${inputs.cells.repo.home-modules.alacritty}" import
"${inputs.cells.repo.home-modules.alacritty}"
]; ];
configs."${namespace}".alacritty = { configs."${namespace}".alacritty = {
enable = true; enable = true;
config-file = "${inputs.self}//native-configs/alacritty/alacritty.yml"; config-path = "${inputs.self}//native-configs/alacritty/alacritty.yml";
font.size = 11.0;
font.family = "Hack Nerd Font Mono";
};
};
shells = import ./shells.nix imports;
git = {
config,
pkgs,
lib,
...
}: let
baseAliases = {
a = "add";
c = "commit";
ca = "commit --amend";
cm = "commit -m";
lol = "log --graph --decorate --pretty=oneline --abbrev-commit";
lola = "log --graph --decorate --pretty=oneline --abbrev-commit --all";
sts = "status";
co = "checkout";
b = "branch";
};
in {
options."${namespace}".git = {
aliases = lib.mkOption {
type = lib.types.attrs;
default = {};
example = baseAliases;
description = ''
Additional git aliases. This config is merged on top of base aliases.
'';
};
name = lib.mkOption {
type = lib.types.str;
default = "Pegasust";
description = "Git username that appears on commits";
example = "Pegasust";
};
email = lib.mkOption {
type = lib.types.str;
default = "pegasucksgg@gmail.com";
example = "peagsucksgg@gmail.com";
description = "Git email that appears on commits";
};
ignores = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
".vscode" # vscode settings
".direnv" # .envrc cached outputs
".DS_Store" # MacOS users, amrite
];
description = ''
.gitignore patterns that are applied in every repository.
This is useful for IDE-specific or environment-specific settings.
'';
example = [".direnv" "node_modules"];
};
}; };
}; };
} }

View File

@ -2,22 +2,32 @@
# #
# One thing to consider, though, /nix/store of `nix-shell` or `nix-develop` # One thing to consider, though, /nix/store of `nix-shell` or `nix-develop`
# might be different from `home-manager`'s (~/.nix_profile/bin/jq) # might be different from `home-manager`'s (~/.nix_profile/bin/jq)
{inputs, cell, namespace}: { pkgs, lib, config, ... }: {
let inputs,
cell,
namespace,
}: {
pkgs,
lib,
config,
...
}: let
# NOTE: Add packages to nvim_pkgs instead, so that it's available at userspace # NOTE: Add packages to nvim_pkgs instead, so that it's available at userspace
# and is added to the path after wrapping. # and is added to the path after wrapping.
# check: nix repl `homeConfigurations.hungtr.config.programs.neovim.finalPackage.buildCommand` # check: nix repl `homeConfigurations.hungtr.config.programs.neovim.finalPackage.buildCommand`
# see: :/--suffix.*PATH # see: :/--suffix.*PATH
# there should be mentions of additional packages # there should be mentions of additional packages
my_neovim = pkgs.neovim-unwrapped; my_neovim = pkgs.neovim-unwrapped;
rust_pkgs = (pkgs.rust-bin.selectLatestNightlyWith rust_pkgs =
pkgs.rust-bin.selectLatestNightlyWith
( (
toolchain: toolchain:
toolchain.default.override { toolchain.default.override {
extensions = [ "rust-src" "rust-analyzer" "rust-docs" "rustfmt" "clippy" "miri" ]; extensions = ["rust-src" "rust-analyzer" "rust-docs" "rustfmt" "clippy" "miri"];
} }
)); );
nvim_pkgs = [ nvim_pkgs =
[
# pkgs.gccStdenv # pkgs.gccStdenv
pkgs.tree-sitter pkgs.tree-sitter
pkgs.fzf # file name fuzzy search pkgs.fzf # file name fuzzy search
@ -48,16 +58,16 @@ let
# pkgs.rust-analyzer # pkgs.rust-analyzer
# rust_pkgs # rust_pkgs
# pkgs.evcxr # Rust REPL for Conjure! # pkgs.evcxr # Rust REPL for Conjure!
] ++ lib.optionals (pkgs.stdenv.isDarwin) ( ]
++ lib.optionals (pkgs.stdenv.isDarwin) (
let let
inherit (pkgs.darwin.apple_sdk.frameworks) System CoreFoundation; in inherit (pkgs.darwin.apple_sdk.frameworks) System CoreFoundation;
[ in [
System System
CoreFoundation CoreFoundation
] ]
); );
in in {
{
options.base.neovim = { options.base.neovim = {
enable = lib.mkOption { enable = lib.mkOption {
default = true; default = true;
@ -77,30 +87,25 @@ in
withNodeJs = true; withNodeJs = true;
# NOTE: this adds path to the wrapped version of neovim # NOTE: this adds path to the wrapped version of neovim
extraPackages = nvim_pkgs; extraPackages = nvim_pkgs;
extraLuaConfig = (builtins.readFile "${inputs.self}/native_configs/neovim/init.lua"); extraLuaConfig = builtins.readFile "${inputs.self}/native_configs/neovim/init.lua";
plugins = (let inherit (pkgs.vimPlugins) plugins = let
inherit
(pkgs.vimPlugins)
plenary-nvim plenary-nvim
nvim-treesitter nvim-treesitter
nvim-treesitter-textobjects nvim-treesitter-textobjects
nvim-treesitter-context nvim-treesitter-context
telescope-fzf-native-nvim telescope-fzf-native-nvim
telescope-file-browser-nvim telescope-file-browser-nvim
telescope-nvim telescope-nvim
nvim-lspconfig nvim-lspconfig
gruvbox-community gruvbox-community
neodev-nvim neodev-nvim
cmp-nvim-lsp cmp-nvim-lsp
cmp-path cmp-path
cmp-buffer cmp-buffer
cmp-cmdline cmp-cmdline
nvim-cmp nvim-cmp
lspkind-nvim lspkind-nvim
nvim-autopairs nvim-autopairs
nvim-ts-autotag nvim-ts-autotag
@ -110,7 +115,6 @@ in
luasnip luasnip
fidget-nvim fidget-nvim
rust-tools-nvim rust-tools-nvim
cmp_luasnip cmp_luasnip
gitsigns-nvim gitsigns-nvim
indent-blankline-nvim indent-blankline-nvim
@ -129,8 +133,8 @@ in
vim-dispatch-neovim vim-dispatch-neovim
vim-fugitive vim-fugitive
vim-jack-in vim-jack-in
;
; in [ in [
plenary-nvim plenary-nvim
nvim-treesitter.withAllGrammars nvim-treesitter.withAllGrammars
nvim-treesitter-textobjects nvim-treesitter-textobjects
@ -174,7 +178,7 @@ in
vim-dispatch-neovim vim-dispatch-neovim
vim-fugitive vim-fugitive
vim-jack-in vim-jack-in
]); ];
}; };
# home.packages = nvim_pkgs; # home.packages = nvim_pkgs;
}; };

View File

@ -1,11 +1,15 @@
{inputs, cell, namespace}: { config
, lib
, pkgs
, ...
}:
let cfg = config."${namespace}".shells;
in
{ {
inputs,
cell,
namespace,
}: {
config,
lib,
pkgs,
...
}: let
cfg = config."${namespace}".shells;
in {
options."${namespace}".shells = { options."${namespace}".shells = {
enable = lib.mkOption { enable = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
@ -26,7 +30,7 @@ in
shellAliases = lib.mkOption { shellAliases = lib.mkOption {
type = lib.types.attrs; type = lib.types.attrs;
description = "Shell command aliases"; description = "Shell command aliases";
default = { }; default = {};
example = { example = {
nixGL = "nixGLIntel"; nixGL = "nixGLIntel";
}; };
@ -47,9 +51,8 @@ in
}; };
programs.tmux = { programs.tmux = {
enable = true; enable = true;
# extraConfigBeforePlugin = builtins.readFile "${proj_root.config.path}/tmux/tmux.conf"; plugins = let inherit (pkgs.tmuxPlugins) cpu net-speed; in [cpu net-speed];
plugins = let inherit (pkgs.tmuxPlugins) cpu net-speed; in [ cpu net-speed ]; extraConfig = builtins.readFile "${innputs.self}/native_configs/tmux/tmux.conf";
extraConfig = (builtins.readFile "${proj_root.config.path}/tmux/tmux.conf");
}; };
xdg.configFile."tmux/tmux.conf".text = lib.mkOrder 600 '' xdg.configFile."tmux/tmux.conf".text = lib.mkOrder 600 ''
set -g status-right '#{cpu_bg_color} CPU: #{cpu_icon} #{cpu_percentage} | %a %h-%d %H:%M ' set -g status-right '#{cpu_bg_color} CPU: #{cpu_icon} #{cpu_percentage} | %a %h-%d %H:%M '
@ -64,14 +67,15 @@ in
enable = true; enable = true;
enableZshIntegration = true; enableZshIntegration = true;
settings = let settings = let
native = builtins.fromTOML (builtins.readFile "${proj_root.config.path}/starship/starship.toml"); native = builtins.fromTOML (builtins.readFile "${inputs.self}/native_configs/starship/starship.toml");
patch-nix = pkgs.lib.recursiveUpdate native ({ patch-nix = pkgs.lib.recursiveUpdate native {
c.commands = [ c.commands = [
["nix" "run" "nixpkgs#clang" "--" "--version"] ["nix" "run" "nixpkgs#clang" "--" "--version"]
["nix" "run" "nixpkgs#gcc" "--" "--version"] ["nix" "run" "nixpkgs#gcc" "--" "--version"]
]; ];
}); };
in patch-nix; in
patch-nix;
}; };
# Fuzzy finder. `fzf` for TUI, `fzf -f '<fuzzy query>'` for UNIX piping # Fuzzy finder. `fzf` for TUI, `fzf -f '<fuzzy query>'` for UNIX piping
programs.fzf.enable = true; programs.fzf.enable = true;
@ -84,10 +88,12 @@ in
enable = true; enable = true;
enableCompletion = true; enableCompletion = true;
enableAutosuggestions = true; enableAutosuggestions = true;
shellAliases = { shellAliases =
{
nix-rebuild = "sudo nixos-rebuild switch"; nix-rebuild = "sudo nixos-rebuild switch";
hm-switch = "home-manager switch --flake"; hm-switch = "home-manager switch --flake";
} // (cfg.shellAliases or { }); }
// (cfg.shellAliases or {});
history = { history = {
size = 10000; size = 10000;
path = "${config.xdg.dataHome}/zsh/history"; path = "${config.xdg.dataHome}/zsh/history";
@ -112,10 +118,11 @@ in
ZVM_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :) ZVM_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :)
ZVM_ESCAPE_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :) ZVM_ESCAPE_KEYTIMEOUT = 0.004; # 40ms, or subtly around 25 FPS. I'm a gamer :)
}; };
initExtra = (cfg.shellInitExtra or "") + '' initExtra =
(cfg.shellInitExtra or "")
+ ''
source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh source ${pkgs.zsh-vi-mode}/share/zsh-vi-mode/zsh-vi-mode.plugin.zsh
''; '';
}; };
}; };
} }

View File

@ -13,6 +13,7 @@
in { in {
fromYAML = yamlContent: bulitins.fromJSON (builtins.readFile (yamlToJsonDrv inputs.nixpkgs yamlContent "fromYaml.json")); fromYAML = yamlContent: bulitins.fromJSON (builtins.readFile (yamlToJsonDrv inputs.nixpkgs yamlContent "fromYaml.json"));
# NOTE: Deprecate
# ctor # ctor
opt-some = a: [a]; opt-some = a: [a];
opt-none = []; opt-none = [];

View File

@ -1,4 +1,7 @@
{inputs, cell}: { {
inputs,
cell,
}: {
htran = inputs.cells.dotfiles.devshells.default; htran = inputs.cells.dotfiles.devshells.default;
hungtran = inputs.cells.dotfiles.devshells.default; hungtran = inputs.cells.dotfiles.devshells.default;
} }

View File

@ -4,22 +4,26 @@
# calls the flake's 'outputs' function. It then returns an attrset # calls the flake's 'outputs' function. It then returns an attrset
# containing 'defaultNix' (to be used in 'default.nix'), 'shellNix' # containing 'defaultNix' (to be used in 'default.nix'), 'shellNix'
# (to be used in 'shell.nix'). # (to be used in 'shell.nix').
{
{ src, system ? builtins.currentSystem or "unknown-system" }: src,
system ? builtins.currentSystem or "unknown-system",
let }: let
lockFilePath = src + "/flake.lock"; lockFilePath = src + "/flake.lock";
lockFile = builtins.fromJSON (builtins.readFile lockFilePath); lockFile = builtins.fromJSON (builtins.readFile lockFilePath);
fetchTree = fetchTree = info:
info: if info.type == "github"
if info.type == "github" then then {
{ outPath = outPath =
fetchTarball fetchTarball
({ url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}"; } (
// (if info ? narHash then { sha256 = info.narHash; } else {}) {url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";}
// (
if info ? narHash
then {sha256 = info.narHash;}
else {}
)
); );
rev = info.rev; rev = info.rev;
shortRev = builtins.substring 0 7 info.rev; shortRev = builtins.substring 0 7 info.rev;
@ -27,43 +31,77 @@ let
lastModifiedDate = formatSecondsSinceEpoch info.lastModified; lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
narHash = info.narHash; narHash = info.narHash;
} }
else if info.type == "git" then else if info.type == "git"
{ outPath = then
{
outPath =
builtins.fetchGit builtins.fetchGit
({ url = info.url; } (
// (if info ? rev then { inherit (info) rev; } else {}) {url = info.url;}
// (if info ? ref then { inherit (info) ref; } else {}) // (
// (if info ? submodules then { inherit (info) submodules; } else {}) if info ? rev
then {inherit (info) rev;}
else {}
)
// (
if info ? ref
then {inherit (info) ref;}
else {}
)
// (
if info ? submodules
then {inherit (info) submodules;}
else {}
)
); );
lastModified = info.lastModified; lastModified = info.lastModified;
lastModifiedDate = formatSecondsSinceEpoch info.lastModified; lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
narHash = info.narHash; narHash = info.narHash;
} // (if info ? rev then { }
// (
if info ? rev
then {
rev = info.rev; rev = info.rev;
shortRev = builtins.substring 0 7 info.rev; shortRev = builtins.substring 0 7 info.rev;
} else { }
}) else {
else if info.type == "path" then }
{ outPath = builtins.path { )
path = if builtins.substring 0 1 info.path != "/" else if info.type == "path"
then {
outPath = builtins.path {
path =
if builtins.substring 0 1 info.path != "/"
then src + ("/" + info.path) # make this absolute path by prepending ./ then src + ("/" + info.path) # make this absolute path by prepending ./
else info.path; # it's already an absolute path else info.path; # it's already an absolute path
}; };
narHash = info.narHash; narHash = info.narHash;
} }
else if info.type == "tarball" then else if info.type == "tarball"
{ outPath = then {
fetchTarball
({ inherit (info) url; }
// (if info ? narHash then { sha256 = info.narHash; } else {})
);
}
else if info.type == "gitlab" then
{ inherit (info) rev narHash lastModified;
outPath = outPath =
fetchTarball fetchTarball
({ url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; } (
// (if info ? narHash then { sha256 = info.narHash; } else {}) {inherit (info) url;}
// (
if info ? narHash
then {sha256 = info.narHash;}
else {}
)
);
}
else if info.type == "gitlab"
then {
inherit (info) rev narHash lastModified;
outPath =
fetchTarball
(
{url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";}
// (
if info ? narHash
then {sha256 = info.narHash;}
else {}
)
); );
shortRev = builtins.substring 0 7 info.rev; shortRev = builtins.substring 0 7 info.rev;
} }
@ -71,46 +109,53 @@ let
# FIXME: add Mercurial, tarball inputs. # FIXME: add Mercurial, tarball inputs.
throw "flake input has unsupported input type '${info.type}'"; throw "flake input has unsupported input type '${info.type}'";
callFlake4 = flakeSrc: locks: callFlake4 = flakeSrc: locks: let
let
flake = import (flakeSrc + "/flake.nix"); flake = import (flakeSrc + "/flake.nix");
inputs = builtins.mapAttrs (n: v: inputs = builtins.mapAttrs (n: v:
if v.flake or true if v.flake or true
then callFlake4 (fetchTree (v.locked // v.info)) v.inputs then callFlake4 (fetchTree (v.locked // v.info)) v.inputs
else fetchTree (v.locked // v.info)) locks; else fetchTree (v.locked // v.info))
locks;
outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;})); outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;}));
in in
assert flake.edition == 201909; assert flake.edition == 201909; outputs;
outputs;
callLocklessFlake = flakeSrc: callLocklessFlake = flakeSrc: let
let
flake = import (flakeSrc + "/flake.nix"); flake = import (flakeSrc + "/flake.nix");
outputs = flakeSrc // (flake.outputs ({ self = outputs; })); outputs = flakeSrc // (flake.outputs {self = outputs;});
in outputs; in
outputs;
rootSrc = let rootSrc = let
# Try to clean the source tree by using fetchGit, if this source # Try to clean the source tree by using fetchGit, if this source
# tree is a valid git repository. # tree is a valid git repository.
tryFetchGit = src: tryFetchGit = src:
if isGit && !isShallow if isGit && !isShallow
then then let
let res = builtins.fetchGit src; res = builtins.fetchGit src;
in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res in
else { outPath = src; }; if res.rev == "0000000000000000000000000000000000000000"
then removeAttrs res ["rev" "shortRev"]
else res
else {outPath = src;};
# NB git worktrees have a file for .git, so we don't check the type of .git # NB git worktrees have a file for .git, so we don't check the type of .git
isGit = builtins.pathExists (src + "/.git"); isGit = builtins.pathExists (src + "/.git");
isShallow = builtins.pathExists (src + "/.git/shallow"); isShallow = builtins.pathExists (src + "/.git/shallow");
in in
{ lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; } {
// (if src ? outPath then src else tryFetchGit src); lastModified = 0;
lastModifiedDate = formatSecondsSinceEpoch 0;
}
// (
if src ? outPath
then src
else tryFetchGit src
);
# Format number of seconds in the Unix epoch as %Y%m%d%H%M%S. # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S.
formatSecondsSinceEpoch = t: formatSecondsSinceEpoch = t: let
let
rem = x: y: x - x / y * y; rem = x: y: x - x / y * y;
days = t / 86400; days = t / 86400;
secondsInDay = rem t 86400; secondsInDay = rem t 86400;
@ -120,33 +165,65 @@ let
# Courtesy of https://stackoverflow.com/a/32158604. # Courtesy of https://stackoverflow.com/a/32158604.
z = days + 719468; z = days + 719468;
era = (if z >= 0 then z else z - 146096) / 146097; era =
(
if z >= 0
then z
else z - 146096
)
/ 146097;
doe = z - era * 146097; doe = z - era * 146097;
yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
y = yoe + era * 400; y = yoe + era * 400;
doy = doe - (365 * yoe + yoe / 4 - yoe / 100); doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
mp = (5 * doy + 2) / 153; mp = (5 * doy + 2) / 153;
d = doy - (153 * mp + 2) / 5 + 1; d = doy - (153 * mp + 2) / 5 + 1;
m = mp + (if mp < 10 then 3 else -9); m =
y' = y + (if m <= 2 then 1 else 0); mp
+ (
if mp < 10
then 3
else -9
);
y' =
y
+ (
if m <= 2
then 1
else 0
);
pad = s: if builtins.stringLength s < 2 then "0" + s else s; pad = s:
if builtins.stringLength s < 2
then "0" + s
else s;
in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}";
allNodes = allNodes =
builtins.mapAttrs builtins.mapAttrs
(key: node: (
let key: node: let
sourceInfo = sourceInfo =
if key == lockFile.root if key == lockFile.root
then rootSrc then rootSrc
else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]);
subdir = if key == lockFile.root then "" else node.locked.dir or ""; subdir =
if key == lockFile.root
then ""
else node.locked.dir or "";
flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix"); flake = import (sourceInfo
+ (
if subdir != ""
then "/"
else ""
)
+ subdir
+ "/flake.nix");
inputs = builtins.mapAttrs inputs =
builtins.mapAttrs
(inputName: inputSpec: allNodes.${resolveInput inputSpec}) (inputName: inputSpec: allNodes.${resolveInput inputSpec})
(node.inputs or {}); (node.inputs or {});
@ -169,15 +246,20 @@ let
(resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path}) (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path})
(builtins.tail path); (builtins.tail path);
outputs = flake.outputs (inputs // { self = result; }); outputs = flake.outputs (inputs // {self = result;});
result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; }; result =
outputs
// sourceInfo
// {
inherit inputs;
inherit outputs;
inherit sourceInfo;
};
in in
if node.flake or true then if node.flake or true
assert builtins.isFunction flake.outputs; then assert builtins.isFunction flake.outputs; result
result else sourceInfo
else
sourceInfo
) )
lockFile.nodes; lockFile.nodes;
@ -189,16 +271,30 @@ let
else if lockFile.version >= 5 && lockFile.version <= 7 else if lockFile.version >= 5 && lockFile.version <= 7
then allNodes.${lockFile.root} then allNodes.${lockFile.root}
else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}"; else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}";
in rec {
in
rec {
defaultNix = defaultNix =
(builtins.removeAttrs result ["__functor"]) (builtins.removeAttrs result ["__functor"])
// (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {}) // (
// (if result ? packages.${system}.default then { default = result.packages.${system}.default; } else {}); if result ? defaultPackage.${system}
then {default = result.defaultPackage.${system};}
else {}
)
// (
if result ? packages.${system}.default
then {default = result.packages.${system}.default;}
else {}
);
shellNix = shellNix =
defaultNix defaultNix
// (if result ? devShell.${system} then { default = result.devShell.${system}; } else {}) // (
// (if result ? devShells.${system}.default then { default = result.devShells.${system}.default; } else {}); if result ? devShell.${system}
} then {default = result.devShell.${system};}
else {}
)
// (
if result ? devShells.${system}.default
then {default = result.devShells.${system}.default;}
else {}
);
}

View File

@ -1,25 +1,25 @@
let let
pkgs = import ./nixpkgs.nix { config = { allowUnfree = true; }; }; pkgs = import ./nixpkgs.nix {config = {allowUnfree = true;};};
pure = pkgs.recurseIntoAttrs (pkgs.callPackage ./nixGL.nix { pure = pkgs.recurseIntoAttrs (pkgs.callPackage ./nixGL.nix {
nvidiaVersion = "440.82"; nvidiaVersion = "440.82";
nvidiaHash = "edd415acf2f75a659e0f3b4f27c1fab770cf21614e84a18152d94f0d004a758e"; nvidiaHash = "edd415acf2f75a659e0f3b4f27c1fab770cf21614e84a18152d94f0d004a758e";
}); });
versionFile440 = (pkgs.callPackage ./nixGL.nix { versionFile440 = pkgs.callPackage ./nixGL.nix {
nvidiaVersionFile = pkgs.writeText "nvidia-version-440.82" '' nvidiaVersionFile = pkgs.writeText "nvidia-version-440.82" ''
NVRM version: NVIDIA UNIX x86_64 Kernel Module 440.82 Wed Apr 1 20:04:33 UTC 2020 NVRM version: NVIDIA UNIX x86_64 Kernel Module 440.82 Wed Apr 1 20:04:33 UTC 2020
GCC version: gcc version 9.3.0 (Arch Linux 9.3.0-1) GCC version: gcc version 9.3.0 (Arch Linux 9.3.0-1)
''; '';
}); };
versionFile510 = (pkgs.callPackage ./nixGL.nix { versionFile510 = pkgs.callPackage ./nixGL.nix {
nvidiaVersionFile = pkgs.writeText "nvidia-version-510.54" '' nvidiaVersionFile = pkgs.writeText "nvidia-version-510.54" ''
NVRM version: NVIDIA UNIX x86_64 Kernel Module 510.54 Wed Apr 1 20:04:33 UTC 2020 NVRM version: NVIDIA UNIX x86_64 Kernel Module 510.54 Wed Apr 1 20:04:33 UTC 2020
GCC version: gcc version 9.3.0 (Arch Linux 9.3.0-1) GCC version: gcc version 9.3.0 (Arch Linux 9.3.0-1)
''; '';
}); };
in in
(with pure; [ nixGLIntel nixVulkanNvidia nixGLNvidia nixVulkanIntel ]) (with pure; [nixGLIntel nixVulkanNvidia nixGLNvidia nixVulkanIntel])
++ (with versionFile440.auto; [ nixGLNvidia nixGLDefault nixVulkanNvidia ]) ++ (with versionFile440.auto; [nixGLNvidia nixGLDefault nixVulkanNvidia])
++ (with versionFile510.auto; [ nixGLNvidia nixGLDefault nixVulkanNvidia ]) ++ (with versionFile510.auto; [nixGLNvidia nixGLDefault nixVulkanNvidia])

View File

@ -1,26 +1,27 @@
{ {
## Nvidia informations. ## Nvidia informations.
# Version of the system kernel module. Let it to null to enable auto-detection. # Version of the system kernel module. Let it to null to enable auto-detection.
nvidiaVersion ? null nvidiaVersion ? null,
, # Hash of the Nvidia driver .run file. null is fine, but fixing a value here # Hash of the Nvidia driver .run file. null is fine, but fixing a value here
# will be more reproducible and more efficient. # will be more reproducible and more efficient.
nvidiaHash ? null nvidiaHash ? null,
, # Alternatively, you can pass a path that points to a nvidia version file # Alternatively, you can pass a path that points to a nvidia version file
# and let nixGL extract the version from it. That file must be a copy of # and let nixGL extract the version from it. That file must be a copy of
# /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see # /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see
# https://github.com/NixOS/nix/issues/3539 ). # https://github.com/NixOS/nix/issues/3539 ).
nvidiaVersionFile ? null nvidiaVersionFile ? null,
, # Enable 32 bits driver # Enable 32 bits driver
# This is on by default, you can switch it to off if you want to reduce a # This is on by default, you can switch it to off if you want to reduce a
# bit the size of nixGL closure. # bit the size of nixGL closure.
enable32bits ? true enable32bits ? true,
, # Make sure to enable config.allowUnfree to the instance of nixpkgs to be # Make sure to enable config.allowUnfree to the instance of nixpkgs to be
# able to access the nvidia drivers. # able to access the nvidia drivers.
pkgs ? import <nixpkgs> { pkgs ?
config = { allowUnfree = true; }; import <nixpkgs> {
} config = {allowUnfree = true;};
, # Enable all Intel specific extensions which only works on x86_64 },
enableIntelX86Extensions ? true # Enable all Intel specific extensions which only works on x86_64
enableIntelX86Extensions ? true,
}: }:
pkgs.callPackage ./nixGL.nix ({ pkgs.callPackage ./nixGL.nix ({
inherit inherit
@ -29,8 +30,12 @@ pkgs.callPackage ./nixGL.nix ({
nvidiaHash nvidiaHash
enable32bits enable32bits
; ;
} // (if enableIntelX86Extensions then { } }
else { // (
if enableIntelX86Extensions
then {}
else {
intel-media-driver = null; intel-media-driver = null;
vaapiIntel = null; vaapiIntel = null;
})) }
))

View File

@ -4,19 +4,20 @@
inputs.flake-utils.url = "github:numtide/flake-utils"; inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.nixpkgs.url = "github:nixos/nixpkgs"; inputs.nixpkgs.url = "github:nixos/nixpkgs";
outputs = { self, nixpkgs, flake-utils }: outputs = {
(flake-utils.lib.eachDefaultSystem (system: self,
let nixpkgs,
flake-utils,
}:
(flake-utils.lib.eachDefaultSystem (system: let
isIntelX86Platform = system == "x86_64-linux"; isIntelX86Platform = system == "x86_64-linux";
nix_pkgs = import nixpkgs { inherit system; }; nix_pkgs = import nixpkgs {inherit system;};
pkgs = import ./default.nix { pkgs = import ./default.nix {
pkgs = nix_pkgs; pkgs = nix_pkgs;
enable32bits = isIntelX86Platform; enable32bits = isIntelX86Platform;
enableIntelX86Extensions = isIntelX86Platform; enableIntelX86Extensions = isIntelX86Platform;
}; };
in in rec {
rec {
packages = { packages = {
# makes it easy to use "nix run nixGL --impure -- program" # makes it easy to use "nix run nixGL --impure -- program"
default = pkgs.auto.nixGLDefault; default = pkgs.auto.nixGLDefault;
@ -27,16 +28,16 @@
nixGLIntel = pkgs.nixGLIntel; nixGLIntel = pkgs.nixGLIntel;
nixVulkanNvidia = pkgs.auto.nixVulkanNvidia; nixVulkanNvidia = pkgs.auto.nixVulkanNvidia;
nixVulkanIntel = pkgs.nixVulkanIntel; nixVulkanIntel = pkgs.nixVulkanIntel;
}; };
# deprecated attributes for retro compatibility # deprecated attributes for retro compatibility
defaultPackage = packages; defaultPackage = packages;
})) // rec { }))
// rec {
# deprecated attributes for retro compatibility # deprecated attributes for retro compatibility
overlay = overlays.default; overlay = overlays.default;
overlays.default = final: _: overlays.default = final: _: let
let isIntelX86Platform = final.system == "x86_64-linux"; isIntelX86Platform = final.system == "x86_64-linux";
in { in {
nixgl = import ./default.nix { nixgl = import ./default.nix {
pkgs = final; pkgs = final;

View File

@ -1,45 +1,46 @@
{ {
# # Nvidia informations. # # Nvidia informations.
# Version of the system kernel module. Let it to null to enable auto-detection. # Version of the system kernel module. Let it to null to enable auto-detection.
nvidiaVersion ? null nvidiaVersion ? null,
, # Hash of the Nvidia driver .run file. null is fine, but fixing a value here # Hash of the Nvidia driver .run file. null is fine, but fixing a value here
# will be more reproducible and more efficient. # will be more reproducible and more efficient.
nvidiaHash ? null nvidiaHash ? null,
, # Alternatively, you can pass a path that points to a nvidia version file # Alternatively, you can pass a path that points to a nvidia version file
# and let nixGL extract the version from it. That file must be a copy of # and let nixGL extract the version from it. That file must be a copy of
# /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see # /proc/driver/nvidia/version. Nix doesn't like zero-sized files (see
# https://github.com/NixOS/nix/issues/3539 ). # https://github.com/NixOS/nix/issues/3539 ).
nvidiaVersionFile ? null nvidiaVersionFile ? null,
, # Enable 32 bits driver # Enable 32 bits driver
# This is one by default, you can switch it to off if you want to reduce a # This is one by default, you can switch it to off if you want to reduce a
# bit the size of nixGL closure. # bit the size of nixGL closure.
enable32bits ? true enable32bits ? true,
, writeTextFile writeTextFile,
, shellcheck shellcheck,
, pcre pcre,
, runCommand runCommand,
, linuxPackages linuxPackages,
, fetchurl fetchurl,
, lib lib,
, runtimeShell runtimeShell,
, bumblebee bumblebee,
, libglvnd libglvnd,
, vulkan-validation-layers vulkan-validation-layers,
, mesa mesa,
, libvdpau-va-gl libvdpau-va-gl,
, intel-media-driver intel-media-driver,
, vaapiIntel vaapiIntel,
, pkgsi686Linux pkgsi686Linux,
, driversi686Linux driversi686Linux,
, zlib zlib,
, libdrm libdrm,
, xorg xorg,
, wayland wayland,
, gcc gcc,
}: }: let
writeExecutable = {
let name,
writeExecutable = { name, text }: text,
}:
writeTextFile { writeTextFile {
inherit name text; inherit name text;
@ -62,19 +63,20 @@ let
It contains the builder for different nvidia configuration, parametrized by It contains the builder for different nvidia configuration, parametrized by
the version of the driver and sha256 sum of the driver installer file. the version of the driver and sha256 sum of the driver installer file.
*/ */
nvidiaPackages = { version, sha256 ? fetch_db."${version}".sha256 }: nvidiaPackages = {
let version,
nvidiaDrivers = (linuxPackages.nvidia_x11.override { }).overrideAttrs sha256 ? fetch_db."${version}".sha256,
}: let
nvidiaDrivers =
(linuxPackages.nvidia_x11.override {}).overrideAttrs
(oldAttrs: { (oldAttrs: {
pname = "nvidia"; pname = "nvidia";
name = "nvidia-x11-${version}-nixGL"; name = "nvidia-x11-${version}-nixGL";
inherit version; inherit version;
src = src = let
let url = "https://download.nvidia.com/XFree86/Linux-x86_64/${version}/NVIDIA-Linux-x86_64-${version}.run";
url =
"https://download.nvidia.com/XFree86/Linux-x86_64/${version}/NVIDIA-Linux-x86_64-${version}.run";
in in
fetchurl { inherit url sha256; }; fetchurl {inherit url sha256;};
useGLVND = true; useGLVND = true;
}); });
nvidiaLibsOnly = nvidiaDrivers.override { nvidiaLibsOnly = nvidiaDrivers.override {
@ -94,8 +96,7 @@ let
${''export __EGL_VENDOR_LIBRARY_FILENAMES=''${NVIDIA_JSON[*]}${ ${''export __EGL_VENDOR_LIBRARY_FILENAMES=''${NVIDIA_JSON[*]}${
lib.optionalString enable32bits lib.optionalString enable32bits
'':''${NVIDIA_JSON32[*]}'' '':''${NVIDIA_JSON32[*]}''
}"''${__EGL_VENDOR_LIBRARY_FILENAMES:+:$__EGL_VENDOR_LIBRARY_FILENAMES}"'' }"''${__EGL_VENDOR_LIBRARY_FILENAMES:+:$__EGL_VENDOR_LIBRARY_FILENAMES}"''}
}
${ ${
lib.optionalString (api == "Vulkan") lib.optionalString (api == "Vulkan")
@ -105,7 +106,7 @@ let
}"''${VK_ICD_FILENAMES:+:$VK_ICD_FILENAMES}"'' }"''${VK_ICD_FILENAMES:+:$VK_ICD_FILENAMES}"''
} }
export LD_LIBRARY_PATH=${ export LD_LIBRARY_PATH=${
lib.makeLibraryPath ([ libglvnd nvidiaLibsOnly ] lib.makeLibraryPath ([libglvnd nvidiaLibsOnly]
++ lib.optional (api == "Vulkan") vulkan-validation-layers ++ lib.optional (api == "Vulkan") vulkan-validation-layers
++ lib.optionals enable32bits [ ++ lib.optionals enable32bits [
nvidiaLibsOnly.lib32 nvidiaLibsOnly.lib32
@ -115,8 +116,7 @@ let
exec "$@" exec "$@"
''; '';
}; };
in in {
{
inherit nvidiaDrivers nvidiaLibsOnly; inherit nvidiaDrivers nvidiaLibsOnly;
nixGLNvidiaBumblebee = writeExecutable { nixGLNvidiaBumblebee = writeExecutable {
@ -124,7 +124,7 @@ let
text = '' text = ''
#!${runtimeShell} #!${runtimeShell}
export LD_LIBRARY_PATH=${ export LD_LIBRARY_PATH=${
lib.makeLibraryPath [ nvidiaDrivers ] lib.makeLibraryPath [nvidiaDrivers]
}"''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" }"''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
${ ${
bumblebee.override { bumblebee.override {
@ -132,7 +132,7 @@ let
nvidia_x11_i686 = nvidiaDrivers.lib32; nvidia_x11_i686 = nvidiaDrivers.lib32;
} }
}/bin/optirun --ldpath ${ }/bin/optirun --ldpath ${
lib.makeLibraryPath ([ libglvnd nvidiaDrivers ] lib.makeLibraryPath ([libglvnd nvidiaDrivers]
++ lib.optionals enable32bits [ ++ lib.optionals enable32bits [
nvidiaDrivers.lib32 nvidiaDrivers.lib32
pkgsi686Linux.libglvnd pkgsi686Linux.libglvnd
@ -154,31 +154,34 @@ let
nixGLIntel = writeExecutable { nixGLIntel = writeExecutable {
name = "nixGLIntel"; name = "nixGLIntel";
# add the 32 bits drivers if needed # add the 32 bits drivers if needed
text = text = let
let mesa-drivers =
mesa-drivers = [ mesa.drivers ] [mesa.drivers]
++ lib.optional enable32bits pkgsi686Linux.mesa.drivers; ++ lib.optional enable32bits pkgsi686Linux.mesa.drivers;
intel-driver = [ intel-media-driver vaapiIntel ] intel-driver =
[intel-media-driver vaapiIntel]
# Note: intel-media-driver is disabled for i686 until https://github.com/NixOS/nixpkgs/issues/140471 is fixed # Note: intel-media-driver is disabled for i686 until https://github.com/NixOS/nixpkgs/issues/140471 is fixed
++ lib.optionals enable32bits [ /* pkgsi686Linux.intel-media-driver */ driversi686Linux.vaapiIntel ]; ++ lib.optionals enable32bits [
libvdpau = [ libvdpau-va-gl ] /*
pkgsi686Linux.intel-media-driver
*/
driversi686Linux.vaapiIntel
];
libvdpau =
[libvdpau-va-gl]
++ lib.optional enable32bits pkgsi686Linux.libvdpau-va-gl; ++ lib.optional enable32bits pkgsi686Linux.libvdpau-va-gl;
glxindirect = runCommand "mesa_glxindirect" { } ( glxindirect = runCommand "mesa_glxindirect" {} ''
''
mkdir -p $out/lib mkdir -p $out/lib
ln -s ${mesa.drivers}/lib/libGLX_mesa.so.0 $out/lib/libGLX_indirect.so.0 ln -s ${mesa.drivers}/lib/libGLX_mesa.so.0 $out/lib/libGLX_indirect.so.0
'' '';
); in ''
in
''
#!${runtimeShell} #!${runtimeShell}
export LIBGL_DRIVERS_PATH=${lib.makeSearchPathOutput "lib" "lib/dri" mesa-drivers} export LIBGL_DRIVERS_PATH=${lib.makeSearchPathOutput "lib" "lib/dri" mesa-drivers}
export LIBVA_DRIVERS_PATH=${lib.makeSearchPathOutput "out" "lib/dri" intel-driver} export LIBVA_DRIVERS_PATH=${lib.makeSearchPathOutput "out" "lib/dri" intel-driver}
${''export __EGL_VENDOR_LIBRARY_FILENAMES=${mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json${ ${''export __EGL_VENDOR_LIBRARY_FILENAMES=${mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json${
lib.optionalString enable32bits lib.optionalString enable32bits
":${pkgsi686Linux.mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json" ":${pkgsi686Linux.mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json"
}"''${__EGL_VENDOR_LIBRARY_FILENAMES:+:$__EGL_VENDOR_LIBRARY_FILENAMES}"'' }"''${__EGL_VENDOR_LIBRARY_FILENAMES:+:$__EGL_VENDOR_LIBRARY_FILENAMES}"''}
}
export LD_LIBRARY_PATH=${lib.makeLibraryPath mesa-drivers}:${lib.makeSearchPathOutput "lib" "lib/vdpau" libvdpau}:${glxindirect}/lib:${lib.makeLibraryPath [libglvnd]}"''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" export LD_LIBRARY_PATH=${lib.makeLibraryPath mesa-drivers}:${lib.makeSearchPathOutput "lib" "lib/vdpau" libvdpau}:${glxindirect}/lib:${lib.makeLibraryPath [libglvnd]}"''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
exec "$@" exec "$@"
''; '';
@ -186,10 +189,9 @@ let
nixVulkanIntel = writeExecutable { nixVulkanIntel = writeExecutable {
name = "nixVulkanIntel"; name = "nixVulkanIntel";
text = text = let
let
# generate a file with the listing of all the icd files # generate a file with the listing of all the icd files
icd = runCommand "mesa_icd" { } ( icd = runCommand "mesa_icd" {} (
# 64 bits icd # 64 bits icd
'' ''
ls ${mesa.drivers}/share/vulkan/icd.d/*.json > f ls ${mesa.drivers}/share/vulkan/icd.d/*.json > f
@ -201,8 +203,7 @@ let
# concat everything as a one line string with ":" as seperator # concat everything as a one line string with ":" as seperator
+ ''cat f | xargs | sed "s/ /:/g" > $out'' + ''cat f | xargs | sed "s/ /:/g" > $out''
); );
in in ''
''
#!${runtimeShell} #!${runtimeShell}
if [ -n "$LD_LIBRARY_PATH" ]; then if [ -n "$LD_LIBRARY_PATH" ]; then
echo "Warning, nixVulkanIntel overwriting existing LD_LIBRARY_PATH" 1>&2 echo "Warning, nixVulkanIntel overwriting existing LD_LIBRARY_PATH" 1>&2
@ -226,17 +227,16 @@ let
}; };
nixGLCommon = nixGL: nixGLCommon = nixGL:
runCommand "nixGL" { } '' runCommand "nixGL" {} ''
mkdir -p "$out/bin" mkdir -p "$out/bin"
# star because nixGLNvidia... have version prefixed name # star because nixGLNvidia... have version prefixed name
cp ${nixGL}/bin/* "$out/bin/nixGL"; cp ${nixGL}/bin/* "$out/bin/nixGL";
''; '';
auto = auto = let
let
_nvidiaVersionFile = _nvidiaVersionFile =
if nvidiaVersionFile != null then if nvidiaVersionFile != null
nvidiaVersionFile then nvidiaVersionFile
else else
# HACK: Get the version from /proc. It turns out that /proc is mounted # HACK: Get the version from /proc. It turns out that /proc is mounted
# inside of the build sandbox and varies from machine to machine. # inside of the build sandbox and varies from machine to machine.
@ -255,34 +255,39 @@ let
# The nvidia version. Either fixed by the `nvidiaVersion` argument, or # The nvidia version. Either fixed by the `nvidiaVersion` argument, or
# auto-detected. Auto-detection is impure. # auto-detected. Auto-detection is impure.
nvidiaVersionAuto = nvidiaVersionAuto =
if nvidiaVersion != null then if nvidiaVersion != null
nvidiaVersion then nvidiaVersion
else else
# Get if from the nvidiaVersionFile # Get if from the nvidiaVersionFile
let let
data = builtins.readFile _nvidiaVersionFile; data = builtins.readFile _nvidiaVersionFile;
versionMatch = builtins.match ".*Module ([0-9.]+) .*" data; versionMatch = builtins.match ".*Module ([0-9.]+) .*" data;
in in
if versionMatch != null then builtins.head versionMatch else null; if versionMatch != null
then builtins.head versionMatch
else null;
autoNvidia = nvidiaPackages { version = nvidiaVersionAuto; }; autoNvidia = nvidiaPackages {version = nvidiaVersionAuto;};
in in
rec { rec {
# The output derivation contains nixGL which point either to # The output derivation contains nixGL which point either to
# nixGLNvidia or nixGLIntel using an heuristic. # nixGLNvidia or nixGLIntel using an heuristic.
nixGLDefault = nixGLDefault =
if nvidiaVersionAuto != null then if nvidiaVersionAuto != null
nixGLCommon autoNvidia.nixGLNvidia then nixGLCommon autoNvidia.nixGLNvidia
else else nixGLCommon nixGLIntel;
nixGLCommon nixGLIntel; }
} // autoNvidia; // autoNvidia;
}; };
in in
top // (if nvidiaVersion != null then top
// (
if nvidiaVersion != null
then
top.nvidiaPackages top.nvidiaPackages
{ {
version = nvidiaVersion; version = nvidiaVersion;
sha256 = nvidiaHash; sha256 = nvidiaHash;
} }
else else {}
{ }) )

View File

@ -1,7 +1,7 @@
let let
rev = "4f6d8095fd51"; rev = "4f6d8095fd51";
in in
import (fetchTarball { import (fetchTarball {
url = "https://github.com/nixos/nixpkgs/archive/${rev}.tar.gz"; url = "https://github.com/nixos/nixpkgs/archive/${rev}.tar.gz";
sha256 = "14sm0bjjcmi9qmznwy3nkd2vbhj5xcshgm54a5wiprl9ssvxqw53"; sha256 = "14sm0bjjcmi9qmznwy3nkd2vbhj5xcshgm54a5wiprl9ssvxqw53";
}) })

View File

@ -1,22 +1,29 @@
# WARNING: currently not usable anymore
let let
inherit ((import inherit
((
import
( (
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in
fetchTarball { fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash; sha256 = lock.nodes.flake-compat.locked.narHash;
} }
) )
{ src = ./.; } {src = ./.;}
).defaultNix) secrets; )
.defaultNix)
secrets
;
inherit (secrets) pubKeys; inherit (secrets) pubKeys;
inherit (pubKeys) users hosts; inherit (pubKeys) users hosts;
all = users // hosts; all = users // hosts;
c_ = builtins; c_ = builtins;
in in {
{ "secrets/s3fs.age".publicKeys = c_.attrValues all;
"secrets/s3fs.age".publicKeys = c_.attrValues (all); "secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues all;
"secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues (all); "secrets/_nhitrl.age".publicKeys = c_.attrValues all;
"secrets/_nhitrl.age".publicKeys = c_.attrValues (all); "secrets/wifi.env.age".publicKeys = c_.attrValues all;
"secrets/wifi.env.age".publicKeys = c_.attrValues (all);
} }

View File

@ -1,6 +1,5 @@
# TODO: put ssh keys as user/host config # TODO: put ssh keys as user/host config
inputs: inputs: let
let
# user-specific (~/.ssh/id_ed25519.pub) # user-specific (~/.ssh/id_ed25519.pub)
users = { users = {
"hungtr@bao" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+1+gps6phbZboIb9fH51VNPUCkhSSOAbkI3tq3Ou0Z"; "hungtr@bao" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK+1+gps6phbZboIb9fH51VNPUCkhSSOAbkI3tq3Ou0Z";
@ -12,9 +11,8 @@ let
all = users // systems; all = users // systems;
# stands for calculus # stands for calculus
c_ = builtins; c_ = builtins;
in in {
{ "system/secrets/s3fs.age".publicKeys = c_.attrValues all;
"system/secrets/s3fs.age".publicKeys = c_.attrValues (all); "system/secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues all;
"system/secrets/s3fs.digital-garden.age".publicKeys = c_.attrValues (all); "system/secrets/_nhitrl.age".publicKeys = c_.attrValues all;
"system/secrets/_nhitrl.age".publicKeys = c_.attrValues (all);
} }

View File

@ -1,11 +1,14 @@
# This uses the exported devShells from flake.nix # This uses the exported devShells from flake.nix
# the default or base version of nix-shell can be found in dev-shell.nix instead # the default or base version of nix-shell can be found in dev-shell.nix instead
# This architecture is because we use top-level flake.nix # This architecture is because we use top-level flake.nix
(import (
import
( (
let let
lock = builtins.fromJSON (builtins.readFile ./flake.lock); lock = builtins.fromJSON (builtins.readFile ./flake.lock);
in (import ./c_.nix).fetchTree lock.nodes.flake-compat.locked in
(import ./c_.nix).fetchTree lock.nodes.flake-compat.locked
) )
{ src = ./.; } {src = ./.;}
).shellNix )
.shellNix

View File

@ -1,8 +1,9 @@
# TODO: templates should be able to have initial states like # TODO: templates should be able to have initial states like
# repo name, author,... # repo name, author,...
{ pkgs {
, lib pkgs,
, ... lib,
...
}: { }: {
rust = { rust = {
path = ./rust; path = ./rust;

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).defaultNix })
.defaultNix

View File

@ -1,15 +1,16 @@
{ {
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
outputs = { self, nixpkgs }: outputs = {
let self,
supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ]; nixpkgs,
}: let
supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems; forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system}); pkgs = forAllSystems (system: nixpkgs.legacyPackages.${system});
in in {
{
packages = forAllSystems (system: { packages = forAllSystems (system: {
default = pkgs.${system}.poetry2nix.mkPoetryApplication { projectDir = self; }; default = pkgs.${system}.poetry2nix.mkPoetryApplication {projectDir = self;};
}); });
devShells = forAllSystems (system: { devShells = forAllSystems (system: {
@ -20,7 +21,7 @@
}; };
default = pkgs.${system}.mkShellNoCC { default = pkgs.${system}.mkShellNoCC {
packages = [ packages = [
(pkgs.${system}.poetry2nix.mkPoetryEnv { projectDir = self; }) (pkgs.${system}.poetry2nix.mkPoetryEnv {projectDir = self;})
pkgs.${system}.poetry pkgs.${system}.poetry
]; ];
}; };

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).shellNix })
.shellNix

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).defaultNix })
.defaultNix

View File

@ -6,23 +6,29 @@
rust-overlay.url = "github:oxalica/rust-overlay"; rust-overlay.url = "github:oxalica/rust-overlay";
}; };
outputs = { self, nixpkgs, utils, naersk, rust-overlay }: outputs = {
utils.lib.eachDefaultSystem (system: self,
let nixpkgs,
overlays = [ rust-overlay.overlays.default ]; utils,
pkgs = import nixpkgs { inherit system overlays; }; naersk,
rust_pkgs = (pkgs.rust-bin.selectLatestNightlyWith rust-overlay,
}:
utils.lib.eachDefaultSystem (system: let
overlays = [rust-overlay.overlays.default];
pkgs = import nixpkgs {inherit system overlays;};
rust_pkgs =
pkgs.rust-bin.selectLatestNightlyWith
( (
toolchain: toolchain:
toolchain.default.override { toolchain.default.override {
extensions = [ "rust-src" "rust-analyzer" "rust-docs" "clippy" "miri" ]; extensions = ["rust-src" "rust-analyzer" "rust-docs" "clippy" "miri"];
} }
)); );
naersk-lib = pkgs.callPackage naersk { }; naersk-lib = pkgs.callPackage naersk {};
in in {
{
defaultPackage = naersk-lib.buildPackage ./.; defaultPackage = naersk-lib.buildPackage ./.;
devShell = with pkgs; mkShell { devShell = with pkgs;
mkShell {
buildInputs = [ buildInputs = [
rust_pkgs rust_pkgs
# rust's compiler is quite powerful enough to the point where # rust's compiler is quite powerful enough to the point where

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).shellNix })
.shellNix

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).defaultNix })
.defaultNix

View File

@ -6,23 +6,29 @@
rust-overlay.url = "github:oxalica/rust-overlay"; rust-overlay.url = "github:oxalica/rust-overlay";
}; };
outputs = { self, nixpkgs, utils, naersk, rust-overlay }: outputs = {
utils.lib.eachDefaultSystem (system: self,
let nixpkgs,
overlays = [ rust-overlay.overlays.default ]; utils,
pkgs = import nixpkgs { inherit system overlays; }; naersk,
rust_pkgs = (pkgs.rust-bin.selectLatestNightlyWith rust-overlay,
}:
utils.lib.eachDefaultSystem (system: let
overlays = [rust-overlay.overlays.default];
pkgs = import nixpkgs {inherit system overlays;};
rust_pkgs =
pkgs.rust-bin.selectLatestNightlyWith
( (
toolchain: toolchain:
toolchain.default.override { toolchain.default.override {
extensions = [ "rust-src" "rust-analyzer" "rust-docs" "clippy" "miri" ]; extensions = ["rust-src" "rust-analyzer" "rust-docs" "clippy" "miri"];
} }
)); );
naersk-lib = pkgs.callPackage naersk { }; naersk-lib = pkgs.callPackage naersk {};
in in {
{
defaultPackage = naersk-lib.buildPackage ./.; defaultPackage = naersk-lib.buildPackage ./.;
devShell = with pkgs; mkShell { devShell = with pkgs;
mkShell {
buildInputs = [ buildInputs = [
rust_pkgs rust_pkgs
# rust's compiler is quite powerful enough to the point where # rust's compiler is quite powerful enough to the point where

View File

@ -7,4 +7,5 @@
) )
{ {
src = ./.; src = ./.;
}).shellNix })
.shellNix

View File

@ -9,22 +9,28 @@
turbo.url = "github:dlip/turbo"; turbo.url = "github:dlip/turbo";
}; };
outputs = { self, turbo, flake-utils, nixpkgs }: outputs = {
with flake-utils; lib.eachSystem lib.defaultSystems (sys: self,
let turbo,
overlays = [ turbo.overlay ]; flake-utils,
nixpkgs,
}:
with flake-utils; lib.eachSystem lib.defaultSystems (sys: let
overlays = [turbo.overlay];
# pkgs is our tweaked nixpkgs # pkgs is our tweaked nixpkgs
pkgs = import nixpkgs { system = sys; overlays = overlays; }; pkgs = import nixpkgs {
system = sys;
overlays = overlays;
};
shellMsg = '' shellMsg = ''
echo "Hello from nix ${sys}" echo "Hello from nix ${sys}"
echo "Local development may use our remote planetscale database (pscale login && pnpm dev:infra; pnpm dev)" echo "Local development may use our remote planetscale database (pscale login && pnpm dev:infra; pnpm dev)"
echo "Or from the specified docker-compose.yml (pnpm dev:local_infra && pnpm dev)" echo "Or from the specified docker-compose.yml (pnpm dev:local_infra && pnpm dev)"
echo "See more on CONTRIBUTING.md" echo "See more on CONTRIBUTING.md"
''; '';
in in {
{
devShell = pkgs.mkShell { devShell = pkgs.mkShell {
nativeBuildInputs = [ pkgs.bashInteractive ]; nativeBuildInputs = [pkgs.bashInteractive];
buildInputs = [ buildInputs = [
pkgs.nodejs-18_x pkgs.nodejs-18_x
pkgs.nodePackages.pnpm pkgs.nodePackages.pnpm
@ -47,7 +53,8 @@
export PRISMA_FMT_BINARY="${pkgs.prisma-engines}/bin/prisma-fmt" export PRISMA_FMT_BINARY="${pkgs.prisma-engines}/bin/prisma-fmt"
export TURBO_BINARY_PATH="${pkgs.turbo}/bin/turbo" export TURBO_BINARY_PATH="${pkgs.turbo}/bin/turbo"
pnpm install pnpm install
'' + shellMsg; ''
+ shellMsg;
}; };
}); });
} }

Some files were not shown because too many files have changed in this diff Show More