atagen

monolith

public
Star0
Watch0
3c5663c16f2adce9f39645a90b08bb61d91094b9
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git

Blame: flake.nix

57f44a63d99fatagen2026-10-16 05:34 UTC1
{
57f44a63d99fatagen2026-10-16 05:34 UTC2
  inputs = {
57f44a63d99fatagen2026-10-16 05:34 UTC3
    nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
57f44a63d99fatagen2026-10-16 05:34 UTC4
    crane.url = "github:ipetkov/crane";
57f44a63d99fatagen2026-10-16 05:34 UTC5
  };
57f44a63d99fatagen2026-10-16 05:34 UTC6
57f44a63d99fatagen2026-10-16 05:34 UTC7
  outputs =
57f44a63d99fatagen2026-10-16 05:34 UTC8
    {
57f44a63d99fatagen2026-10-16 05:34 UTC9
      self,
57f44a63d99fatagen2026-10-16 05:34 UTC10
      nixpkgs,
57f44a63d99fatagen2026-10-16 05:34 UTC11
      crane,
57f44a63d99fatagen2026-10-16 05:34 UTC12
    }:
57f44a63d99fatagen2026-10-16 05:34 UTC13
    let
57f44a63d99fatagen2026-10-16 05:34 UTC14
      lib = nixpkgs.lib;
57f44a63d99fatagen2026-10-16 05:34 UTC15
      systems = [
57f44a63d99fatagen2026-10-16 05:34 UTC16
        "x86_64-linux"
57f44a63d99fatagen2026-10-16 05:34 UTC17
        "aarch64-linux"
57f44a63d99fatagen2026-10-16 05:34 UTC18
      ];
57f44a63d99fatagen2026-10-16 05:34 UTC19
      forAllSystems = f: lib.genAttrs systems (system: f nixpkgs.legacyPackages.${system});
57f44a63d99fatagen2026-10-16 05:34 UTC20
57f44a63d99fatagen2026-10-16 05:34 UTC21
      mkProject =
57f44a63d99fatagen2026-10-16 05:34 UTC22
        pkgs:
57f44a63d99fatagen2026-10-16 05:34 UTC23
        let
57f44a63d99fatagen2026-10-16 05:34 UTC24
          craneLib = crane.mkLib pkgs;
824bf02b6e55atagen2026-10-16 09:15 UTC25
          src = lib.cleanSourceWith {
824bf02b6e55atagen2026-10-16 09:15 UTC26
            src = ./.;
e1a086bc100datagen2026-10-17 06:25 UTC27
            filter =
e1a086bc100datagen2026-10-17 06:25 UTC28
              path: type:
e1a086bc100datagen2026-10-17 06:25 UTC29
              (craneLib.filterCargoSources path type) || lib.hasInfix "/shaders" path || lib.hasInfix "/res" path;
824bf02b6e55atagen2026-10-16 09:15 UTC30
            name = "source";
824bf02b6e55atagen2026-10-16 09:15 UTC31
          };
57f44a63d99fatagen2026-10-16 05:34 UTC32
          lavapipeIcd = "${pkgs.mesa}/share/vulkan/icd.d/lvp_icd.${pkgs.stdenv.hostPlatform.parsed.cpu.name}.json";
57f44a63d99fatagen2026-10-16 05:34 UTC33
          commonArgs = {
57f44a63d99fatagen2026-10-16 05:34 UTC34
            inherit src;
b563d2da1c80atagen2026-10-16 08:25 UTC35
            pname = "monolith";
b563d2da1c80atagen2026-10-16 08:25 UTC36
            version = "0.0.0";
57f44a63d99fatagen2026-10-16 05:34 UTC37
            strictDeps = true;
824bf02b6e55atagen2026-10-16 09:15 UTC38
            nativeBuildInputs = [
824bf02b6e55atagen2026-10-16 09:15 UTC39
              pkgs.pkg-config
824bf02b6e55atagen2026-10-16 09:15 UTC40
              pkgs.glslang
824bf02b6e55atagen2026-10-16 09:15 UTC41
            ];
57f44a63d99fatagen2026-10-16 05:34 UTC42
            buildInputs = with pkgs; [
57f44a63d99fatagen2026-10-16 05:34 UTC43
              libxkbcommon
57f44a63d99fatagen2026-10-16 05:34 UTC44
              vulkan-loader
0c1685f1d412atagen2026-10-16 12:18 UTC45
              libinput
0c1685f1d412atagen2026-10-16 12:18 UTC46
              seatd
0c1685f1d412atagen2026-10-16 12:18 UTC47
              libgbm
0c1685f1d412atagen2026-10-16 12:18 UTC48
              libdrm
0c1685f1d412atagen2026-10-16 12:18 UTC49
              udev
5d5ec436eb31atagen2026-10-19 08:38 UTC50
              dbus
57f44a63d99fatagen2026-10-16 05:34 UTC51
            ];
57f44a63d99fatagen2026-10-16 05:34 UTC52
          };
57f44a63d99fatagen2026-10-16 05:34 UTC53
          cargoArtifacts = craneLib.buildDepsOnly commonArgs;
57f44a63d99fatagen2026-10-16 05:34 UTC54
        in
57f44a63d99fatagen2026-10-16 05:34 UTC55
        {
57f44a63d99fatagen2026-10-16 05:34 UTC56
          inherit craneLib lavapipeIcd commonArgs;
57f44a63d99fatagen2026-10-16 05:34 UTC57
57f44a63d99fatagen2026-10-16 05:34 UTC58
          package = craneLib.buildPackage (
57f44a63d99fatagen2026-10-16 05:34 UTC59
            commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC60
            // {
57f44a63d99fatagen2026-10-16 05:34 UTC61
              inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC62
              doCheck = false;
14c8fedad3a3atagen2026-10-16 22:30 UTC63
              postInstall = ''
14c8fedad3a3atagen2026-10-16 22:30 UTC64
                install -Dm644 res/monolith-portals.conf -t $out/share/xdg-desktop-portal
14c8fedad3a3atagen2026-10-16 22:30 UTC65
                install -Dm644 res/monolith.desktop -t $out/share/wayland-sessions
14c8fedad3a3atagen2026-10-16 22:30 UTC66
              '';
e1a086bc100datagen2026-10-17 06:25 UTC67
              # ash opens libvulkan at runtime, so it is not in the linked rpath.
e1a086bc100datagen2026-10-17 06:25 UTC68
              postFixup = ''
e1a086bc100datagen2026-10-17 06:25 UTC69
                patchelf --add-rpath ${lib.makeLibraryPath [ pkgs.vulkan-loader ]} $out/bin/monolith
e1a086bc100datagen2026-10-17 06:25 UTC70
              '';
e1a086bc100datagen2026-10-17 06:25 UTC71
              passthru.providedSessions = [ "monolith" ];
e1a086bc100datagen2026-10-17 06:25 UTC72
              meta = {
e1a086bc100datagen2026-10-17 06:25 UTC73
                description = "A tiling Wayland compositor";
e1a086bc100datagen2026-10-17 06:25 UTC74
                license = lib.licenses.eupl12;
e1a086bc100datagen2026-10-17 06:25 UTC75
                platforms = lib.platforms.linux;
e1a086bc100datagen2026-10-17 06:25 UTC76
                mainProgram = "monolith";
e1a086bc100datagen2026-10-17 06:25 UTC77
              };
57f44a63d99fatagen2026-10-16 05:34 UTC78
            }
57f44a63d99fatagen2026-10-16 05:34 UTC79
          );
57f44a63d99fatagen2026-10-16 05:34 UTC80
57f44a63d99fatagen2026-10-16 05:34 UTC81
          checks = {
57f44a63d99fatagen2026-10-16 05:34 UTC82
            clippy = craneLib.cargoClippy (
57f44a63d99fatagen2026-10-16 05:34 UTC83
              commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC84
              // {
57f44a63d99fatagen2026-10-16 05:34 UTC85
                inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC86
                cargoClippyExtraArgs = "--all-targets -- --deny warnings";
57f44a63d99fatagen2026-10-16 05:34 UTC87
              }
57f44a63d99fatagen2026-10-16 05:34 UTC88
            );
e1a086bc100datagen2026-10-17 06:25 UTC89
            fmt = craneLib.cargoFmt {
e1a086bc100datagen2026-10-17 06:25 UTC90
              inherit src;
e1a086bc100datagen2026-10-17 06:25 UTC91
              pname = "monolith";
e1a086bc100datagen2026-10-17 06:25 UTC92
              version = "0.0.0";
e1a086bc100datagen2026-10-17 06:25 UTC93
            };
57f44a63d99fatagen2026-10-16 05:34 UTC94
            test = craneLib.cargoTest (
57f44a63d99fatagen2026-10-16 05:34 UTC95
              commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC96
              // {
57f44a63d99fatagen2026-10-16 05:34 UTC97
                inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC98
                VK_DRIVER_FILES = lavapipeIcd;
824bf02b6e55atagen2026-10-16 09:15 UTC99
                LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ];
57f44a63d99fatagen2026-10-16 05:34 UTC100
              }
57f44a63d99fatagen2026-10-16 05:34 UTC101
            );
57f44a63d99fatagen2026-10-16 05:34 UTC102
          };
57f44a63d99fatagen2026-10-16 05:34 UTC103
        };
e1a086bc100datagen2026-10-17 06:25 UTC104
      nixosModule =
e1a086bc100datagen2026-10-17 06:25 UTC105
        {
e1a086bc100datagen2026-10-17 06:25 UTC106
          config,
e1a086bc100datagen2026-10-17 06:25 UTC107
          lib,
e1a086bc100datagen2026-10-17 06:25 UTC108
          pkgs,
e1a086bc100datagen2026-10-17 06:25 UTC109
          ...
e1a086bc100datagen2026-10-17 06:25 UTC110
        }:
e1a086bc100datagen2026-10-17 06:25 UTC111
        let
e1a086bc100datagen2026-10-17 06:25 UTC112
          inherit (lib)
e1a086bc100datagen2026-10-17 06:25 UTC113
            getExe
e1a086bc100datagen2026-10-17 06:25 UTC114
            literalExpression
e1a086bc100datagen2026-10-17 06:25 UTC115
            mkDefault
e1a086bc100datagen2026-10-17 06:25 UTC116
            mkEnableOption
e1a086bc100datagen2026-10-17 06:25 UTC117
            mkIf
e1a086bc100datagen2026-10-17 06:25 UTC118
            mkOption
e1a086bc100datagen2026-10-17 06:25 UTC119
            optional
e1a086bc100datagen2026-10-17 06:25 UTC120
            types
e1a086bc100datagen2026-10-17 06:25 UTC121
            ;
e1a086bc100datagen2026-10-17 06:25 UTC122
e1a086bc100datagen2026-10-17 06:25 UTC123
          cfg = config.programs.monolith;
e1a086bc100datagen2026-10-17 06:25 UTC124
        in
e1a086bc100datagen2026-10-17 06:25 UTC125
        {
e1a086bc100datagen2026-10-17 06:25 UTC126
          options.programs.monolith = {
e1a086bc100datagen2026-10-17 06:25 UTC127
            enable = mkEnableOption "monolith, a tiling Wayland compositor";
e1a086bc100datagen2026-10-17 06:25 UTC128
e1a086bc100datagen2026-10-17 06:25 UTC129
            package = mkOption {
e1a086bc100datagen2026-10-17 06:25 UTC130
              type = types.package;
e1a086bc100datagen2026-10-17 06:25 UTC131
              default = (mkProject pkgs).package;
e1a086bc100datagen2026-10-17 06:25 UTC132
              defaultText = literalExpression "monolith.packages.\${system}.default";
e1a086bc100datagen2026-10-17 06:25 UTC133
              description = "The monolith package to use.";
e1a086bc100datagen2026-10-17 06:25 UTC134
            };
e1a086bc100datagen2026-10-17 06:25 UTC135
e1a086bc100datagen2026-10-17 06:25 UTC136
            realtime-scheduling = mkOption {
e1a086bc100datagen2026-10-17 06:25 UTC137
              type = types.bool;
e1a086bc100datagen2026-10-17 06:25 UTC138
              default = true;
e1a086bc100datagen2026-10-17 06:25 UTC139
              description = ''
e1a086bc100datagen2026-10-17 06:25 UTC140
                Wrap the monolith binary with CAP_SYS_NICE so its compositor thread runs
e1a086bc100datagen2026-10-17 06:25 UTC141
                SCHED_RR and its Vulkan queue gets realtime global priority. monolith clears
e1a086bc100datagen2026-10-17 06:25 UTC142
                the capability from everything it launches.
e1a086bc100datagen2026-10-17 06:25 UTC143
              '';
e1a086bc100datagen2026-10-17 06:25 UTC144
            };
e1a086bc100datagen2026-10-17 06:25 UTC145
e1a086bc100datagen2026-10-17 06:25 UTC146
            xwayland.enable = mkEnableOption "Xwayland, started on the first X11 client" // {
e1a086bc100datagen2026-10-17 06:25 UTC147
              default = true;
e1a086bc100datagen2026-10-17 06:25 UTC148
            };
e1a086bc100datagen2026-10-17 06:25 UTC149
          };
e1a086bc100datagen2026-10-17 06:25 UTC150
e1a086bc100datagen2026-10-17 06:25 UTC151
          config = mkIf cfg.enable {
3b180fd69834atagen2026-10-17 10:40 UTC152
            environment.systemPackages = optional (!cfg.realtime-scheduling) cfg.package;
e1a086bc100datagen2026-10-17 06:25 UTC153
e1a086bc100datagen2026-10-17 06:25 UTC154
            programs = {
e1a086bc100datagen2026-10-17 06:25 UTC155
              dconf.enable = mkDefault true;
e1a086bc100datagen2026-10-17 06:25 UTC156
              xwayland.enable = mkIf cfg.xwayland.enable (mkDefault true);
e1a086bc100datagen2026-10-17 06:25 UTC157
            };
e1a086bc100datagen2026-10-17 06:25 UTC158
e1a086bc100datagen2026-10-17 06:25 UTC159
            security = {
e1a086bc100datagen2026-10-17 06:25 UTC160
              polkit.enable = true;
e1a086bc100datagen2026-10-17 06:25 UTC161
              pam.services.swaylock = { };
e1a086bc100datagen2026-10-17 06:25 UTC162
e1a086bc100datagen2026-10-17 06:25 UTC163
              wrappers = mkIf cfg.realtime-scheduling {
e1a086bc100datagen2026-10-17 06:25 UTC164
                monolith = {
e1a086bc100datagen2026-10-17 06:25 UTC165
                  owner = "root";
e1a086bc100datagen2026-10-17 06:25 UTC166
                  group = "root";
e1a086bc100datagen2026-10-17 06:25 UTC167
                  permissions = "a+rx";
e1a086bc100datagen2026-10-17 06:25 UTC168
                  source = getExe cfg.package;
e1a086bc100datagen2026-10-17 06:25 UTC169
                  capabilities = "cap_sys_nice+p";
e1a086bc100datagen2026-10-17 06:25 UTC170
                };
e1a086bc100datagen2026-10-17 06:25 UTC171
              };
e1a086bc100datagen2026-10-17 06:25 UTC172
            };
e1a086bc100datagen2026-10-17 06:25 UTC173
e1a086bc100datagen2026-10-17 06:25 UTC174
            xdg.portal = {
e1a086bc100datagen2026-10-17 06:25 UTC175
              enable = mkDefault true;
e1a086bc100datagen2026-10-17 06:25 UTC176
              configPackages = mkDefault [ cfg.package ];
e1a086bc100datagen2026-10-17 06:25 UTC177
              extraPortals = [
e1a086bc100datagen2026-10-17 06:25 UTC178
                pkgs.xdg-desktop-portal-gtk
e1a086bc100datagen2026-10-17 06:25 UTC179
                pkgs.xdg-desktop-portal-wlr
e1a086bc100datagen2026-10-17 06:25 UTC180
              ];
e1a086bc100datagen2026-10-17 06:25 UTC181
            };
e1a086bc100datagen2026-10-17 06:25 UTC182
e1a086bc100datagen2026-10-17 06:25 UTC183
            services.displayManager.sessionPackages = [ cfg.package ];
e1a086bc100datagen2026-10-17 06:25 UTC184
          };
e1a086bc100datagen2026-10-17 06:25 UTC185
        };
57f44a63d99fatagen2026-10-16 05:34 UTC186
    in
57f44a63d99fatagen2026-10-16 05:34 UTC187
    {
57f44a63d99fatagen2026-10-16 05:34 UTC188
      packages = forAllSystems (pkgs: {
57f44a63d99fatagen2026-10-16 05:34 UTC189
        default = (mkProject pkgs).package;
57f44a63d99fatagen2026-10-16 05:34 UTC190
      });
57f44a63d99fatagen2026-10-16 05:34 UTC191
e1a086bc100datagen2026-10-17 06:25 UTC192
      overlays.default = final: _: { monolith = (mkProject final).package; };
e1a086bc100datagen2026-10-17 06:25 UTC193
e1a086bc100datagen2026-10-17 06:25 UTC194
      nixosModules.default = nixosModule;
e1a086bc100datagen2026-10-17 06:25 UTC195
57f44a63d99fatagen2026-10-16 05:34 UTC196
      checks = forAllSystems (pkgs: (mkProject pkgs).checks);
57f44a63d99fatagen2026-10-16 05:34 UTC197
57f44a63d99fatagen2026-10-16 05:34 UTC198
      devShells = forAllSystems (
57f44a63d99fatagen2026-10-16 05:34 UTC199
        pkgs:
57f44a63d99fatagen2026-10-16 05:34 UTC200
        let
57f44a63d99fatagen2026-10-16 05:34 UTC201
          project = mkProject pkgs;
57f44a63d99fatagen2026-10-16 05:34 UTC202
        in
57f44a63d99fatagen2026-10-16 05:34 UTC203
        {
57f44a63d99fatagen2026-10-16 05:34 UTC204
          default = project.craneLib.devShell {
57f44a63d99fatagen2026-10-16 05:34 UTC205
            inputsFrom = [ project.package ];
57f44a63d99fatagen2026-10-16 05:34 UTC206
            packages = with pkgs; [
57f44a63d99fatagen2026-10-16 05:34 UTC207
              rust-analyzer
57f44a63d99fatagen2026-10-16 05:34 UTC208
              vulkan-tools
57f44a63d99fatagen2026-10-16 05:34 UTC209
              vulkan-validation-layers
57f44a63d99fatagen2026-10-16 05:34 UTC210
              tracy
57f44a63d99fatagen2026-10-16 05:34 UTC211
            ];
57f44a63d99fatagen2026-10-16 05:34 UTC212
            LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ];
57f44a63d99fatagen2026-10-16 05:34 UTC213
            LAVAPIPE_ICD = project.lavapipeIcd;
57f44a63d99fatagen2026-10-16 05:34 UTC214
          };
57f44a63d99fatagen2026-10-16 05:34 UTC215
        }
57f44a63d99fatagen2026-10-16 05:34 UTC216
      );
57f44a63d99fatagen2026-10-16 05:34 UTC217
57f44a63d99fatagen2026-10-16 05:34 UTC218
      formatter = forAllSystems (pkgs: pkgs.nixfmt);
57f44a63d99fatagen2026-10-16 05:34 UTC219
    };
57f44a63d99fatagen2026-10-16 05:34 UTC220
}