atagen

monolith

public
Star0
Watch0
00c7b3db8a3f65597c960f1d27c0b583cde9e793
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
57f44a63d99fatagen2026-10-16 05:34 UTC50
            ];
57f44a63d99fatagen2026-10-16 05:34 UTC51
          };
57f44a63d99fatagen2026-10-16 05:34 UTC52
          cargoArtifacts = craneLib.buildDepsOnly commonArgs;
57f44a63d99fatagen2026-10-16 05:34 UTC53
        in
57f44a63d99fatagen2026-10-16 05:34 UTC54
        {
57f44a63d99fatagen2026-10-16 05:34 UTC55
          inherit craneLib lavapipeIcd commonArgs;
57f44a63d99fatagen2026-10-16 05:34 UTC56
57f44a63d99fatagen2026-10-16 05:34 UTC57
          package = craneLib.buildPackage (
57f44a63d99fatagen2026-10-16 05:34 UTC58
            commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC59
            // {
57f44a63d99fatagen2026-10-16 05:34 UTC60
              inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC61
              doCheck = false;
14c8fedad3a3atagen2026-10-16 22:30 UTC62
              postInstall = ''
14c8fedad3a3atagen2026-10-16 22:30 UTC63
                install -Dm644 res/monolith-portals.conf -t $out/share/xdg-desktop-portal
14c8fedad3a3atagen2026-10-16 22:30 UTC64
                install -Dm644 res/monolith.desktop -t $out/share/wayland-sessions
14c8fedad3a3atagen2026-10-16 22:30 UTC65
              '';
e1a086bc100datagen2026-10-17 06:25 UTC66
              # ash opens libvulkan at runtime, so it is not in the linked rpath.
e1a086bc100datagen2026-10-17 06:25 UTC67
              postFixup = ''
e1a086bc100datagen2026-10-17 06:25 UTC68
                patchelf --add-rpath ${lib.makeLibraryPath [ pkgs.vulkan-loader ]} $out/bin/monolith
e1a086bc100datagen2026-10-17 06:25 UTC69
              '';
e1a086bc100datagen2026-10-17 06:25 UTC70
              passthru.providedSessions = [ "monolith" ];
e1a086bc100datagen2026-10-17 06:25 UTC71
              meta = {
e1a086bc100datagen2026-10-17 06:25 UTC72
                description = "A tiling Wayland compositor";
e1a086bc100datagen2026-10-17 06:25 UTC73
                license = lib.licenses.eupl12;
e1a086bc100datagen2026-10-17 06:25 UTC74
                platforms = lib.platforms.linux;
e1a086bc100datagen2026-10-17 06:25 UTC75
                mainProgram = "monolith";
e1a086bc100datagen2026-10-17 06:25 UTC76
              };
57f44a63d99fatagen2026-10-16 05:34 UTC77
            }
57f44a63d99fatagen2026-10-16 05:34 UTC78
          );
57f44a63d99fatagen2026-10-16 05:34 UTC79
57f44a63d99fatagen2026-10-16 05:34 UTC80
          checks = {
57f44a63d99fatagen2026-10-16 05:34 UTC81
            clippy = craneLib.cargoClippy (
57f44a63d99fatagen2026-10-16 05:34 UTC82
              commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC83
              // {
57f44a63d99fatagen2026-10-16 05:34 UTC84
                inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC85
                cargoClippyExtraArgs = "--all-targets -- --deny warnings";
57f44a63d99fatagen2026-10-16 05:34 UTC86
              }
57f44a63d99fatagen2026-10-16 05:34 UTC87
            );
e1a086bc100datagen2026-10-17 06:25 UTC88
            fmt = craneLib.cargoFmt {
e1a086bc100datagen2026-10-17 06:25 UTC89
              inherit src;
e1a086bc100datagen2026-10-17 06:25 UTC90
              pname = "monolith";
e1a086bc100datagen2026-10-17 06:25 UTC91
              version = "0.0.0";
e1a086bc100datagen2026-10-17 06:25 UTC92
            };
57f44a63d99fatagen2026-10-16 05:34 UTC93
            test = craneLib.cargoTest (
57f44a63d99fatagen2026-10-16 05:34 UTC94
              commonArgs
57f44a63d99fatagen2026-10-16 05:34 UTC95
              // {
57f44a63d99fatagen2026-10-16 05:34 UTC96
                inherit cargoArtifacts;
57f44a63d99fatagen2026-10-16 05:34 UTC97
                VK_DRIVER_FILES = lavapipeIcd;
824bf02b6e55atagen2026-10-16 09:15 UTC98
                LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ];
57f44a63d99fatagen2026-10-16 05:34 UTC99
              }
57f44a63d99fatagen2026-10-16 05:34 UTC100
            );
57f44a63d99fatagen2026-10-16 05:34 UTC101
          };
57f44a63d99fatagen2026-10-16 05:34 UTC102
        };
e1a086bc100datagen2026-10-17 06:25 UTC103
      nixosModule =
e1a086bc100datagen2026-10-17 06:25 UTC104
        {
e1a086bc100datagen2026-10-17 06:25 UTC105
          config,
e1a086bc100datagen2026-10-17 06:25 UTC106
          lib,
e1a086bc100datagen2026-10-17 06:25 UTC107
          pkgs,
e1a086bc100datagen2026-10-17 06:25 UTC108
          ...
e1a086bc100datagen2026-10-17 06:25 UTC109
        }:
e1a086bc100datagen2026-10-17 06:25 UTC110
        let
e1a086bc100datagen2026-10-17 06:25 UTC111
          inherit (lib)
e1a086bc100datagen2026-10-17 06:25 UTC112
            getExe
e1a086bc100datagen2026-10-17 06:25 UTC113
            literalExpression
e1a086bc100datagen2026-10-17 06:25 UTC114
            mkDefault
e1a086bc100datagen2026-10-17 06:25 UTC115
            mkEnableOption
e1a086bc100datagen2026-10-17 06:25 UTC116
            mkIf
e1a086bc100datagen2026-10-17 06:25 UTC117
            mkOption
e1a086bc100datagen2026-10-17 06:25 UTC118
            optional
e1a086bc100datagen2026-10-17 06:25 UTC119
            types
e1a086bc100datagen2026-10-17 06:25 UTC120
            ;
e1a086bc100datagen2026-10-17 06:25 UTC121
e1a086bc100datagen2026-10-17 06:25 UTC122
          cfg = config.programs.monolith;
e1a086bc100datagen2026-10-17 06:25 UTC123
        in
e1a086bc100datagen2026-10-17 06:25 UTC124
        {
e1a086bc100datagen2026-10-17 06:25 UTC125
          options.programs.monolith = {
e1a086bc100datagen2026-10-17 06:25 UTC126
            enable = mkEnableOption "monolith, a tiling Wayland compositor";
e1a086bc100datagen2026-10-17 06:25 UTC127
e1a086bc100datagen2026-10-17 06:25 UTC128
            package = mkOption {
e1a086bc100datagen2026-10-17 06:25 UTC129
              type = types.package;
e1a086bc100datagen2026-10-17 06:25 UTC130
              default = (mkProject pkgs).package;
e1a086bc100datagen2026-10-17 06:25 UTC131
              defaultText = literalExpression "monolith.packages.\${system}.default";
e1a086bc100datagen2026-10-17 06:25 UTC132
              description = "The monolith package to use.";
e1a086bc100datagen2026-10-17 06:25 UTC133
            };
e1a086bc100datagen2026-10-17 06:25 UTC134
e1a086bc100datagen2026-10-17 06:25 UTC135
            realtime-scheduling = mkOption {
e1a086bc100datagen2026-10-17 06:25 UTC136
              type = types.bool;
e1a086bc100datagen2026-10-17 06:25 UTC137
              default = true;
e1a086bc100datagen2026-10-17 06:25 UTC138
              description = ''
e1a086bc100datagen2026-10-17 06:25 UTC139
                Wrap the monolith binary with CAP_SYS_NICE so its compositor thread runs
e1a086bc100datagen2026-10-17 06:25 UTC140
                SCHED_RR and its Vulkan queue gets realtime global priority. monolith clears
e1a086bc100datagen2026-10-17 06:25 UTC141
                the capability from everything it launches.
e1a086bc100datagen2026-10-17 06:25 UTC142
              '';
e1a086bc100datagen2026-10-17 06:25 UTC143
            };
e1a086bc100datagen2026-10-17 06:25 UTC144
e1a086bc100datagen2026-10-17 06:25 UTC145
            xwayland.enable = mkEnableOption "Xwayland, started on the first X11 client" // {
e1a086bc100datagen2026-10-17 06:25 UTC146
              default = true;
e1a086bc100datagen2026-10-17 06:25 UTC147
            };
e1a086bc100datagen2026-10-17 06:25 UTC148
          };
e1a086bc100datagen2026-10-17 06:25 UTC149
e1a086bc100datagen2026-10-17 06:25 UTC150
          config = mkIf cfg.enable {
3b180fd69834atagen2026-10-17 10:40 UTC151
            environment.systemPackages = optional (!cfg.realtime-scheduling) cfg.package;
e1a086bc100datagen2026-10-17 06:25 UTC152
e1a086bc100datagen2026-10-17 06:25 UTC153
            programs = {
e1a086bc100datagen2026-10-17 06:25 UTC154
              dconf.enable = mkDefault true;
e1a086bc100datagen2026-10-17 06:25 UTC155
              xwayland.enable = mkIf cfg.xwayland.enable (mkDefault true);
e1a086bc100datagen2026-10-17 06:25 UTC156
            };
e1a086bc100datagen2026-10-17 06:25 UTC157
e1a086bc100datagen2026-10-17 06:25 UTC158
            security = {
e1a086bc100datagen2026-10-17 06:25 UTC159
              polkit.enable = true;
e1a086bc100datagen2026-10-17 06:25 UTC160
              pam.services.swaylock = { };
e1a086bc100datagen2026-10-17 06:25 UTC161
e1a086bc100datagen2026-10-17 06:25 UTC162
              wrappers = mkIf cfg.realtime-scheduling {
e1a086bc100datagen2026-10-17 06:25 UTC163
                monolith = {
e1a086bc100datagen2026-10-17 06:25 UTC164
                  owner = "root";
e1a086bc100datagen2026-10-17 06:25 UTC165
                  group = "root";
e1a086bc100datagen2026-10-17 06:25 UTC166
                  permissions = "a+rx";
e1a086bc100datagen2026-10-17 06:25 UTC167
                  source = getExe cfg.package;
e1a086bc100datagen2026-10-17 06:25 UTC168
                  capabilities = "cap_sys_nice+p";
e1a086bc100datagen2026-10-17 06:25 UTC169
                };
e1a086bc100datagen2026-10-17 06:25 UTC170
              };
e1a086bc100datagen2026-10-17 06:25 UTC171
            };
e1a086bc100datagen2026-10-17 06:25 UTC172
e1a086bc100datagen2026-10-17 06:25 UTC173
            xdg.portal = {
e1a086bc100datagen2026-10-17 06:25 UTC174
              enable = mkDefault true;
e1a086bc100datagen2026-10-17 06:25 UTC175
              configPackages = mkDefault [ cfg.package ];
e1a086bc100datagen2026-10-17 06:25 UTC176
              extraPortals = [
e1a086bc100datagen2026-10-17 06:25 UTC177
                pkgs.xdg-desktop-portal-gtk
e1a086bc100datagen2026-10-17 06:25 UTC178
                pkgs.xdg-desktop-portal-wlr
e1a086bc100datagen2026-10-17 06:25 UTC179
              ];
e1a086bc100datagen2026-10-17 06:25 UTC180
            };
e1a086bc100datagen2026-10-17 06:25 UTC181
e1a086bc100datagen2026-10-17 06:25 UTC182
            services.displayManager.sessionPackages = [ cfg.package ];
e1a086bc100datagen2026-10-17 06:25 UTC183
          };
e1a086bc100datagen2026-10-17 06:25 UTC184
        };
57f44a63d99fatagen2026-10-16 05:34 UTC185
    in
57f44a63d99fatagen2026-10-16 05:34 UTC186
    {
57f44a63d99fatagen2026-10-16 05:34 UTC187
      packages = forAllSystems (pkgs: {
57f44a63d99fatagen2026-10-16 05:34 UTC188
        default = (mkProject pkgs).package;
57f44a63d99fatagen2026-10-16 05:34 UTC189
      });
57f44a63d99fatagen2026-10-16 05:34 UTC190
e1a086bc100datagen2026-10-17 06:25 UTC191
      overlays.default = final: _: { monolith = (mkProject final).package; };
e1a086bc100datagen2026-10-17 06:25 UTC192
e1a086bc100datagen2026-10-17 06:25 UTC193
      nixosModules.default = nixosModule;
e1a086bc100datagen2026-10-17 06:25 UTC194
57f44a63d99fatagen2026-10-16 05:34 UTC195
      checks = forAllSystems (pkgs: (mkProject pkgs).checks);
57f44a63d99fatagen2026-10-16 05:34 UTC196
57f44a63d99fatagen2026-10-16 05:34 UTC197
      devShells = forAllSystems (
57f44a63d99fatagen2026-10-16 05:34 UTC198
        pkgs:
57f44a63d99fatagen2026-10-16 05:34 UTC199
        let
57f44a63d99fatagen2026-10-16 05:34 UTC200
          project = mkProject pkgs;
57f44a63d99fatagen2026-10-16 05:34 UTC201
        in
57f44a63d99fatagen2026-10-16 05:34 UTC202
        {
57f44a63d99fatagen2026-10-16 05:34 UTC203
          default = project.craneLib.devShell {
57f44a63d99fatagen2026-10-16 05:34 UTC204
            inputsFrom = [ project.package ];
57f44a63d99fatagen2026-10-16 05:34 UTC205
            packages = with pkgs; [
57f44a63d99fatagen2026-10-16 05:34 UTC206
              rust-analyzer
57f44a63d99fatagen2026-10-16 05:34 UTC207
              vulkan-tools
57f44a63d99fatagen2026-10-16 05:34 UTC208
              vulkan-validation-layers
57f44a63d99fatagen2026-10-16 05:34 UTC209
              tracy
57f44a63d99fatagen2026-10-16 05:34 UTC210
            ];
57f44a63d99fatagen2026-10-16 05:34 UTC211
            LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.vulkan-loader ];
57f44a63d99fatagen2026-10-16 05:34 UTC212
            LAVAPIPE_ICD = project.lavapipeIcd;
57f44a63d99fatagen2026-10-16 05:34 UTC213
          };
57f44a63d99fatagen2026-10-16 05:34 UTC214
        }
57f44a63d99fatagen2026-10-16 05:34 UTC215
      );
57f44a63d99fatagen2026-10-16 05:34 UTC216
57f44a63d99fatagen2026-10-16 05:34 UTC217
      formatter = forAllSystems (pkgs: pkgs.nixfmt);
57f44a63d99fatagen2026-10-16 05:34 UTC218
    };
57f44a63d99fatagen2026-10-16 05:34 UTC219
}