commit 2ac6ab0dd50556cfa61ee6899e8a4490367ef6a0 Author: Frank LoTurco Date: Tue Jul 21 13:13:31 2026 -0400 initial commit diff --git a/features/flatpak.nix b/features/flatpak.nix new file mode 100644 index 0000000..6c6d1be --- /dev/null +++ b/features/flatpak.nix @@ -0,0 +1,22 @@ +{ lib, ... }: +{ + services.flatpak = { + enable = true; + + update.auto = { + enable = true; + onCalendar = "weekly"; + }; + + remotes = lib.mkOptionDefault [ + { + name = "flathub"; + location = "https://dl.flathub.org/repo/flathub.flatpakrepo"; + } + { + name = "flathub-beta"; + location = "https://dl.flathub.org/beta-repo/flathub-beta.flatpakrepo"; + } + ]; + }; +} diff --git a/features/kde.nix b/features/kde.nix new file mode 100644 index 0000000..74b28e9 --- /dev/null +++ b/features/kde.nix @@ -0,0 +1,38 @@ +{ + pkgs, + inputs, + ... +}: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; + + kde-overlay = _final: _prev: { + inherit (unstable) kdePackages; + }; + +in +{ + nixpkgs.overlays = [ + kde-overlay + ]; + + services = { + displayManager.plasma-login-manager.enable = true; + desktopManager.plasma6.enable = true; + }; + + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ kdePackages.xdg-desktop-portal-kde ]; + }; + + environment = { + plasma6.excludePackages = with pkgs.kdePackages; [ + plasma-browser-integration + elisa + discover + gwenview + okular + ]; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..5fb57f1 --- /dev/null +++ b/flake.lock @@ -0,0 +1,533 @@ +{ + "nodes": { + "appimage-manager": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1784588196, + "narHash": "sha256-x3OFUpsVlQ6GqMFOcdOzX37BNLKmMcgkd+WkTKyvmQI=", + "owner": "kem-a", + "repo": "AppManager", + "rev": "1398175763c54b49b05f8be19e98bf330b674e88", + "type": "github" + }, + "original": { + "owner": "kem-a", + "repo": "AppManager", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "revCount": 69, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": [ + "nixpkgs-xr", + "systems" + ] + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": [ + "nix-gaming", + "flake-compat" + ], + "nixpkgs": [ + "nix-gaming", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784288435, + "narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784350909, + "narHash": "sha256-ZWyzLbS1yKUTeFJLmdVuWNnHttL333/ldJbEE+KzCrM=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "4ce190229c73d44536caa7072f6308fb2d8feeb3", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-26.05", + "repo": "home-manager", + "type": "github" + } + }, + "i915-sriov-dkms": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1778038228, + "narHash": "sha256-hnZSTWgGRYRXoYWB/r4ViQ4OMJlNEj2SDH8jxxn1vso=", + "owner": "strongtz", + "repo": "i915-sriov-dkms", + "rev": "2421d3ff8c27a967ffc2c6a1d19e0f3790ace5a0", + "type": "github" + }, + "original": { + "owner": "strongtz", + "repo": "i915-sriov-dkms", + "type": "github" + } + }, + "lazyvim": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1780594829, + "narHash": "sha256-uWfhrU3xJzha7DQ+i21NlymE9LDqXYxmAwgk5TPYp2g=", + "owner": "pfassina", + "repo": "lazyvim-nix", + "rev": "4028c6c369881a95efcd6559627cc53ccfd06875", + "type": "github" + }, + "original": { + "owner": "pfassina", + "ref": "v16.0.0", + "repo": "lazyvim-nix", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1783744694, + "narHash": "sha256-2cp6N3rrwnGYLTx9l6N+NI+kwrCWxvJUbj5WJhvB29A=", + "owner": "nix-darwin", + "repo": "nix-darwin", + "rev": "c3e90c89649b07d1a96e4b9dd6cd0d6e44b91a74", + "type": "github" + }, + "original": { + "owner": "nix-darwin", + "ref": "nix-darwin-26.05", + "repo": "nix-darwin", + "type": "github" + } + }, + "nix-flatpak": { + "locked": { + "lastModified": 1767983141, + "narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "440818969ac2cbd77bfe025e884d0aa528991374", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "v0.7.0", + "repo": "nix-flatpak", + "type": "github" + } + }, + "nix-gaming": { + "inputs": { + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "git-hooks": "git-hooks", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1784431599, + "narHash": "sha256-B80p0N3Uqx4+nMl/rFK/SU+1i3UNkAAMP7TaUk1ug20=", + "owner": "fufexan", + "repo": "nix-gaming", + "rev": "1aef499f40964840bf28c8e5a47ac7e8009a7e7e", + "type": "github" + }, + "original": { + "owner": "fufexan", + "repo": "nix-gaming", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1776548001, + "narHash": "sha256-ZSK0NL4a1BwVbbTBoSnWgbJy9HeZFXLYQizjb2DPF24=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b12141ef619e0a9c1c84dc8c684040326f27cdcc", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1782614948, + "narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1784497964, + "narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-xr": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_6", + "nvfetcher": "nvfetcher", + "systems": "systems_2", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1784428803, + "narHash": "sha256-zBWjiZOrNB4PvTzMQY7Ll9RRe3obGFC3egKaxVE9GIs=", + "owner": "nix-community", + "repo": "nixpkgs-xr", + "rev": "28fe56a7bed09a33a82225f5cc48e343c2a5cd04", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs-xr", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1760038930, + "narHash": "sha256-Oncbh0UmHjSlxO7ErQDM3KM0A5/Znfofj2BSzlHLeVw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0b4defa2584313f3b781240b29d61f6f9f7e0df3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1752480373, + "narHash": "sha256-JHQbm+OcGp32wAsXTE/FLYGNpb+4GLi5oTvCxwSoBOA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "62e0f05ede1da0d54515d4ea8ce9c733f12d9f08", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1784364478, + "narHash": "sha256-CdItYNdYUlm7NxqMVyQKqT2IxTwvapiPuRLWOyHTrbY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "20535e48e12c86043b577b8518234ff5dbb26957", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1784432872, + "narHash": "sha256-n3gKTBIV4ZA5VQpUakffBe3KGu4+mhPoA34rrqS0GkA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fd1462031fdee08f65fd0b4c6b64e22239a77870", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { + "locked": { + "lastModified": 1784356753, + "narHash": "sha256-12KrbMiWLcf8m7pCvAtZh1ZrgF85ZXDXvfR/fWTKy84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "61b7c44c4073f0b827768aff0049561b5110ea5a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_7": { + "locked": { + "lastModified": 1784497964, + "narHash": "sha256-vlHUuqAcbcH2RKmHbPiuQzbv1pnzzavXnI62RD0bqCU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "241313f4e8e508cb9b13278c2b0fa25b9ca27163", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nvfetcher": { + "inputs": { + "flake-compat": [ + "nixpkgs-xr", + "flake-compat" + ], + "flake-utils": [ + "nixpkgs-xr", + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs-xr", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1766178214, + "narHash": "sha256-tKDXreDwrRkdjvfot5fr1++ed6oOq3+/hW/Dj8WfTgs=", + "owner": "Red-M", + "repo": "nvfetcher", + "rev": "a84b3ce67f1d7acd85b3aa2b9967ab91ed6e7a71", + "type": "github" + }, + "original": { + "owner": "Red-M", + "repo": "nvfetcher", + "rev": "a84b3ce67f1d7acd85b3aa2b9967ab91ed6e7a71", + "type": "github" + } + }, + "root": { + "inputs": { + "appimage-manager": "appimage-manager", + "home-manager": "home-manager", + "i915-sriov-dkms": "i915-sriov-dkms", + "lazyvim": "lazyvim", + "nix-darwin": "nix-darwin", + "nix-flatpak": "nix-flatpak", + "nix-gaming": "nix-gaming", + "nixpkgs": "nixpkgs_5", + "nixpkgs-unstable": "nixpkgs-unstable", + "nixpkgs-xr": "nixpkgs-xr", + "scopebuddy": "scopebuddy" + } + }, + "scopebuddy": { + "inputs": { + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1772751261, + "narHash": "sha256-3h6N5h9aYumIStx+G7qYZpKTOiMG+tQokjs8c+xuJ2A=", + "owner": "HikariKnight", + "repo": "ScopeBuddy", + "rev": "150051976a2a1e64179edc7265175ba4e5f62f62", + "type": "github" + }, + "original": { + "owner": "HikariKnight", + "repo": "ScopeBuddy", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs-xr", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784369104, + "narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "df3c0640565d04a0261253cdd89fce78ec50168a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..8590794 --- /dev/null +++ b/flake.nix @@ -0,0 +1,99 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; + nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; + + home-manager = { + url = "github:nix-community/home-manager/release-26.05"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + nix-darwin = { + url = "github:nix-darwin/nix-darwin/nix-darwin-26.05"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.7.0"; + appimage-manager.url = "github:kem-a/AppManager"; + + i915-sriov-dkms.url = "github:strongtz/i915-sriov-dkms"; + + lazyvim.url = "github:pfassina/lazyvim-nix/v16.0.0"; + + scopebuddy.url = "github:HikariKnight/ScopeBuddy"; + nix-gaming.url = "github:fufexan/nix-gaming"; + nixpkgs-xr.url = "github:nix-community/nixpkgs-xr"; + }; + + outputs = + inputs@{ + self, + nixpkgs, + nixpkgs-xr, + home-manager, + nix-darwin, + nix-flatpak, + i915-sriov-dkms, + ... + }: + let + home-manager-configuration = { home-manager, ... }: { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; + users.frank = ./home/frank.nix; + }; + }; + in + { + nixosConfigurations = { + nero = nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs; }; + + modules = [ + home-manager.nixosModules.home-manager + home-manager-configuration + + nixpkgs-xr.nixosModules.nixpkgs-xr + nix-flatpak.nixosModules.nix-flatpak + + ./hosts/nero/hardware.nix + ./hosts/nero/configuration.nix + ]; + }; + + pdw-frankiel = nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs; }; + + modules = [ + home-manager.nixosModules.home-manager + home-manager-configuration + + nix-flatpak.nixosModules.nix-flatpak + i915-sriov-dkms.nixosModules.default + + ./hosts/pdw-frankiel/hardware.nix + ./hosts/pdw-frankiel/configuration.nix + ]; + }; + }; + + darwinConfigurations = { + franks-macbook-pro = nix-darwin.lib.darwinSystem { + specialArgs = { inherit inputs; }; + + modules = [ + home-manager.darwinModules.home-manager + home-manager-configuration + + { + users.users.frank.home = "/Users/frank"; + } + + ./hosts/franks-macbook-pro/configuration.nix + ]; + }; + }; + }; +} diff --git a/home/frank.nix b/home/frank.nix new file mode 100644 index 0000000..645f236 --- /dev/null +++ b/home/frank.nix @@ -0,0 +1,133 @@ +{ inputs, pkgs, ... }: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; +in +{ + imports = [ + inputs.lazyvim.homeManagerModules.default + ]; + + programs = { + bash = { + enable = true; + + # Display fastfetch on shell open. + initExtra = '' + clear;fastfetch + ''; + }; + + fastfetch = { + enable = true; + + package = unstable.fastfetch; + + settings = { + modules = [ + "title" + "separator" + "os" + "kernel" + "uptime" + "host" + "localip" + "packages" + "shell" + "terminal" + "wm" + "cpu" + "gpu" + "memory" + "disk" + "break" + ]; + + logo = { + source = "nixos2"; + }; + }; + }; + + ssh = { + enable = true; + enableDefaultConfig = false; + + settings."*" = { + AddKeysToAgent = "yes"; + }; + }; + + lazyvim = { + enable = true; + + config = { + # Enable light mode and configure tabstop + # to two spaces rather than 4. + options = '' + vim.o.background = "light" + vim.opt.tabstop = 2 + vim.opt.shiftwidth = 2 + vim.opt.expandtab = true + ''; + }; + + plugins = { + colorscheme = '' + return { + { + "LazyVim/LazyVim", + opts = { colorscheme = "tokyonight-day" }, + }, + { + "folke/tokyonight.nvim", + lazy = false, + priority = 1000, + opts = { style = "day" }, + }, + } + ''; + }; + + extras = { + lang = { + nix.enable = true; + python.enable = true; + rust.enable = true; + dotnet.enable = true; + }; + }; + + extraPackages = with pkgs; [ + nix + alejandra + statix + ]; + }; + + git = { + enable = true; + lfs.enable = true; + + signing = { + key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ5+RJOhvamBpEptCRv90E+8bVWKn6Mep61wDpPYgKP3 floturcocantsee@daguerro.net"; + signByDefault = true; + }; + + settings = { + init.defaultBranch = "main"; + safe.directory = if pkgs.stdenv.hostPlatform.isDarwin then "/etc/nix-darwin" else "/etc/nixos"; + + user = { + name = "Frank LoTurco"; + email = "floturcocantsee@protonmail.com"; + }; + + gpg = { + format = "ssh"; + }; + }; + }; + }; + + home.stateVersion = "26.05"; +} diff --git a/hosts/franks-macbook-pro/configuration.nix b/hosts/franks-macbook-pro/configuration.nix new file mode 100644 index 0000000..bbc8640 --- /dev/null +++ b/hosts/franks-macbook-pro/configuration.nix @@ -0,0 +1,27 @@ +{ + pkgs, + inputs, + ... +}: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; +in +{ + imports = [ + ../shared/darwin.nix + ]; + + environment.systemPackages = with pkgs; [ + bash-language-server + nil + devenv + ]; + + homebrew.casks = [ + "zed" + "firefox" + ]; + + # Don't touch this unless needed. + system.primaryUser = "frank"; +} diff --git a/hosts/nero/configuration.nix b/hosts/nero/configuration.nix new file mode 100644 index 0000000..c5aad74 --- /dev/null +++ b/hosts/nero/configuration.nix @@ -0,0 +1,104 @@ +{ + pkgs, + inputs, + ... +}: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; +in +{ + imports = [ + ../shared/nixos.nix + ../../features/kde.nix + ../../features/flatpak.nix + ]; + + boot = { + kernelParams = [ + "vfio-pci.ids=10de:2782,10de:22bc" + "video=HDMI-A-1:896x672@100" + ]; + }; + + networking.hostName = "nero"; + + services = { + flatpak = { + packages = [ + { + appId = "com.discordapp.Discord"; + origin = "flathub"; + } + { + appId = "com.github.Matoking.protontricks"; + origin = "flathub"; + } + { + appId = "com.steamgriddb.SGDBoop"; + origin = "flathub"; + } + { + appId = "com.vysp3r.ProtonPlus"; + origin = "flathub"; + } + { + appId = "io.mpv.Mpv"; + origin = "flathub"; + } + { + appId = "org.ghidra_sre.Ghidra"; + origin = "flathub"; + } + { + appId = "io.github.ryubing.Ryujinx"; + origin = "flathub"; + } + { + appId = "org.gtk.Gtk3theme.Breeze"; + origin = "flathub"; + } + rec { + appId = "io.github.Amethyst.ModManager"; + sha256 = "sha256-fpbIpuD6qwVDYJATNjpxLeVxZEBKS6MfK1UV3eS7eAQ="; + + bundle = "${pkgs.fetchurl { + url = "https://github.com/ChrisDKN/Amethyst-Mod-Manager/releases/download/v2.0.2/AmethystModManager.flatpak"; + inherit sha256; + }}"; + } + ]; + }; + + wivrn = { + enable = true; + openFirewall = true; + autoStart = true; + }; + }; + + programs = { + gamemode.enable = true; + + steam = { + enable = true; + remotePlay.openFirewall = true; + extraPackages = [ pkgs.hidapi ]; + }; + }; + + environment = { + systemPackages = with pkgs; [ + qimgv + zathura + mangohud + gamescope + gamescope-wsi + + inputs.scopebuddy.packages.${pkgs.stdenv.hostPlatform.system}.default + + (callPackage ../../packages/xivlauncher/package.nix { }) + (callPackage ../../packages/aseprite/package.nix { }) + (callPackage ../../packages/aseprite-thumbnailer-kde/package.nix { inherit unstable; }) + ]; + }; +} diff --git a/hosts/nero/hardware.nix b/hosts/nero/hardware.nix new file mode 100644 index 0000000..185ee75 --- /dev/null +++ b/hosts/nero/hardware.nix @@ -0,0 +1,66 @@ +{ + config, + lib, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot = { + initrd.availableKernelModules = [ + "nvme" + "ahci" + "xhci_pci" + "usbhid" + "usb_storage" + "sd_mod" + ]; + + initrd.kernelModules = [ ]; + kernelModules = [ "kvm-amd" ]; + extraModulePackages = [ ]; + }; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/7559f03a-28da-482d-934a-5d4f88ab085f"; + fsType = "btrfs"; + }; + + "/home" = { + device = "/dev/disk/by-uuid/7559f03a-28da-482d-934a-5d4f88ab085f"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + "/nix" = { + device = "/dev/disk/by-uuid/7559f03a-28da-482d-934a-5d4f88ab085f"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/12B3-D345"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" + ]; + }; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/431e8332-e3d5-400b-93e7-27b9c8dc1dfe"; } + ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + + hardware = { + bluetooth.enable = true; + cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + }; +} diff --git a/hosts/pdw-frankiel/configuration.nix b/hosts/pdw-frankiel/configuration.nix new file mode 100644 index 0000000..9ba4bc2 --- /dev/null +++ b/hosts/pdw-frankiel/configuration.nix @@ -0,0 +1,112 @@ +{ + pkgs, + inputs, + ... +}: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; +in +{ + imports = [ + ../shared/nixos.nix + ../../features/kde.nix + ../../features/flatpak.nix + ]; + + boot = { + extraModulePackages = [ + pkgs.i915-sriov + ]; + + kernelParams = [ + "intel_iommu=on" + "i915-enable_guc=3" + "i915.max_vfs=1" + "module_blacklist=xe" + ]; + }; + + systemd.tmpfiles.rules = [ + "w /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs - - - - 1" + ]; + + networking.hostName = "pdw-frankiel"; + + services = { + udev.packages = [ + (pkgs.writeTextFile { + name = "i915-sriov"; + + text = '' + ACTION=="add", SUBSYSTEM=="pci", KERNEL=="0000:00:02.[1-7]", ATTR{vendor}=="0x8086", ATTR{device}=="0xa7a0", DRIVER!="vfio-pci", RUN+="/bin/sh -c 'echo \$kernel > /sys/bus/pci/devices/\$kernel/driver/unbind; echo vfio-pci > /sys/bus/pci/devices/\$kernel/driver_override; modprobe vfio-pci; echo \$kernel > /sys/bus/pci/drivers/vfio-pci/bind'" + ''; + + destination = "/etc/udev/rules.d/80-i915-sriov.rules"; + }) + ]; + + printing.enable = true; + + keyd = { + enable = true; + + keyboards = { + default = { + ids = [ "*" ]; + + settings = { + main = { + capslock = "oneshot(control)"; + insert = "S-insert"; + }; + }; + }; + }; + }; + + flatpak = { + packages = [ + { + appId = "com.dropbox.Client"; + origin = "flathub"; + } + { + appId = "io.mpv.Mpv"; + origin = "flathub"; + } + { + appId = "org.gnome.gitlab.YaLTeR.VideoTrimmer"; + origin = "flathub"; + } + { + appId = "org.kde.kdenlive"; + origin = "flathub"; + } + { + appId = "org.remmina.Remmina"; + origin = "flathub"; + } + { + appId = "io.github.ungoogled_software.ungoogled_chromium"; + origin = "flathub"; + } + { + appId = "org.gtk.Gtk3theme.Breeze"; + origin = "flathub"; + } + ]; + }; + }; + + environment = { + systemPackages = with pkgs; [ + qimgv + zathura + hunspell + hunspellDicts.en_US + hyphenDicts.en_US + + unstable.libreoffice-qt + ]; + }; +} diff --git a/hosts/pdw-frankiel/hardware.nix b/hosts/pdw-frankiel/hardware.nix new file mode 100644 index 0000000..67a4485 --- /dev/null +++ b/hosts/pdw-frankiel/hardware.nix @@ -0,0 +1,69 @@ +{ + config, + lib, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot = { + initrd.availableKernelModules = [ + "xhci_pci" + "thunderbolt" + "ahci" + "nvme" + "usbhid" + "usb_storage" + "sd_mod" + ]; + + initrd.kernelModules = [ ]; + + kernelModules = [ "kvm-intel" ]; + + extraModulePackages = [ ]; + }; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/2b88fa45-f012-4df6-b59c-5b45ee0fc6e8"; + fsType = "btrfs"; + }; + + "/home" = { + device = "/dev/disk/by-uuid/2b88fa45-f012-4df6-b59c-5b45ee0fc6e8"; + fsType = "btrfs"; + options = [ "subvol=home" ]; + }; + + "/nix" = { + device = "/dev/disk/by-uuid/2b88fa45-f012-4df6-b59c-5b45ee0fc6e8"; + fsType = "btrfs"; + options = [ "subvol=nix" ]; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/679B-3FC0"; + fsType = "vfat"; + options = [ + "fmask=0077" + "dmask=0077" + ]; + }; + }; + + swapDevices = [ + { device = "/dev/disk/by-uuid/2ef72da1-8c5b-449d-8460-0f5833bd856d"; } + ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + + hardware = { + bluetooth.enable = true; + cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + }; +} diff --git a/hosts/shared/darwin.nix b/hosts/shared/darwin.nix new file mode 100644 index 0000000..05f23c5 --- /dev/null +++ b/hosts/shared/darwin.nix @@ -0,0 +1,63 @@ +{ self, pkgs, ... }: +{ + # Only use homebrew for casks. + homebrew.enable = true; + + nix = { + gc = { + automatic = true; + interval = { + Hour = 3; + Minute = 15; + Weekday = 7; + }; + options = "--delete-older-than 30d"; + }; + + optimise = { + automatic = true; + interval = { + Hour = 3; + Minute = 15; + Weekday = 7; + }; + }; + + settings.experimental-features = "nix-command flakes"; + }; + + # Enables Touch ID for sudo prompts. + security.pam.services.sudo_local.touchIdAuth = true; + + environment = { + variables = rec { + XDG_CACHE_HOME = "$HOME/.cache"; + XDG_CONFIG_HOME = "$HOME/.config"; + XDG_DATA_HOME = "$HOME/.local/share"; + XDG_STATE_HOME = "$HOME/.local/state"; + }; + + shellAliases = { + l = "ls -alh"; + ll = "ls -l"; + ls = "ls --color=tty"; + ff = "clear;fastfetch"; + nb = "nix-build"; + nix-rebuild = "sudo darwin-rebuild switch"; + }; + + systemPackages = with pkgs; [ + wget + fastfetch + btop + ]; + }; + + # Don't touch this unless needed. + system = { + configurationRevision = self.rev or self.dirtyRev or null; + stateVersion = 6; + }; + + nixpkgs.hostPlatform = "aarch64-darwin"; +} diff --git a/hosts/shared/nixos.nix b/hosts/shared/nixos.nix new file mode 100644 index 0000000..03fbfc3 --- /dev/null +++ b/hosts/shared/nixos.nix @@ -0,0 +1,319 @@ +{ + config, + pkgs, + lib, + inputs, + ... +}: +let + unstable = inputs.nixpkgs-unstable.legacyPackages.${pkgs.stdenv.hostPlatform.system}; +in +{ + boot = { + loader = { + systemd-boot.enable = true; + efi.canTouchEfiVariables = true; + systemd-boot.configurationLimit = 10; + timeout = 0; + }; + + consoleLogLevel = 3; + + extraModulePackages = [ config.boot.kernelPackages.kvmfr ]; + + kernelParams = [ + "quiet" + "rd.udev.log_level=3" + "rd.systemd.show_status=auto" + "kvmfr.static_size_mb=128" + ]; + + initrd = { + verbose = false; + + kernelModules = [ + "vfio" + "vfio_pci" + "vfio_iommu_type1" + "kvmfr" + ]; + }; + + kernelModules = [ + "ntsync" + ]; + + plymouth = { + enable = true; + theme = "bgrt"; + }; + }; + + services = { + # Allow kvmfr module to be used by QEMU/KVM. + udev.packages = [ + (pkgs.writeTextFile { + name = "kvmfr"; + + text = '' + SUBSYSTEM=="kvmfr", GROUP="kvm", MODE="0660", TAG+="uaccess" + ''; + + destination = "/etc/udev/rules.d/70-kvmfr.rules"; + }) + ]; + + # Configures snapshots for home subvolume. + # Requires /home/.snapshots subvolume to function. + snapper = { + snapshotInterval = "hourly"; + cleanupInterval = "1d"; + configs = { + home = { + SUBVOLUME = "/home"; + TIMELINE_CREATE = true; + TIMELINE_CLEANUP = true; + TIMELINE_LIMIT_HOURLY = "10"; + TIMELINE_LIMIT_DAILY = "7"; + TIMELINE_LIMIT_WEEKLY = "2"; + TIMELINE_LIMIT_MONTHLY = "0"; + TIMELINE_LIMIT_YEARLY = "0"; + BACKGROUND_COMPARISON = "yes"; + NUMBER_CLEANUP = "no"; + NUMBER_MIN_AGE = "1800"; + NUMBER_LIMIT = "50"; + NUMBER_LIMIT_IMPORTANT = "10"; + EMPTY_PRE_POST_CLEANUP = "yes"; + EMPTY_PRE_POST_MIN_AGE = "1800"; + }; + }; + }; + + # Completely disable xserver support (RIP X11). + xserver.enable = false; + + # Configure pipewire. Disables 32Bit ALSA since it causes build errors + # and is largely vestigial. + pipewire = { + enable = true; + pulse.enable = true; + alsa.enable = true; + alsa.support32Bit = lib.mkForce false; + }; + + openssh.enable = true; + + # Enables m(ulticast)DNS (a.k.a. Bonjour) support. + avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + }; + + networking = { + wireless.enable = true; + networkmanager.enable = true; + networkmanager.plugins = with pkgs; [ networkmanager-openvpn ]; + + firewall = { + trustedInterfaces = [ "virbr0" ]; + allowedTCPPorts = [ 22 ]; + }; + }; + + time.timeZone = "America/New_York"; + + i18n = { + defaultLocale = "en_US.UTF-8"; + + extraLocales = [ + "ja_JP.UTF-8/UTF-8" + ]; + + extraLocaleSettings = { + LC_ADDRESS = "en_US.UTF-8"; + LC_IDENTIFICATION = "en_US.UTF-8"; + LC_MEASUREMENT = "en_US.UTF-8"; + LC_MONETARY = "en_US.UTF-8"; + LC_NAME = "en_US.UTF-8"; + LC_NUMERIC = "en_US.UTF-8"; + LC_PAPER = "en_US.UTF-8"; + LC_TELEPHONE = "en_US.UTF-8"; + LC_TIME = "en_US.UTF-8"; + }; + }; + + security.rtkit.enable = true; + + programs = { + bash = { + enable = true; + + interactiveShellInit = '' + eval "$(jump shell)" + bind -x '"\eOQ": clear;fastfetch' + ''; + }; + + starship = { + enable = true; + + settings = { + character = { + success_symbol = "[λ](bold green)"; + error_symbol = "[λ](bold red)"; + }; + }; + }; + + virt-manager.enable = true; + + ssh.startAgent = true; + + firefox.enable = true; + + appimage = { + enable = true; + binfmt = true; + }; + + neovim = { + enable = true; + defaultEditor = true; + vimAlias = true; + + configure = { + customRC = '' + set nocompatible + set backspace=indent,eol,start + set tabstop=2 + set shiftwidth=2 + set expandtab + ''; + + packages.myPlugins = with pkgs.vimPlugins; { + start = [ + vim-lastplace + vim-nix + ]; + + opt = [ ]; + }; + }; + }; + }; + + virtualisation = { + spiceUSBRedirection.enable = true; + + libvirtd = { + enable = true; + + qemu = { + package = pkgs.qemu_kvm; + runAsRoot = true; + swtpm.enable = true; + + verbatimConfig = '' + namespaces = [] + cgroup_device_acl = [ + "/dev/null", "/dev/full", "/dev/zero", + "/dev/random", "/dev/urandom", + "/dev/ptmx", "/dev/kvm", "/dev/kqemu", + "/dev/rtc","/dev/hpet", "/dev/vfio/vfio", + "/dev/kvmfr0" + ] + ''; + }; + }; + }; + + users.users.frank = { + isNormalUser = true; + description = "Frank LoTurco"; + + extraGroups = [ + "networkmanager" + "wheel" + "libvirtd" + "input" + "video" + ]; + }; + + nixpkgs.config.allowUnfree = true; + + nix = { + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + }; + + optimise = { + automatic = true; + dates = "weekly"; + }; + + settings = { + experimental-features = [ + "nix-command" + "flakes" + ]; + + use-xdg-base-directories = true; + }; + }; + + environment = { + systemPackages = with pkgs; [ + wget + vorta + dnsmasq + guestfs-tools + unrar + btrfs-assistant + looking-glass-client + nil + bash-language-server + devenv + nerd-fonts.hack + jump + + unstable.winetricks + unstable.fastfetch + + inputs.nix-gaming.packages.${pkgs.stdenv.hostPlatform.system}.wine-tkg + inputs.appimage-manager.packages.${pkgs.stdenv.hostPlatform.system}.default + + (callPackage ../../packages/virtiofsd-looking-glass/package.nix { }) + (callPackage ../../packages/heidisql/package.nix { }) + ]; + + shellAliases = { + l = "ls -alh"; + ll = "ls -l"; + ls = "ls --color=tty"; + ff = "clear;fastfetch --logo nixos2"; + wget = "wget --hsts-file=$XDG_DATA_HOME/wget-hsts"; + nb = "nix-build"; + nix-rebuild = "sudo nixos-rebuild switch"; + }; + + sessionVariables = rec { + XDG_CACHE_HOME = "$HOME/.cache"; + XDG_CONFIG_HOME = "$HOME/.config"; + XDG_DATA_HOME = "$HOME/.local/share"; + XDG_STATE_HOME = "$HOME/.local/state"; + + HISTFILE = "$XDG_STATE_HOME/bash/history"; + DOTNET_CLI_HOME = "$XDG_DATA_HOME/dotnet"; + GTK2_RC_FILES = "$XDG_CONFIG_HOME/gtk-2.0/gtkrc"; + WINE_BIN = "${inputs.nix-gaming.packages.${pkgs.stdenv.hostPlatform.system}.wine-tkg}/bin/.wine"; + WINEPREFIX = "$XDG_DATA_HOME/wine"; + }; + }; + + system.stateVersion = "26.05"; +} diff --git a/packages/aseprite-thumbnailer-kde/package.nix b/packages/aseprite-thumbnailer-kde/package.nix new file mode 100644 index 0000000..f11f719 --- /dev/null +++ b/packages/aseprite-thumbnailer-kde/package.nix @@ -0,0 +1,39 @@ +{ + stdenv, + fetchFromGitHub, + cmake, + pkg-config, + unstable, + kdePackages, +}: + +# Builds the kio aseprite thumbnailer using qt6 from unstable. +stdenv.mkDerivation { + pname = "aseprite-thumbnailer-kde"; + version = "4189eeb7864307518938363d990fa69836e6686e"; + + src = fetchFromGitHub { + owner = "56789a1987"; + repo = "aseprite-thumbnails-kde"; + rev = "4189eeb7864307518938363d990fa69836e6686e"; + hash = "sha256-+Q08KXuf9ofRBJXZtt5isRaV98U0UySW7EFnm/dg8Vc="; + fetchSubmodules = true; + leaveDotGit = false; + }; + + dontWrapQtApps = true; + + nativeBuildInputs = [ + cmake + pkg-config + ]; + + buildInputs = [ + unstable.qt6.qtbase + kdePackages.kio + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + ]; +} diff --git a/packages/aseprite/package.nix b/packages/aseprite/package.nix new file mode 100644 index 0000000..caa1ae0 --- /dev/null +++ b/packages/aseprite/package.nix @@ -0,0 +1,202 @@ +{ + clangStdenv, + cmake, + cmark, + curl, + fetchFromGitHub, + fmt, + fontconfig, + freetype, + giflib, + glib, + harfbuzzFull, + libicns, + lib, + libGL, + libjpeg, + libpng, + libwebp, + libx11, + libxcursor, + libxext, + libxi, + libxxf86vm, + libxcb, + libxrandr, + ninja, + pcre2, + pixman, + pkg-config, + skia-aseprite, + tinyxml-2, + zlib, +}: + +let + asepriteStrings = fetchFromGitHub { + owner = "aseprite"; + repo = "strings"; + rev = "417074f649f359f98511fc87a707c276d87f5739"; + hash = "sha256-5bB7yK4eJHhkUwGYtIFYdFXpRrBt69VBbTh7EmPFI08="; + }; +in +clangStdenv.mkDerivation (finalAttrs: { + pname = "aseprite"; + version = "44cd42d29dbc047ec9d341f05c0a8ff584ede151"; + + src = fetchFromGitHub { + owner = "aseprite"; + repo = "aseprite"; + rev = "${finalAttrs.version}"; + hash = "sha256-swXk8wwFgao2rpF4ntCjOMnV+yk0gi+wbWoWl/wv7e8="; + fetchSubmodules = true; + }; + + # Translation files are copied without overwriting existing ones to preserve the + # potentially more up-to-date English file from the main source. + postUnpack = '' + cp --no-clobber ${asepriteStrings}/* "$sourceRoot/data/strings" + ''; + + nativeBuildInputs = [ + cmake + ninja + pkg-config + ] + ++ lib.optionals clangStdenv.hostPlatform.isDarwin [ + libicns + ]; + + buildInputs = [ + cmark + curl + fmt + fontconfig + freetype + giflib + glib + harfbuzzFull + libGL + libjpeg + libpng + libwebp + libx11 + libxcursor + libxext + libxi + libxxf86vm + libxcb + libxrandr + pcre2 + pixman + skia-aseprite + tinyxml-2 + zlib + ]; + + patches = [ + ./patches/shared-fmt.patch + ./patches/shared-libwebp.patch + ./patches/shared-skia-deps.patch + ./patches/shared-libjpeg-turbo.patch + ]; + + postPatch = '' + substituteInPlace src/ver/CMakeLists.txt \ + --replace-fail '"1.x-dev"' '"${finalAttrs.version}"' + + # Fix build on Darwin with `-Werror=format-security`. + # (NSLog requires a string-literal format). + substituteInPlace laf/os/osx/logger.mm \ + --replace-fail 'NSLog([NSString stringWithUTF8String:error]);' 'NSLog(@"%@", [NSString stringWithUTF8String:error]);' + ''; + + cmakeFlags = [ + "-DENABLE_DESKTOP_INTEGRATION=ON" + "-DENABLE_UPDATER=OFF" + "-DUSE_SHARED_CMARK=ON" + "-DUSE_SHARED_CURL=ON" + "-DUSE_SHARED_FMT=ON" + "-DUSE_SHARED_FREETYPE=ON" + "-DUSE_SHARED_GIFLIB=ON" + "-DUSE_SHARED_HARFBUZZ=ON" + "-DUSE_SHARED_LIBPNG=ON" + "-DUSE_SHARED_PIXMAN=ON" + "-DUSE_SHARED_TINYXML=OFF" + "-DUSE_SHARED_WEBP=ON" + "-DUSE_SHARED_ZLIB=ON" + # Disable libarchive programs. + "-DENABLE_CAT=OFF" + "-DENABLE_CPIO=OFF" + "-DENABLE_TAR=OFF" + # UI backend. + "-DLAF_BACKEND=skia" + "-DLAF_WITH_EXAMPLES=OFF" + "-DSKIA_DIR=${skia-aseprite}" + "-DSKIA_LIBRARY_DIR=${skia-aseprite}/lib" + ]; + + # `libskia.a` is static, so its deps must be linked explicitly on Darwin + # (otherwise we hit undefined `_jpeg_*`/`_WebP*` symbols, e.g. in the thumbnailer). + env.NIX_LDFLAGS = lib.optionalString clangStdenv.hostPlatform.isDarwin "-ljpeg -lwebp -lwebpdemux -lwebpmux"; + + postInstall = '' + # Install desktop icons. + src="$out/share/aseprite/data/icons" + for size in 16 32 48 64 128 256; do + dst="$out"/share/icons/hicolor/"$size"x"$size" + install -Dm644 "$src"/ase"$size".png "$dst"/apps/aseprite.png + install -Dm644 "$src"/doc"$size".png "$dst"/mimetypes/image-x-aseprite.png + done + # Delete unneeded artifacts of bundled libraries. + rm -rf "$out"/{include,lib,man} + '' + + lib.optionalString clangStdenv.hostPlatform.isDarwin '' + install -d "$out/Applications" + if [ -d "$out/bin/aseprite.app" ]; then + rm -rf "$out/Applications/Aseprite.app" + mv "$out/bin/aseprite.app" "$out/Applications/Aseprite.app" + fi + # Generate the `.icns` files referenced by Info.plist from the shipped PNGs. + res="$out/Applications/Aseprite.app/Contents/Resources" + icons="$res/data/icons" + if [ -d "$icons" ] && command -v png2icns >/dev/null; then + for spec in "Aseprite ase" "Document doc" "Extension ext"; do + set -- $spec + name="$1" + prefix="$2" + png2icns "$res/$name.icns" \ + "$icons/''${prefix}16.png" \ + "$icons/''${prefix}32.png" \ + "$icons/''${prefix}128.png" \ + "$icons/''${prefix}256.png" + done + fi + # Keep $out/bin clean on Darwin; the bundle lives under $out/Applications. + rmdir "$out/bin" 2>/dev/null || true + ''; + + meta = { + homepage = "https://www.aseprite.org/"; + description = "Animated sprite editor & pixel art tool"; + license = lib.licenses.unfree; + + longDescription = '' + Aseprite is a program to create animated sprites. Its main features are: + - Sprites are composed by layers & frames (as separated concepts). + - Supported color modes: RGBA, Indexed (palettes up to 256 colors), and Grayscale. + - Load/save sequence of PNG files and GIF animations (and FLC, FLI, JPG, BMP, PCX, TGA). + - Export/import animations to/from Sprite Sheets. + - Tiled drawing mode, useful to draw patterns and textures. + - Undo/Redo for every operation. + - Real-time animation preview. + - Multiple editors support. + - Pixel-art specific tools like filled Contour, Polygon, Shading mode, etc. + - Onion skinning. + ''; + + maintainers = [ lib.maintainers.iamanaws ]; + platforms = lib.platforms.linux ++ lib.platforms.darwin; + mainProgram = "aseprite"; + }; +}) diff --git a/packages/aseprite/patches/shared-fmt.patch b/packages/aseprite/patches/shared-fmt.patch new file mode 100644 index 0000000..6cac2ec --- /dev/null +++ b/packages/aseprite/patches/shared-fmt.patch @@ -0,0 +1,79 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b1bd0189b..3fb7abffb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -66,6 +66,7 @@ enable_testing() + + option(USE_SHARED_CMARK "Use your installed copy of cmark" off) + option(USE_SHARED_CURL "Use your installed copy of curl" off) ++option(USE_SHARED_FMT "Use your installed copy of fmt" off) + option(USE_SHARED_GIFLIB "Use your installed copy of giflib" off) + option(USE_SHARED_JPEGLIB "Use your installed copy of jpeglib" off) + option(USE_SHARED_ZLIB "Use your installed copy of zlib" off) +@@ -185,6 +186,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_PROFILE "${CMAKE_BINARY_DIR}/bin") + set(SOURCE_DATA_DIR ${CMAKE_CURRENT_SOURCE_DIR}/data) + set(CMARK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/cmark) + set(CURL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/curl) ++set(FMT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/fmt) + set(GIFLIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/giflib) + set(LIBJPEG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/jpeg) + set(LIBPNG_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libpng) +@@ -225,6 +227,16 @@ if(NOT USE_SHARED_CURL) + set(CURL_STATICLIB ON BOOL) + endif() + ++# fmt ++if(USE_SHARED_FMT) ++ find_package(FMT REQUIRED) ++ set(FMT_LIBRARIES fmt::fmt) ++else() ++ set(FMT_FOUND) ++ set(FMT_LIBRARIES fmt) ++ # No need to include extra directories, actually ++endif() ++ + # zlib + if(USE_SHARED_ZLIB) + find_package(ZLIB REQUIRED) +diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt +index 9c67c0268..b19a3e412 100644 +--- a/src/app/CMakeLists.txt ++++ b/src/app/CMakeLists.txt +@@ -754,7 +754,7 @@ target_link_libraries(app-lib + ${ZLIB_LIBRARIES} + json11 + archive_static +- fmt ++ ${FMT_LIBRARIES} + tinyexpr + qoi) + +diff --git a/src/dio/CMakeLists.txt b/src/dio/CMakeLists.txt +index 55cb24de5..b253dca0b 100644 +--- a/src/dio/CMakeLists.txt ++++ b/src/dio/CMakeLists.txt +@@ -16,7 +16,7 @@ endif() + + target_link_libraries(dio-lib + ${ZLIB_LIBRARIES} +- fmt ++ ${FMT_LIBRARIES} + flic-lib + laf-base + fixmath-lib +diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt +index 9d09a98c8..1973b134b 100644 +--- a/third_party/CMakeLists.txt ++++ b/third_party/CMakeLists.txt +@@ -117,7 +117,10 @@ if(NOT USE_SHARED_HARFBUZZ AND NOT LAF_BACKEND STREQUAL "skia") + endif() + + add_subdirectory(simpleini) +-add_subdirectory(fmt) ++ ++if(NOT USE_SHARED_FMT) ++ add_subdirectory(fmt) ++endif() + + # Add cmark without tests + if(NOT USE_SHARED_CMARK) diff --git a/packages/aseprite/patches/shared-libjpeg-turbo.patch b/packages/aseprite/patches/shared-libjpeg-turbo.patch new file mode 100644 index 0000000..a3b01fe --- /dev/null +++ b/packages/aseprite/patches/shared-libjpeg-turbo.patch @@ -0,0 +1,21 @@ +diff --git a/cmake/FindJpegTurbo.cmake b/cmake/FindJpegTurbo.cmake +index 33b5204..0407a6a 100644 +--- a/cmake/FindJpegTurbo.cmake ++++ b/cmake/FindJpegTurbo.cmake +@@ -9,14 +9,11 @@ + + if(LAF_BACKEND STREQUAL "skia") + +- find_library(LIBJPEG_TURBO_LIBRARY NAMES libjpeg jpeg +- HINTS "${SKIA_LIBRARY_DIR}" NO_DEFAULT_PATH) +- set(LIBJPEG_TURBO_INCLUDE_DIRS "${SKIA_DIR}/third_party/externals/libjpeg-turbo") ++ find_library(LIBJPEG_TURBO_LIBRARY NAMES libjpeg jpeg) + + add_library(libjpeg-turbo STATIC IMPORTED) + set_target_properties(libjpeg-turbo PROPERTIES +- IMPORTED_LOCATION "${LIBJPEG_TURBO_LIBRARY}" +- INTERFACE_INCLUDE_DIRECTORIES ${LIBJPEG_TURBO_INCLUDE_DIRS}) ++ IMPORTED_LOCATION "${LIBJPEG_TURBO_LIBRARY}") + + else() + \ No newline at end of file diff --git a/packages/aseprite/patches/shared-libwebp.patch b/packages/aseprite/patches/shared-libwebp.patch new file mode 100644 index 0000000..e4526a3 --- /dev/null +++ b/packages/aseprite/patches/shared-libwebp.patch @@ -0,0 +1,47 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 87aed2f28f9c..498472ec2a60 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -76,6 +76,7 @@ option(USE_SHARED_TINYXML "Use your installed copy of tinyxml" off) + option(USE_SHARED_PIXMAN "Use your installed copy of pixman" off) + option(USE_SHARED_FREETYPE "Use shared FreeType library" off) + option(USE_SHARED_HARFBUZZ "Use shared HarfBuzz library" off) ++option(USE_SHARED_WEBP "Use your installed copy of webp" off) + option(ENABLE_ASEPRITE_EXE "Compile main Aseprite executable" on) + option(ENABLE_MEMLEAK "Enable memory-leaks detector (only for developers)" off) + option(ENABLE_NEWS "Enable the news in Home tab" on) +@@ -380,7 +381,20 @@ add_subdirectory(laf) + # libwebp + if(ENABLE_WEBP) + # Use libwebp from Skia +- if(LAF_BACKEND STREQUAL "skia") ++ if(USE_SHARED_WEBP) ++ find_library(WEBP_LIBRARY NAMES webp) ++ find_library(WEBPDEMUX_LIBRARY NAMES webpdemux) ++ find_library(WEBPMUX_LIBRARY NAMES webpmux) ++ set(WEBP_LIBRARIES ${WEBP_LIBRARY} ${WEBPDEMUX_LIBRARY} ${WEBPMUX_LIBRARY}) ++ find_path(WEBP_INCLUDE_DIRS NAMES decode.h PATH_SUFFIXES webp) ++ find_path(WEBP_INCLUDE_DIRS NAMES decode.h PATH_SUFFIXES webp) ++ find_path(WEBP_INCLUDE_DIRS NAMES decode.h PATH_SUFFIXES webp) ++ if(WEBP_LIBRARIES) ++ set(WEBP_FOUND ON) ++ else() ++ set(WEBP_FOUND OFF) ++ endif() ++ elseif(LAF_BACKEND STREQUAL "skia") + find_library(WEBP_LIBRARIES webp + NAMES libwebp # required for Windows + PATHS "${SKIA_LIBRARY_DIR}" NO_DEFAULT_PATH) +diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt +index 1973b134b9f8..f15dba5a7968 100644 +--- a/third_party/CMakeLists.txt ++++ b/third_party/CMakeLists.txt +@@ -33,7 +33,7 @@ if(NOT USE_SHARED_GIFLIB) + add_subdirectory(giflib) + endif() + +-if(ENABLE_WEBP AND NOT LAF_BACKEND STREQUAL "skia") ++if(ENABLE_WEBP AND NOT LAF_BACKEND STREQUAL "skia" AND NOT USE_SHARED_WEBP) + set(WEBP_BUILD_EXTRAS OFF CACHE BOOL "Build extras.") + set(WEBP_BUILD_ANIM_UTILS OFF CACHE BOOL "Build animation utilities.") + set(WEBP_BUILD_CWEBP OFF CACHE BOOL "Build the cwebp command line tool.") diff --git a/packages/aseprite/patches/shared-skia-deps.patch b/packages/aseprite/patches/shared-skia-deps.patch new file mode 100644 index 0000000..a6ab472 --- /dev/null +++ b/packages/aseprite/patches/shared-skia-deps.patch @@ -0,0 +1,21 @@ +--- src/laf/cmake/FindSkia.cmake.orig 2022-01-08 02:15:13.417619266 +0100 ++++ src/laf/cmake/FindSkia.cmake 2022-01-08 02:15:43.603960491 +0100 +@@ -32,14 +32,18 @@ + # SkShaper module + freetype + harfbuzz + find_library(SKSHAPER_LIBRARY skshaper PATH "${SKIA_LIBRARY_DIR}") + ++if(NOT USE_SHARED_FREETYPE) + set(FREETYPE_FOUND ON) + find_library(FREETYPE_LIBRARY freetype2 PATH "${SKIA_LIBRARY_DIR}" NO_DEFAULT_PATH) + set(FREETYPE_LIBRARIES ${FREETYPE_LIBRARY}) + set(FREETYPE_INCLUDE_DIRS "${SKIA_DIR}/third_party/externals/freetype/include") ++endif() + ++if(NOT USE_SHARED_HARFBUZZ) + find_library(HARFBUZZ_LIBRARY harfbuzz PATH "${SKIA_LIBRARY_DIR}" NO_DEFAULT_PATH) + set(HARFBUZZ_LIBRARIES ${HARFBUZZ_LIBRARY}) + set(HARFBUZZ_INCLUDE_DIRS "${SKIA_DIR}/third_party/externals/harfbuzz/src") ++endif() + + set(SKIA_LIBRARIES + ${SKIA_LIBRARY} \ No newline at end of file diff --git a/packages/heidisql/package.nix b/packages/heidisql/package.nix new file mode 100644 index 0000000..a42e13d --- /dev/null +++ b/packages/heidisql/package.nix @@ -0,0 +1,137 @@ +{ pkgs }: + +let + heidisql-raw = pkgs.stdenv.mkDerivation rec { + pname = "heidisql-raw"; + version = "12.17"; + + src = pkgs.fetchurl { + url = "https://github.com/HeidiSQL/HeidiSQL/releases/download/${version}/heidisql_${version}_amd64.deb"; + sha256 = "sha256-RCuJzyw+53OcUYfvodXHaZPy0w6Pxn3a2Wan06feTQw="; + }; + + qt6pas_deb = pkgs.fetchurl { + url = "http://ftp.debian.org/debian/pool/main/libq/libqt6pas/libqt6pas6_2.4_amd64.deb"; + sha256 = "sha256-vKfT4Xie/hDrFAUMDI3bvk4k8QGx14JjgJRa1iG2M2w="; + }; + + nativeBuildInputs = [ + pkgs.dpkg + pkgs.autoPatchelfHook + pkgs.qt6.wrapQtAppsHook + ]; + + buildInputs = [ + pkgs.qt6.qtbase + pkgs.libx11 + pkgs.glib + pkgs.mariadb-connector-c + pkgs.postgresql.lib + pkgs.sqlite + ]; + + dontWrapQtApps = true; + + unpackPhase = '' + dpkg-deb -x $src . + dpkg-deb -x ${qt6pas_deb} qt6pas_ext + ''; + + installPhase = '' + mkdir -p $out/lib + + if [ -d usr ]; then + cp -r usr/* $out/ + fi + + # Ensure lib exists and copy Pascal-Qt6 bindings. + find qt6pas_ext -name "libQt6Pas.so*" -exec cp {} $out/lib/ \; + + # Create library symlinks + ln -s ${pkgs.mariadb-connector-c}/lib/mariadb/libmariadb.so.3 $out/lib/libmariadb.so + ln -s ${pkgs.postgresql.lib}/lib/libpq.so.5 $out/lib/libpq.so + ln -s ${pkgs.sqlite.out}/lib/libsqlite3.so.0 $out/lib/libsqlite3.so + + # Link them where the binary is (usually share/heidisql on Linux). + if [ -d $out/share/heidisql ]; then + ln -s $out/lib/libmariadb.so $out/share/heidisql/libmariadb.so + ln -s $out/lib/libpq.so $out/share/heidisql/libpq.so + ln -s $out/lib/libsqlite3.so $out/share/heidisql/libsqlite3.so + fi + ''; + }; + + desktopItem = pkgs.makeDesktopItem { + name = "heidisql"; + exec = "heidisql"; + icon = "${heidisql-raw}/share/pixmaps/heidisql.png"; + comment = "MySQL, MariaDB, PostgreSQL and SQLite manager"; + desktopName = "HeidiSQL"; + + categories = [ + "Development" + "Database" + ]; + }; +in +pkgs.buildFHSEnv { + name = "heidisql"; + + targetPkgs = + pkgs: with pkgs; [ + heidisql-raw + mariadb-connector-c + postgresql.lib + sqlite + openssl + zlib + glib + freetype + fontconfig + libglvnd + qt6.qtbase + qt6.qtwayland + libx11 + libxext + libxrender + icu + ]; + + extraInstallCommands = '' + mkdir -p $out/share/applications + cp ${desktopItem}/share/applications/* $out/share/applications/ + + # Only copy icons if they actually exist in the raw build. + if [ -d ${heidisql-raw}/share/icons ]; then + cp -r ${heidisql-raw}/share/icons $out/share/ + fi + + ''; + + runScript = pkgs.writeScript "heidisql-wrapper" '' + export LD_LIBRARY_PATH=/usr/lib/heidisql:/usr/lib:/usr/lib64:$LD_LIBRARY_PATH + + # NOTE: The original package forces dark mode here, I'm turning this + # off temporarily for testing. + + # Force Fusion style but tell it to use Dark Mode. + #export QT_STYLE_OVERRIDE=fusion + #export QT_QPA_PLATFORMTHEME="" + + # Set the "Dark" flag for the underlying engine + #export GTK_THEME=Adwaita:dark + #export XDG_CURRENT_DESKTOP=GNOME + + # This is the key: Tell Qt to prefer a dark color palette + # and not use the system's broken inheritance. + #export QT_LOGGING_RULES="qt.qpa.gl=true" + + # Launch with the Fusion dark palette override + # This ensures text is white and backgrounds are charcoal + #exec heidisql -style fusion "$@" + + exec heidisql "$@" + ''; + + multiPkgs = pkgs: [ pkgs.libGL ]; +} diff --git a/packages/virtiofsd-looking-glass/package.nix b/packages/virtiofsd-looking-glass/package.nix new file mode 100644 index 0000000..b90c762 --- /dev/null +++ b/packages/virtiofsd-looking-glass/package.nix @@ -0,0 +1,25 @@ +{ + fetchFromGitHub, + rustPlatform, + libseccomp, + libcap_ng, +}: + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "virtiofsd"; + version = "daea013daf5cdc0adc6ae14de92e3a48ac206eae"; + + src = fetchFromGitHub { + owner = "ELginas"; + repo = "virtiofsd"; + rev = "daea013daf5cdc0adc6ae14de92e3a48ac206eae"; + hash = "sha256-3p9WoUInWh+fmUkiMCjl2Tygx2/reUyKX+3xvMsW26w="; + }; + + buildInputs = [ + libseccomp + libcap_ng + ]; + + cargoHash = "sha256-rKlm8TpCKc+Nzb9+H0FPs5GSNNjWs5/xNpSd0ZZuQt0="; +}) diff --git a/packages/xivlauncher/deps.json b/packages/xivlauncher/deps.json new file mode 100644 index 0000000..666f4e7 --- /dev/null +++ b/packages/xivlauncher/deps.json @@ -0,0 +1,292 @@ +[ + { + "pname": "Castle.Core", + "version": "4.4.1", + "hash": "sha256-J4NS8p9KqbuLl6JMmNwptsfccH37TfhAhPwX2mVQso0=" + }, + { + "pname": "CommandLineParser", + "version": "2.9.1", + "hash": "sha256-ApU9y1yX60daSjPk3KYDBeJ7XZByKW8hse9NRZGcjeo=" + }, + { + "pname": "Config.Net", + "version": "4.19.0", + "hash": "sha256-Nb4ftf+RREzgiVOpc+xSxd4b+PiLGmFQM3okA/wGO54=" + }, + { + "pname": "goaaats.Steamworks", + "version": "2.3.4", + "hash": "sha256-Wk9arQvVPPeMSgt8lL9rVRVkO1NrBNYzME4ZuOWcHc4=" + }, + { + "pname": "Hexa.NET.ImGui", + "version": "2.2.9", + "hash": "sha256-hprgiqfXjuQ+I1wMk4+ddFiQ5/r7S1KZNZShU6L5nG8=" + }, + { + "pname": "Hexa.NET.ImGui.Backends.SDL3", + "version": "1.0.18", + "hash": "sha256-ciEA775X+sjWVT1HAg+7OxThZOrnUKa2/eSfzQtG7GY=" + }, + { + "pname": "Hexa.NET.SDL3", + "version": "1.2.16", + "hash": "sha256-oSJkPJor4K4KPiN2CC67BCHVxgDXmiCf5GdS9b+JaII=" + }, + { + "pname": "Hexa.NET.SDL3.Image", + "version": "1.0.0", + "hash": "sha256-SPNwM1w6ksZeZYFrNvforIMvgDIvbj1nRcMDTOA9/Kc=" + }, + { + "pname": "HexaGen.Runtime", + "version": "1.1.18", + "hash": "sha256-eitF6L6LKuCV2nY2Y0i9kRV+FAiaCbSp6BvSSEpqMrA=" + }, + { + "pname": "HexaGen.Runtime", + "version": "1.1.21", + "hash": "sha256-OZdIwCjInJ6KAWmPcKs0VN/o4AcY2k427JdtOf9N9Mk=" + }, + { + "pname": "KeySharp", + "version": "1.0.5", + "hash": "sha256-pJWjjU3AFsnMMX6cUoLUy4wovyfPx4S44Y6coMAGgcU=" + }, + { + "pname": "Microsoft.CodeAnalysis.Analyzers", + "version": "3.3.3", + "hash": "sha256-pkZiggwLw8k+CVSXKTzsVGsT+K49LxXUS3VH5PNlpCY=" + }, + { + "pname": "Microsoft.CodeAnalysis.BannedApiAnalyzers", + "version": "3.3.4", + "hash": "sha256-YPTHTZ8xRPMLADdcVYRO/eq3O9uZjsD+OsGRZE+0+e8=" + }, + { + "pname": "Microsoft.CodeAnalysis.BannedApiAnalyzers", + "version": "4.14.0", + "hash": "sha256-f7svtnkq4xLTjGVj6kNZ1ZGFCV/RESsM+GJZmEpezh4=" + }, + { + "pname": "Microsoft.CodeAnalysis.Common", + "version": "4.0.1", + "hash": "sha256-SU1WPMlg2245w9BFhS3GHtEEbus+tVAYaemHCW3Ysis=" + }, + { + "pname": "Microsoft.CodeAnalysis.CSharp", + "version": "4.0.1", + "hash": "sha256-i6XtEcymf17CcDkiEFZ6zSuLJdlEt3aZ2oLf81x00sA=" + }, + { + "pname": "Microsoft.CodeAnalysis.NetAnalyzers", + "version": "10.0.101", + "hash": "sha256-7rrB4tBiF3t+yoHcg170KlypFS/Z7xAPOM9OQZOs1Yg=" + }, + { + "pname": "Microsoft.CodeAnalysis.NetAnalyzers", + "version": "9.0.0", + "hash": "sha256-UBTANXmzAS6KuCKDIGhi0MGphAI83FizpRCPebqJ9GE=" + }, + { + "pname": "Microsoft.NETCore.Platforms", + "version": "1.1.0", + "hash": "sha256-FeM40ktcObQJk4nMYShB61H/E8B7tIKfl9ObJ0IOcCM=" + }, + { + "pname": "Microsoft.Win32.Registry", + "version": "6.0.0-preview.5.21301.5", + "hash": "sha256-7Fu8oYHKsOxecDC7wT0aJR/GOPaq9W1k0SgKa5AW4Qg=" + }, + { + "pname": "Microsoft.Win32.SystemEvents", + "version": "6.0.0", + "hash": "sha256-N9EVZbl5w1VnMywGXyaVWzT9lh84iaJ3aD48hIBk1zA=" + }, + { + "pname": "NETStandard.Library", + "version": "1.6.1", + "hash": "sha256-iNan1ix7RtncGWC9AjAZ2sk70DoxOsmEOgQ10fXm4Pw=" + }, + { + "pname": "NETStandard.Library", + "version": "2.0.3", + "hash": "sha256-Prh2RPebz/s8AzHb2sPHg3Jl8s31inv9k+Qxd293ybo=" + }, + { + "pname": "Newtonsoft.Json", + "version": "13.0.3", + "hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc=" + }, + { + "pname": "PInvoke.Kernel32", + "version": "0.7.124", + "hash": "sha256-E65U364mp9V8SzkT2/oVg1f0Ts9Q1deRLeOUK3QhIlg=" + }, + { + "pname": "PInvoke.Windows.Core", + "version": "0.7.124", + "hash": "sha256-n/7Y6MkUVYr1bgT8OUkl0YpOd5AFgzHEUlEN+EKyE5s=" + }, + { + "pname": "Serilog", + "version": "4.0.0", + "hash": "sha256-j8hQ5TdL1TjfdGiBO9PyHJFMMPvATHWN1dtrrUZZlNw=" + }, + { + "pname": "Serilog", + "version": "4.1.0", + "hash": "sha256-r89nJ5JE5uZlsRrfB8QJQ1byVVfCWQbySKQ/m9PYj0k=" + }, + { + "pname": "Serilog", + "version": "4.2.0", + "hash": "sha256-7f3EpCsEbDxXgsuhE430KVI14p7oDUuCtwRpOCqtnbs=" + }, + { + "pname": "Serilog", + "version": "4.3.0", + "hash": "sha256-jyIy4BjsyFXge3aO4GRFAdnX4/rz1MHfBkBDIpCDsTw=" + }, + { + "pname": "Serilog.Enrichers.Sensitive", + "version": "1.7.3", + "hash": "sha256-1HnnaGEwTiDo11w5wWdjDxNxVO4WLFBnAggxmyZCYIg=" + }, + { + "pname": "Serilog.Enrichers.Thread", + "version": "4.0.0", + "hash": "sha256-lo+3ohNHKe/hTq9vGbk29p/OWcNlcyJToGL6EpCJQm8=" + }, + { + "pname": "Serilog.Sinks.Async", + "version": "2.1.0", + "hash": "sha256-LDoLpXkleD2MVPK2KBsLGRf5yqrwckBiAnYDbuIbaUM=" + }, + { + "pname": "Serilog.Sinks.Console", + "version": "6.0.0", + "hash": "sha256-QH8ykDkLssJ99Fgl+ZBFBr+RQRl0wRTkeccQuuGLyro=" + }, + { + "pname": "Serilog.Sinks.Debug", + "version": "3.0.0", + "hash": "sha256-7/LmoRF1rUDFhJ47bTRQQFRgSHnZDO8484r3sCGqYvE=" + }, + { + "pname": "Serilog.Sinks.File", + "version": "6.0.0", + "hash": "sha256-KQmlUpG9ovRpNqKhKe6rz3XMLUjkBqjyQhEm2hV5Sow=" + }, + { + "pname": "Serilog.Sinks.File", + "version": "7.0.0", + "hash": "sha256-LxZYUoUPkCjIIVarJilnXnqQiMrFNJtoRilmzTNtUjo=" + }, + { + "pname": "SharedMemory", + "version": "2.3.2", + "hash": "sha256-HFW3T9erIDZnjO7qldQx5eRbsib52MSYdOIiCZZSGB0=" + }, + { + "pname": "System.Buffers", + "version": "4.5.1", + "hash": "sha256-wws90sfi9M7kuCPWkv1CEYMJtCqx9QB/kj0ymlsNaxI=" + }, + { + "pname": "System.Collections.Immutable", + "version": "5.0.0", + "hash": "sha256-GdwSIjLMM0uVfE56VUSLVNgpW0B//oCeSFj8/hSlbM8=" + }, + { + "pname": "System.Configuration.ConfigurationManager", + "version": "6.0.0", + "hash": "sha256-fPV668Cfi+8pNWrvGAarF4fewdPVEDwlJWvJk0y+Cms=" + }, + { + "pname": "System.Drawing.Common", + "version": "6.0.0", + "hash": "sha256-/9EaAbEeOjELRSMZaImS1O8FmUe8j4WuFUw1VOrPyAo=" + }, + { + "pname": "System.Memory", + "version": "4.5.4", + "hash": "sha256-3sCEfzO4gj5CYGctl9ZXQRRhwAraMQfse7yzKoRe65E=" + }, + { + "pname": "System.Memory", + "version": "4.6.0", + "hash": "sha256-OhAEKzUM6eEaH99DcGaMz2pFLG/q/N4KVWqqiBYUOFo=" + }, + { + "pname": "System.Numerics.Vectors", + "version": "4.4.0", + "hash": "sha256-auXQK2flL/JpnB/rEcAcUm4vYMCYMEMiWOCAlIaqu2U=" + }, + { + "pname": "System.Reflection.Emit.Lightweight", + "version": "4.7.0", + "hash": "sha256-V0Wz/UUoNIHdTGS9e1TR89u58zJjo/wPUWw6VaVyclU=" + }, + { + "pname": "System.Reflection.Metadata", + "version": "5.0.0", + "hash": "sha256-Wo+MiqhcP9dQ6NuFGrQTw6hpbJORFwp+TBNTq2yhGp8=" + }, + { + "pname": "System.Runtime.CompilerServices.Unsafe", + "version": "4.5.2", + "hash": "sha256-8eUXXGWO2LL7uATMZye2iCpQOETn2jCcjUhG6coR5O8=" + }, + { + "pname": "System.Runtime.CompilerServices.Unsafe", + "version": "4.5.3", + "hash": "sha256-lnZMUqRO4RYRUeSO8HSJ9yBHqFHLVbmenwHWkIU20ak=" + }, + { + "pname": "System.Runtime.CompilerServices.Unsafe", + "version": "5.0.0", + "hash": "sha256-neARSpLPUzPxEKhJRwoBzhPxK+cKIitLx7WBYncsYgo=" + }, + { + "pname": "System.Security.AccessControl", + "version": "6.0.0-preview.5.21301.5", + "hash": "sha256-/rXZ6FJNEN3EuqOsCgCuypBOpA0hQyYIQXbsGccfLow=" + }, + { + "pname": "System.Security.Cryptography.ProtectedData", + "version": "6.0.0", + "hash": "sha256-Wi9I9NbZlpQDXgS7Kl06RIFxY/9674S7hKiYw5EabRY=" + }, + { + "pname": "System.Security.Permissions", + "version": "6.0.0", + "hash": "sha256-/MMvtFWGN/vOQfjXdOhet1gsnMgh6lh5DCHimVsnVEs=" + }, + { + "pname": "System.Security.Principal.Windows", + "version": "6.0.0-preview.5.21301.5", + "hash": "sha256-p0ROK7zJPz4EmNdjgAz2eX8dOMVHhpvQLTU7JveMceA=" + }, + { + "pname": "System.Text.Encoding.CodePages", + "version": "4.5.1", + "hash": "sha256-PIhkv59IXjyiuefdhKxS9hQfEwO9YWRuNudpo53HQfw=" + }, + { + "pname": "System.Text.Json", + "version": "9.0.2", + "hash": "sha256-kftKUuGgZtF4APmp77U79ws76mEIi+R9+DSVGikA5y8=" + }, + { + "pname": "System.Threading.Tasks.Extensions", + "version": "4.5.4", + "hash": "sha256-owSpY8wHlsUXn5xrfYAiu847L6fAKethlvYx97Ri1ng=" + }, + { + "pname": "System.Windows.Extensions", + "version": "6.0.0", + "hash": "sha256-N+qg1E6FDJ9A9L50wmVt3xPQV8ZxlG1xeXgFuxO+yfM=" + } +] diff --git a/packages/xivlauncher/package.nix b/packages/xivlauncher/package.nix new file mode 100644 index 0000000..c929594 --- /dev/null +++ b/packages/xivlauncher/package.nix @@ -0,0 +1,140 @@ +{ + lib, + buildDotnetModule, + fetchFromGitHub, + dotnetCorePackages, + sdl3, + libdecor, + libsecret, + glib, + gnutls, + aria2, + steam, + gst_all_1, + copyDesktopItems, + makeDesktopItem, + makeWrapper, + useSteamRun ? true, +}: + +let + rev = "1.4.0"; +in +buildDotnetModule rec { + pname = "XIVLauncher"; + version = rev; + + src = fetchFromGitHub { + owner = "goatcorp"; + repo = "XIVLauncher.Core"; + inherit rev; + hash = "sha256-kEMqqwlp+ZHjrEz6K7nYXyi0L8VAy1rHW2bOHEk1F6M="; + fetchSubmodules = true; + }; + + patches = [ ./patches/no-check-wine64.patch ]; + + nativeBuildInputs = [ + copyDesktopItems + makeWrapper + ]; + + buildInputs = with gst_all_1; [ + gstreamer + gst-plugins-base + gst-plugins-good + gst-plugins-bad + gst-plugins-ugly + gst-libav + ]; + + projectFile = "src/XIVLauncher.Core/XIVLauncher.Core.csproj"; + # File generated with `nix-build -A xivlauncher.passthru.fetch-deps`. + nugetDeps = ./deps.json; + + # Please do not unpin these even if they match the defaults, xivlauncher is sensitive to .NET versions. + dotnet-sdk = + with dotnetCorePackages; + sdk_10_0 + // { + inherit (sdk_9_0) + packages + targetPackages + ; + }; + + dotnetFlags = [ + "-p:BuildHash=${rev}" + "-p:PublishSingleFile=false" + ]; + + postPatch = '' + substituteInPlace lib/FFXIVQuickLauncher/src/XIVLauncher.Common/Game/Patch/Acquisition/Aria/AriaPatchAcquisition.cs \ + --replace-fail 'ariaPath = "aria2c"' 'ariaPath = "${aria2}/bin/aria2c"' + ''; + + postInstall = '' + mkdir -p $out/share/pixmaps + cp src/XIVLauncher.Core/Resources/logo.png $out/share/pixmaps/xivlauncher.png + ''; + + postFixup = + lib.optionalString useSteamRun ( + let + steam-run = + (steam.override { + extraPkgs = pkgs: [ pkgs.libunwind ]; + extraProfile = '' + unset TZ + ''; + }).run; + in + '' + substituteInPlace $out/bin/XIVLauncher.Core \ + --replace-fail 'exec' 'exec ${steam-run}/bin/steam-run' + '' + ) + + '' + wrapProgram $out/bin/XIVLauncher.Core --prefix GST_PLUGIN_SYSTEM_PATH_1_0 ":" "$GST_PLUGIN_SYSTEM_PATH_1_0" + # The reference to aria2 gets mangled as UTF-16LE and isn't detectable by nix: https://github.com/NixOS/nixpkgs/issues/220065 + mkdir -p $out/nix-support + echo ${aria2} >> $out/nix-support/depends + ''; + + executables = [ "XIVLauncher.Core" ]; + + runtimeDeps = [ + sdl3 + libdecor + libsecret + glib + gnutls + ]; + + desktopItems = [ + (makeDesktopItem { + name = "xivlauncher"; + exec = "XIVLauncher.Core"; + icon = "xivlauncher"; + desktopName = "XIVLauncher"; + comment = meta.description; + categories = [ "Game" ]; + startupWMClass = "XIVLauncher.Core"; + }) + ]; + + meta = { + description = "Custom launcher for FFXIV"; + homepage = "https://github.com/goatcorp/XIVLauncher.Core"; + license = lib.licenses.gpl3; + + maintainers = with lib.maintainers; [ + blooym + keysmashes + witchof0x20 + ]; + + platforms = [ "x86_64-linux" ]; + mainProgram = "XIVLauncher.Core"; + }; +} diff --git a/packages/xivlauncher/patches/no-check-wine64.patch b/packages/xivlauncher/patches/no-check-wine64.patch new file mode 100644 index 0000000..45dbc96 --- /dev/null +++ b/packages/xivlauncher/patches/no-check-wine64.patch @@ -0,0 +1,26 @@ +diff --git a/src/XIVLauncher.Common.Unix/Compatibility/CompatibilityTools.cs b/src/XIVLauncher.Common.Unix/Compatibility/CompatibilityTools.cs +index 864000f..510e4ff 100644 +--- a/src/XIVLauncher.Common.Unix/Compatibility/CompatibilityTools.cs ++++ b/src/XIVLauncher.Common.Unix/Compatibility/CompatibilityTools.cs +@@ -28,7 +28,7 @@ public class CompatibilityTools + private string WineBinPath => Settings.StartupType == WineStartupType.Managed ? + Path.Combine(wineDirectory.FullName, Settings.Release.Name, "bin") : + Settings.CustomBinPath; +- private string Wine64Path => Path.Combine(WineBinPath, "wine64"); ++ private string Wine64Path => Path.Combine(WineBinPath, "wine"); + private string WineServerPath => Path.Combine(WineBinPath, "wineserver"); + + private readonly DxvkVersion dxvkVersion; +diff --git a/src/XIVLauncher.Core/Components/MainPage/MainPage.cs b/src/XIVLauncher.Core/Components/MainPage/MainPage.cs +index 3943c15..ee44782 100644 +--- a/src/XIVLauncher.Core/Components/MainPage/MainPage.cs ++++ b/src/XIVLauncher.Core/Components/MainPage/MainPage.cs +@@ -688,7 +688,7 @@ public class MainPage : Page + else if (!Directory.Exists(App.Settings.WineBinaryPath)) + throw new InvalidOperationException("Custom wine binary path is invalid: no such directory.\n" + + "Check path carefully for typos: " + App.Settings.WineBinaryPath); +- else if (!File.Exists(Path.Combine(App.Settings.WineBinaryPath, "wine64"))) ++ else if (!File.Exists(Path.Combine(App.Settings.WineBinaryPath, "wine"))) + throw new InvalidOperationException("Custom wine binary path is invalid: no wine64 found at that location.\n" + + "Check path carefully for typos: " + App.Settings.WineBinaryPath); +