All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 35s
				
			Test / Hakurei (push) Successful in 45s
				
			Test / Hpkg (push) Successful in 3m17s
				
			Test / Sandbox (push) Successful in 43s
				
			Test / Hakurei (race detector) (push) Successful in 45s
				
			Test / Sandbox (race detector) (push) Successful in 43s
				
			Test / Flake checks (push) Successful in 1m27s
				
			Having the bit field value here (in decimal, no less) is unfriendly to text editors. Use a bunch of booleans here to improve ease of use. Signed-off-by: Ophestra <cat@gensokyo.uk>
		
			
				
	
	
		
			257 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  nixpkgsFor,
 | 
						|
  system,
 | 
						|
  nixpkgs,
 | 
						|
  home-manager,
 | 
						|
}:
 | 
						|
 | 
						|
{
 | 
						|
  lib,
 | 
						|
  stdenv,
 | 
						|
  closureInfo,
 | 
						|
  writeScript,
 | 
						|
  runtimeShell,
 | 
						|
  writeText,
 | 
						|
  symlinkJoin,
 | 
						|
  vmTools,
 | 
						|
  runCommand,
 | 
						|
  fetchFromGitHub,
 | 
						|
 | 
						|
  zstd,
 | 
						|
  nix,
 | 
						|
  sqlite,
 | 
						|
 | 
						|
  name ? throw "name is required",
 | 
						|
  version ? throw "version is required",
 | 
						|
  pname ? "${name}-${version}",
 | 
						|
  modules ? [ ],
 | 
						|
  nixosModules ? [ ],
 | 
						|
  script ? ''
 | 
						|
    exec "$SHELL" "$@"
 | 
						|
  '',
 | 
						|
 | 
						|
  id ? name,
 | 
						|
  identity ? throw "identity is required",
 | 
						|
  groups ? [ ],
 | 
						|
  userns ? false,
 | 
						|
  net ? true,
 | 
						|
  dev ? false,
 | 
						|
  no_new_session ? false,
 | 
						|
  map_real_uid ? false,
 | 
						|
  direct_wayland ? false,
 | 
						|
  system_bus ? null,
 | 
						|
  session_bus ? null,
 | 
						|
 | 
						|
  allow_wayland ? true,
 | 
						|
  allow_x11 ? false,
 | 
						|
  allow_dbus ? true,
 | 
						|
  allow_pulse ? true,
 | 
						|
  gpu ? allow_wayland || allow_x11,
 | 
						|
}:
 | 
						|
 | 
						|
let
 | 
						|
  inherit (lib) optionals;
 | 
						|
 | 
						|
  homeManagerConfiguration = home-manager.lib.homeManagerConfiguration {
 | 
						|
    pkgs = nixpkgsFor.${system};
 | 
						|
    modules = modules ++ [
 | 
						|
      {
 | 
						|
        home = {
 | 
						|
          username = "hakurei";
 | 
						|
          homeDirectory = "/data/data/${id}";
 | 
						|
          stateVersion = "22.11";
 | 
						|
        };
 | 
						|
      }
 | 
						|
    ];
 | 
						|
  };
 | 
						|
 | 
						|
  launcher = writeScript "hakurei-${pname}" ''
 | 
						|
    #!${runtimeShell} -el
 | 
						|
    ${script}
 | 
						|
  '';
 | 
						|
 | 
						|
  extraNixOSConfig =
 | 
						|
    { pkgs, ... }:
 | 
						|
    {
 | 
						|
      environment = {
 | 
						|
        etc.nixpkgs.source = nixpkgs.outPath;
 | 
						|
        systemPackages = [ pkgs.nix ];
 | 
						|
      };
 | 
						|
 | 
						|
      imports = nixosModules;
 | 
						|
    };
 | 
						|
  nixos = nixpkgs.lib.nixosSystem {
 | 
						|
    inherit system;
 | 
						|
    modules = [
 | 
						|
      extraNixOSConfig
 | 
						|
      { nix.settings.experimental-features = [ "flakes" ]; }
 | 
						|
      { nix.settings.experimental-features = [ "nix-command" ]; }
 | 
						|
      { boot.isContainer = true; }
 | 
						|
      { system.stateVersion = "22.11"; }
 | 
						|
    ];
 | 
						|
  };
 | 
						|
 | 
						|
  etc = vmTools.runInLinuxVM (
 | 
						|
    runCommand "etc" { } ''
 | 
						|
      mkdir -p /etc
 | 
						|
      ${nixos.config.system.build.etcActivationCommands}
 | 
						|
 | 
						|
      # remove unused files
 | 
						|
      rm -rf /etc/sudoers
 | 
						|
 | 
						|
      mkdir -p $out
 | 
						|
      tar -C /etc -cf "$out/etc.tar" .
 | 
						|
    ''
 | 
						|
  );
 | 
						|
 | 
						|
  extendSessionDefault = id: ext: {
 | 
						|
    filter = true;
 | 
						|
 | 
						|
    talk = [ "org.freedesktop.Notifications" ] ++ ext.talk;
 | 
						|
    own =
 | 
						|
      (optionals (id != null) [
 | 
						|
        "${id}.*"
 | 
						|
        "org.mpris.MediaPlayer2.${id}.*"
 | 
						|
      ])
 | 
						|
      ++ ext.own;
 | 
						|
 | 
						|
    inherit (ext) call broadcast;
 | 
						|
  };
 | 
						|
 | 
						|
  nixGL = fetchFromGitHub {
 | 
						|
    owner = "nix-community";
 | 
						|
    repo = "nixGL";
 | 
						|
    rev = "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a";
 | 
						|
    hash = "sha256-lnzZQYG0+EXl/6NkGpyIz+FEOc/DSEG57AP1VsdeNrM=";
 | 
						|
  };
 | 
						|
 | 
						|
  mesaWrappers =
 | 
						|
    let
 | 
						|
      isIntelX86Platform = system == "x86_64-linux";
 | 
						|
      nixGLPackages = import (nixGL + "/default.nix") {
 | 
						|
        pkgs = nixpkgs.legacyPackages.${system};
 | 
						|
        enable32bits = isIntelX86Platform;
 | 
						|
        enableIntelX86Extensions = isIntelX86Platform;
 | 
						|
      };
 | 
						|
    in
 | 
						|
    symlinkJoin {
 | 
						|
      name = "nixGL-mesa";
 | 
						|
      paths = with nixGLPackages; [
 | 
						|
        nixGLIntel
 | 
						|
        nixVulkanIntel
 | 
						|
      ];
 | 
						|
    };
 | 
						|
 | 
						|
  info = builtins.toJSON {
 | 
						|
    inherit
 | 
						|
      name
 | 
						|
      version
 | 
						|
      id
 | 
						|
      identity
 | 
						|
      launcher
 | 
						|
      groups
 | 
						|
      userns
 | 
						|
      net
 | 
						|
      dev
 | 
						|
      no_new_session
 | 
						|
      map_real_uid
 | 
						|
      direct_wayland
 | 
						|
      system_bus
 | 
						|
      gpu
 | 
						|
      ;
 | 
						|
 | 
						|
    session_bus =
 | 
						|
      if session_bus != null then
 | 
						|
        (session_bus (extendSessionDefault id))
 | 
						|
      else
 | 
						|
        (extendSessionDefault id {
 | 
						|
          talk = [ ];
 | 
						|
          own = [ ];
 | 
						|
          call = { };
 | 
						|
          broadcast = { };
 | 
						|
        });
 | 
						|
 | 
						|
    enablements = {
 | 
						|
      wayland = allow_wayland;
 | 
						|
      x11 = allow_x11;
 | 
						|
      dbus = allow_dbus;
 | 
						|
      pulse = allow_pulse;
 | 
						|
    };
 | 
						|
 | 
						|
    mesa = if gpu then mesaWrappers else null;
 | 
						|
    nix_gl = if gpu then nixGL else null;
 | 
						|
    current_system = nixos.config.system.build.toplevel;
 | 
						|
    activation_package = homeManagerConfiguration.activationPackage;
 | 
						|
  };
 | 
						|
in
 | 
						|
 | 
						|
stdenv.mkDerivation {
 | 
						|
  name = "${pname}.pkg";
 | 
						|
  inherit version;
 | 
						|
  __structuredAttrs = true;
 | 
						|
 | 
						|
  nativeBuildInputs = [
 | 
						|
    zstd
 | 
						|
    nix
 | 
						|
    sqlite
 | 
						|
  ];
 | 
						|
 | 
						|
  buildCommand = ''
 | 
						|
    NIX_ROOT="$(mktemp -d)"
 | 
						|
    export USER="nobody"
 | 
						|
 | 
						|
    # create bootstrap store
 | 
						|
    bootstrapClosureInfo="${
 | 
						|
      closureInfo {
 | 
						|
        rootPaths = [
 | 
						|
          nix
 | 
						|
          nixos.config.system.build.toplevel
 | 
						|
        ];
 | 
						|
      }
 | 
						|
    }"
 | 
						|
    echo "copying bootstrap store paths..."
 | 
						|
    mkdir -p "$NIX_ROOT/nix/store"
 | 
						|
    xargs -n 1 -a "$bootstrapClosureInfo/store-paths" cp -at "$NIX_ROOT/nix/store/"
 | 
						|
    NIX_REMOTE="local?root=$NIX_ROOT" nix-store --load-db < "$bootstrapClosureInfo/registration"
 | 
						|
    NIX_REMOTE="local?root=$NIX_ROOT" nix-store --optimise
 | 
						|
    sqlite3 "$NIX_ROOT/nix/var/nix/db/db.sqlite" "UPDATE ValidPaths SET registrationTime = ''${SOURCE_DATE_EPOCH}"
 | 
						|
    chmod -R +r "$NIX_ROOT/nix/var"
 | 
						|
 | 
						|
    # create binary cache
 | 
						|
    closureInfo="${
 | 
						|
      closureInfo {
 | 
						|
        rootPaths = [
 | 
						|
          homeManagerConfiguration.activationPackage
 | 
						|
          launcher
 | 
						|
        ]
 | 
						|
        ++ optionals gpu [
 | 
						|
          mesaWrappers
 | 
						|
          nixGL
 | 
						|
        ];
 | 
						|
      }
 | 
						|
    }"
 | 
						|
    echo "copying application paths..."
 | 
						|
    TMP_STORE="$(mktemp -d)"
 | 
						|
    mkdir -p "$TMP_STORE/nix/store"
 | 
						|
    xargs -n 1 -a "$closureInfo/store-paths" cp -at "$TMP_STORE/nix/store/"
 | 
						|
    NIX_REMOTE="local?root=$TMP_STORE" nix-store --load-db < "$closureInfo/registration"
 | 
						|
    sqlite3 "$TMP_STORE/nix/var/nix/db/db.sqlite" "UPDATE ValidPaths SET registrationTime = ''${SOURCE_DATE_EPOCH}"
 | 
						|
    NIX_REMOTE="local?root=$TMP_STORE" nix --offline --extra-experimental-features nix-command \
 | 
						|
        --verbose --log-format raw-with-logs \
 | 
						|
        copy --all --no-check-sigs --to \
 | 
						|
        "file://$NIX_ROOT/res?compression=zstd&compression-level=19¶llel-compression=true"
 | 
						|
 | 
						|
    # package /etc
 | 
						|
    mkdir -p "$NIX_ROOT/etc"
 | 
						|
    tar -C "$NIX_ROOT/etc" -xf "${etc}/etc.tar"
 | 
						|
 | 
						|
    # write metadata
 | 
						|
    cp "${writeText "bundle.json" info}" "$NIX_ROOT/bundle.json"
 | 
						|
 | 
						|
    # create an intermediate file to improve zstd performance
 | 
						|
    INTER="$(mktemp)"
 | 
						|
    tar -C "$NIX_ROOT" -cf "$INTER" .
 | 
						|
    zstd -T0 -19 -fo "$out" "$INTER"
 | 
						|
  '';
 | 
						|
}
 |