From 3c986ff650f04bb19597e3d519d3ebcfbd9e18a7 Mon Sep 17 00:00:00 2001 From: Chris Wells Date: Thu, 16 Oct 2025 12:41:27 -0500 Subject: qmk_firmware package and started writing build modules --- .gitignore | 2 + flake.lock | 111 +++++++++++++++++++++++++++++++++++ flake.nix | 42 ++++++++++++- keyboards/f62/default.nix | 23 ++++++++ keyboards/f77/default.nix | 23 ++++++++ keyboards/nk87/default.nix | 19 ++++++ keyboards/nk_classic_tkl/default.nix | 19 ++++++ keyboards/steezy60/default.nix | 21 +++++++ keyboards/xd60/default.nix | 19 ++++++ keyboards/xd84pro/default.nix | 19 ++++++ keyboards/xd87/default.nix | 19 ++++++ modules/default.nix | 40 ++++++++----- overlays/default.nix | 15 +++++ pkgs/qmk_firmware.nix | 26 ++++++++ 14 files changed, 382 insertions(+), 16 deletions(-) create mode 100644 .gitignore create mode 100644 flake.lock create mode 100644 keyboards/f62/default.nix create mode 100644 keyboards/f77/default.nix create mode 100644 keyboards/nk87/default.nix create mode 100644 keyboards/nk_classic_tkl/default.nix create mode 100644 keyboards/steezy60/default.nix create mode 100644 keyboards/xd60/default.nix create mode 100644 keyboards/xd84pro/default.nix create mode 100644 keyboards/xd87/default.nix create mode 100644 overlays/default.nix create mode 100644 pkgs/qmk_firmware.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..726d2d6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +result +.direnv diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..dbb3997 --- /dev/null +++ b/flake.lock @@ -0,0 +1,111 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1759362264, + "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "758cf7296bee11f1706a574c77d072b8a7baa881", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1760630522, + "narHash": "sha256-H7Rw2hQbJO4v60jhqiYo/oftvcW6lnsF16PHRELGVPM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "8af9bf8c93e208784d682613820cb606a963debc", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1754788789, + "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "a73b9c743612e4244d865a2fdee11865283c04e6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1754340878, + "narHash": "sha256-lgmUyVQL9tSnvvIvBp7x1euhkkCho7n3TMzgjdvgPoU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "cab778239e705082fe97bb4990e0d24c50924c04", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "systems": "systems", + "treefmt-nix": "treefmt-nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1760120816, + "narHash": "sha256-gq9rdocpmRZCwLS5vsHozwB6b5nrOBDNc2kkEaTXHfg=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "761ae7aff00907b607125b2f57338b74177697ed", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index 739f1cf..a51f8f7 100644 --- a/flake.nix +++ b/flake.nix @@ -5,9 +5,49 @@ nixpkgs.url = "github:nixos/nixpkgs"; flake-parts.url = "github:hercules-ci/flake-parts"; systems.url = "github:nix-systems/default"; + treefmt-nix.url = "github:numtide/treefmt-nix"; }; - outputs = inputs@{self, ... }: inputs.flake-parts.mkFlake { inherit inputs self; } { + outputs = inputs@{self, ... }: inputs.flake-parts.lib.mkFlake { inherit inputs self; } { systems = import inputs.systems; + + flake.overlays.default = import ./overlays; + + imports = [ + inputs.treefmt-nix.flakeModule + ]; + + perSystem = { pkgs, config, system, ... }: { + + _module.args.pkgs = import inputs.nixpkgs { + inherit system; + overlays = [ self.overlays.default ]; + }; + + packages = { + inherit (pkgs) qmk_firmware qmk_firmware-modelf; + }; + + + treefmt = { + programs = { + clang-format.enable = true; + nixfmt = { + enable = true; + strict = true; + }; + }; + }; + + devShells.default = pkgs.mkShellNoCC { + inputsFrom = [ config.treefmt.build.devShell ]; + nativeBuildInputs = with pkgs; [ + nixd + statix + deadnix + ]; + }; + + }; }; } diff --git a/keyboards/f62/default.nix b/keyboards/f62/default.nix new file mode 100644 index 0000000..b3586ea --- /dev/null +++ b/keyboards/f62/default.nix @@ -0,0 +1,23 @@ +{ pkgs, ... }: let + base = { + firmware = { + type = "qmk"; + qmk_firmware = pkgs.qmk_firwmare-modelf; + }; + qmk.keyboard.name = "model_f_labs/f62"; + }; +in { + kbs = { + "f62:default" = base; + + "f62:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/f77/default.nix b/keyboards/f77/default.nix new file mode 100644 index 0000000..33f8a07 --- /dev/null +++ b/keyboards/f77/default.nix @@ -0,0 +1,23 @@ +{ pkgs, ... }: let + base = { + firmware = { + type = "qmk"; + qmk_firmware = pkgs.qmk_firmware-modelf; + }; + qmk.keyboard.name = "model_f_labs/f77"; + }; +in { + kbds = { + "f77:default" = base; + + "f77:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/nk87/default.nix b/keyboards/nk87/default.nix new file mode 100644 index 0000000..82e163d --- /dev/null +++ b/keyboards/nk87/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: let + base = { + firmware.type = "qmk"; + qmk.keyboard.name = "novelkeys/nk87"; + }; +in { + kbds = { + "nk87:default" = base; + "nk87:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/nk_classic_tkl/default.nix b/keyboards/nk_classic_tkl/default.nix new file mode 100644 index 0000000..5da4e9b --- /dev/null +++ b/keyboards/nk_classic_tkl/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: let + base = { + firmware.type = "qmk"; + qmk.keyboard.name = "novelkeys/nk_classic_tkl"; + }; +in { + kbds = { + "nk_classic:default" = base; + "nk_classic:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/steezy60/default.nix b/keyboards/steezy60/default.nix new file mode 100644 index 0000000..7226430 --- /dev/null +++ b/keyboards/steezy60/default.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: let + base = { + qmk.keyboard = { + name = "4pplet/steezy60"; + revision = "rev_a"; + }; + }; +in { + kbds = { + "steezy:default" = base; + "steezy:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +}; diff --git a/keyboards/xd60/default.nix b/keyboards/xd60/default.nix new file mode 100644 index 0000000..e8320ff --- /dev/null +++ b/keyboards/xd60/default.nix @@ -0,0 +1,19 @@ +{...}: let + base = { + firmware.type = "qmk"; + qmk.keyboard.name = "kprepublic/xd60"; + }; +in { + kbds = { + "xd60:default" = base; + "xd60:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/xd84pro/default.nix b/keyboards/xd84pro/default.nix new file mode 100644 index 0000000..cfd4408 --- /dev/null +++ b/keyboards/xd84pro/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: let + base = { + firmware.type = "qmk"; + qmk.keyboard.name = "xiudi/xd84pro"; + }; +in { + kbds = { + "xd87:default" = base; + "xd87:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/keyboards/xd87/default.nix b/keyboards/xd87/default.nix new file mode 100644 index 0000000..cfd4408 --- /dev/null +++ b/keyboards/xd87/default.nix @@ -0,0 +1,19 @@ +{ pkgs, ... }: let + base = { + firmware.type = "qmk"; + qmk.keyboard.name = "xiudi/xd84pro"; + }; +in { + kbds = { + "xd87:default" = base; + "xd87:me" = base // { + qmk.keymap = rec { + name = "me"; + src = builtins.path { + inherit name; + path = ./.; + }; + }; + }; + }; +} diff --git a/modules/default.nix b/modules/default.nix index c5b8e4e..b6ac53a 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -19,7 +19,9 @@ in { kbds = mkOption { default = {}; - type = types.attrsOf <| types.submodule (args: { + type = types.attrsOf <| types.submodule (args: let + cfg = args.config; + in { options = { firmware = { type = mkOption { @@ -40,32 +42,40 @@ in { name = mkOption { type = types.str; description = "path to keyboard"; + example = "4pplet/steezy60"; }; revision = mkOption { type = types.nullOr types.str; description = "keyboard revision"; + example = "rev_a" }; - _path = mkOption { + _basePath = mkOption { type = types.str; - default = lib.concatStringsSep "/" ([ args.config.name ] ++ optional (args.config.revision != null) args.config.revision); + internal = true; + default = "keyboards/${cfg.qmk.keyboard.name}"; }; - _keymapsPath = mkOption { + _path = mkOption { type = types.str; - default = lib.concatStringsSep [ args.config.qmk.keyboard._path "keymaps" ]; + internal = true + default = lib.concatStringsSep "/" ([cfg.qmk.keyboard.basePath] ++ optional (cfg.qmk.keyboard.revision != null) cfg.qmk.keyboard.revision); }; + }; keymap = { name = mkOption { type = types.str; + default = "default"; + example = "default"; }; _path = mkOption { type = types.str; - default = "${args.config.qmk.keyboard._path}/keymaps/${args.config.qmk.keymap.name}"; + default = "${cfg.qmk.keyboard._basePath}/keymaps/${cfg.qmk.keymap.name}"; + internal = true; }; src = mkOption { @@ -78,13 +88,13 @@ in { bin = mkOption { type = types.path; default = let - ksrc = args.config.keymap.src; + ksrc = cfg.qmk.keymap.src; in pkgs.stdenv.mkDerivation { - name = "qmk:${args.config.qmk.keyboard._path}:${args.config.qmk.keymap.name}"; + name = "qmk:${cfg.qmk.keyboard._path}:${cfg.qmk.keymap.name}"; srcs = [ { name = "qmk_firmware"; - src = args.config.firmware.qmk_firmware; + src = cfg.qmk_firmware; } ] ++ lib.optional (ksrc != null) { name = "keymap"; @@ -93,18 +103,18 @@ in { sourceRoot = "qmk_firmware"; - nativeBuildImports = [ - pkgs.qmk - ]; + # nativeBuildImports = [ + # pkgs.qmk + # ]; postUnpack = lib.optionalString (ksrc != null) '' - mkdir -pv "keyboards/${args.config.keymap._path}" - cp -rv ../keymap/* "keyboards/${args.config.keymap._path}" + mkdir -pv "${cfg.qmk.keymap._path}" + cp -rv ../keymap/* "${cfg.qmk.keymap._path}" ''; buildPhase = '' SKIP_GIT=yes SKIP_VERSION=yes \ - make "keyboards/${args.config.keyboard._path}:${args.config.keymap.name}" + make "${cfg.qmk.keyboard._path}:${cfg.qmk.keymap.name}" ''; installPhase = '' diff --git a/overlays/default.nix b/overlays/default.nix new file mode 100644 index 0000000..3a6d3bb --- /dev/null +++ b/overlays/default.nix @@ -0,0 +1,15 @@ +final: prev: { + qmk_firmware = prev.callPackage ../pkgs/qmk_firmware.nix {}; + + qmk_firmware-modelf = final.qmk_firmware.overrideAttrs { + version = "model_f_labs"; + + src = prev.fetchFromGitHub { + owner = "matthew-wolf-n4mtt"; + repo = "qmk_firmware"; + fetchSubmodules = true; + rev = "93734d1"; + hash = "sha256-E5zVcfELcFTqJspAyQmnD2qGRzFw4Y48Ce5c9FHl7Bk="; + }; + }; +} diff --git a/pkgs/qmk_firmware.nix b/pkgs/qmk_firmware.nix new file mode 100644 index 0000000..49b0de6 --- /dev/null +++ b/pkgs/qmk_firmware.nix @@ -0,0 +1,26 @@ +{ stdenvNoCC, fetchFromGitHub, unstableGitUpdater, lib }: +stdenvNoCC.mkDerivation { + pname = "qmk_firmware"; + version = "unstable"; + + src = fetchFromGitHub { + owner = "qmk"; + repo = "qmk_firmware"; + fetchSubmodules = true; + rev = "608bcf0"; + hash = "sha256-vYKrcaLIq194Q+OgcawwrwZonxySBAEQF4CTD7dYUtI="; + }; + + phases = [ "installPhase" ]; + + installPhase = '' + cp -r --no-preserve=mode $src $out + ''; + + passthru.updateScript = unstableGitUpdater {}; + + meta = with lib; { + homepage = "https://github.com/qmk/qmk_firmware"; + license = licenses.gpl2; + }; +} -- cgit v1.2.3