{ lib, flake-parts-lib, }: let inherit (lib) mkOption types; inherit (flake-parts-lib) mkPerSystemModule; in { options.perSystem = mkPerSystemModule ({ pkgs, system, config', ... }: { kbdConfigurations = { firmware = { qmk_firmware = mkOption { type = types.path; default = pkgs.qmk_firmware; description = "Default qmk_firmware to use"; }; }; kbds = mkOption { default = {}; type = types.attrsOf <| types.submodule (args: let cfg = args.config; in { options = { firmware = { type = mkOption { type = types.enum [ "qmk" ]; default = "qmk"; description = "Keyboard firmware type. Extensible for other firmwares"; }; qmk_firmware = mkOption { type = types.path; default = config'.kbdConfigurations.qmk_firmware; description = "qmk_firmware to use"; }; }; qmk = { keyboard = { 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" }; _basePath = mkOption { type = types.str; internal = true; default = "keyboards/${cfg.qmk.keyboard.name}"; }; _path = mkOption { type = types.str; 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 = "${cfg.qmk.keyboard._basePath}/keymaps/${cfg.qmk.keymap.name}"; internal = true; }; src = mkOption { type = types.nullOr types.path; default = null; }; }; build = { bin = mkOption { type = types.path; default = let ksrc = cfg.qmk.keymap.src; in pkgs.stdenv.mkDerivation { name = "qmk:${cfg.qmk.keyboard._path}:${cfg.qmk.keymap.name}"; srcs = [ { name = "qmk_firmware"; src = cfg.qmk_firmware; } ] ++ lib.optional (ksrc != null) { name = "keymap"; src = ksrc; }; sourceRoot = "qmk_firmware"; # nativeBuildImports = [ # pkgs.qmk # ]; postUnpack = lib.optionalString (ksrc != null) '' mkdir -pv "${cfg.qmk.keymap._path}" cp -rv ../keymap/* "${cfg.qmk.keymap._path}" ''; buildPhase = '' SKIP_GIT=yes SKIP_VERSION=yes \ make "${cfg.qmk.keyboard._path}:${cfg.qmk.keymap.name}" ''; installPhase = '' mkdir -p $out cp -v *.{bin,hex} $out/ ''; }; }; flash = mkOption { type = types.package; }; }; }; }; }); }; }; }) }