aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2021-08-18 21:52:41 +0100
committerGitHub <noreply@github.com>2021-08-18 21:52:41 +0100
commit2e734fb6b9e3480854b794218d381559aab431b7 (patch)
tree2bec5639b3dd200c640cd8c76b8c2b614f67e34b
parent10fab4ec077354f41d19f01798a49e5864a189cd (diff)
downloadqmk_firmware-2e734fb6b9e3480854b794218d381559aab431b7.tar.gz
qmk_firmware-2e734fb6b9e3480854b794218d381559aab431b7.zip
Add config.h and rules.mk support for data driven keymaps (#12859)
* Add config.h and rules.mk support for data driven keymaps * tidy up after rebase * Rename key as it can contain more than just keyboard overrides * tidy up after rebase * Add validation
-rw-r--r--build_json.mk14
-rw-r--r--build_keyboard.mk46
-rw-r--r--build_layout.mk5
-rw-r--r--data/mappings/info_config.json2
-rw-r--r--data/schemas/keymap.jsonschema24
-rw-r--r--keyboards/thevankeyboards/minivan/keymaps/via/keymap.json11
-rw-r--r--keyboards/thevankeyboards/minivan/keymaps/via/rules.mk2
-rwxr-xr-xlib/python/qmk/cli/generate/config_h.py29
-rwxr-xr-xlib/python/qmk/cli/generate/keyboard_h.py7
-rwxr-xr-xlib/python/qmk/cli/generate/rules_mk.py30
10 files changed, 101 insertions, 69 deletions
diff --git a/build_json.mk b/build_json.mk
index 28659f260..0c034eb2a 100644
--- a/build_json.mk
+++ b/build_json.mk
@@ -1,31 +1,17 @@
1# Look for a json keymap file 1# Look for a json keymap file
2ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","") 2ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
3 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
4 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json 3 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
5 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5) 4 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
6else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","") 5else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
7 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
8 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json 6 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
9 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4) 7 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
10else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","") 8else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
11 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
12 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json 9 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
13 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3) 10 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
14else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","") 11else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
15 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
16 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json 12 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
17 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2) 13 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
18else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","") 14else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
19 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
20 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json 15 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
21 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1) 16 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
22endif 17endif
23
24# Load the keymap-level rules.mk if exists
25ifneq ("$(wildcard $(KEYMAP_PATH))", "")
26 -include $(KEYMAP_PATH)/rules.mk
27endif
28
29# Generate the keymap.c
30$(KEYMAP_C): $(KEYMAP_JSON)
31 $(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
diff --git a/build_keyboard.mk b/build_keyboard.mk
index 46d1e4566..daef76080 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -23,6 +23,15 @@ KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD_FILESAFE)
23# Force expansion 23# Force expansion
24TARGET := $(TARGET) 24TARGET := $(TARGET)
25 25
26ifneq ($(FORCE_LAYOUT),)
27 TARGET := $(TARGET)_$(FORCE_LAYOUT)
28endif
29
30# Object files and generated keymap directory
31# To put object files in current directory, use a dot (.), do NOT make
32# this an empty or blank macro!
33KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
34
26# For split boards we need to set a master half. 35# For split boards we need to set a master half.
27MASTER ?= left 36MASTER ?= left
28ifdef master 37ifdef master
@@ -100,18 +109,9 @@ MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
100MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP) 109MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
101 110
102# Pull in rules from info.json 111# Pull in rules from info.json
103INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk) 112INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_rules.mk)
104include $(INFO_RULES_MK) 113include $(INFO_RULES_MK)
105 114
106ifneq ($(FORCE_LAYOUT),)
107 TARGET := $(TARGET)_$(FORCE_LAYOUT)
108endif
109
110# Object files and generated keymap directory
111# To put object files in current directory, use a dot (.), do NOT make
112# this an empty or blank macro!
113KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
114
115# Check for keymap.json first, so we can regenerate keymap.c 115# Check for keymap.json first, so we can regenerate keymap.c
116include build_json.mk 116include build_json.mk
117 117
@@ -146,6 +146,29 @@ ifeq ("$(wildcard $(KEYMAP_PATH))", "")
146 endif 146 endif
147endif 147endif
148 148
149# Have we found a keymap.json?
150ifneq ("$(wildcard $(KEYMAP_JSON))", "")
151 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
152 KEYMAP_H := $(KEYMAP_OUTPUT)/config.h
153
154 # Load the keymap-level rules.mk if exists
155 -include $(KEYMAP_PATH)/rules.mk
156
157 # Load any rules.mk content from keymap.json
158 INFO_RULES_MK = $(shell (QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/rules.mk)
159 include $(INFO_RULES_MK)
160
161# Add rules to enerate the keymap files - indentation here is important
162$(KEYMAP_OUTPUT)/keymap.c: $(KEYMAP_JSON)
163 (QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
164
165$(KEYMAP_OUTPUT)/config.h: $(KEYMAP_JSON)
166 (QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --keymap $(KEYMAP) --output $(KEYMAP_OUTPUT)/config.h
167
168generated-files: $(KEYMAP_OUTPUT)/config.h $(KEYMAP_OUTPUT)/keymap.c
169
170endif
171
149ifeq ($(strip $(CTPC)), yes) 172ifeq ($(strip $(CTPC)), yes)
150 CONVERT_TO_PROTON_C=yes 173 CONVERT_TO_PROTON_C=yes
151endif 174endif
@@ -336,6 +359,9 @@ endif
336ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") 359ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
337 CONFIG_H += $(KEYMAP_PATH)/config.h 360 CONFIG_H += $(KEYMAP_PATH)/config.h
338endif 361endif
362ifneq ("$(KEYMAP_H)","")
363 CONFIG_H += $(KEYMAP_H)
364endif
339 365
340# project specific files 366# project specific files
341SRC += \ 367SRC += \
diff --git a/build_layout.mk b/build_layout.mk
index 649dfb2c7..b4b00793e 100644
--- a/build_layout.mk
+++ b/build_layout.mk
@@ -7,7 +7,6 @@ define SEARCH_LAYOUTS_REPO
7 LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c 7 LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
8 ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","") 8 ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","")
9 -include $$(LAYOUT_KEYMAP_PATH)/rules.mk 9 -include $$(LAYOUT_KEYMAP_PATH)/rules.mk
10 KEYMAP_C := $(KEYMAP_OUTPUT)/keymap.c
11 KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON) 10 KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON)
12 KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH) 11 KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
13 else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","") 12 else ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
@@ -31,7 +30,3 @@ ifneq ($(FORCE_LAYOUT),)
31endif 30endif
32 31
33$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS))) 32$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
34
35# Use rule from build_json.mk, but update prerequisite in case KEYMAP_JSON was updated
36$(KEYMAP_C): $(KEYMAP_JSON)
37 $(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
diff --git a/data/mappings/info_config.json b/data/mappings/info_config.json
index 18477f912..72bb0f4a1 100644
--- a/data/mappings/info_config.json
+++ b/data/mappings/info_config.json
@@ -18,6 +18,8 @@
18 "DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false}, 18 "DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
19 "DIODE_DIRECTION": {"info_key": "diode_direction"}, 19 "DIODE_DIRECTION": {"info_key": "diode_direction"},
20 "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"}, 20 "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},
21 "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR": {"info_key": "dynamic_keymap.eeprom_max_addr", "value_type": "int"},
22 "DYNAMIC_KEYMAP_LAYER_COUNT": {"info_key": "dynamic_keymap.layer_count", "value_type": "int"},
21 "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"}, 23 "IGNORE_MOD_TAP_INTERRUPT": {"info_key": "tapping.ignore_mod_tap_interrupt", "value_type": "bool"},
22 "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"}, 24 "IGNORE_MOD_TAP_INTERRUPT_PER_KEY": {"info_key": "tapping.ignore_mod_tap_interrupt_per_key", "value_type": "bool"},
23 "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"}, 25 "LAYOUTS": {"info_key": "layout_aliases", "value_type": "mapping"},
diff --git a/data/schemas/keymap.jsonschema b/data/schemas/keymap.jsonschema
new file mode 100644
index 000000000..35c5b5c98
--- /dev/null
+++ b/data/schemas/keymap.jsonschema
@@ -0,0 +1,24 @@
1{
2 "$schema": "http://json-schema.org/draft-07/schema#",
3 "$id": "qmk.keymap.v1",
4 "title": "Keymap Information",
5 "type": "object",
6 "properties": {
7 "author": {"$ref": "qmk.definitions.v1#/text_identifier"},
8 "keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"},
9 "keymap": {"$ref": "qmk.definitions.v1#/text_identifier"},
10 "layout": {"$ref": "qmk.definitions.v1#/layout_macro"},
11 "layers": {
12 "type": "array",
13 "items": {
14 "type": "array",
15 "items": {"type": "string"}
16 }
17 },
18 "config": {"$ref": "qmk.keyboard.v1"},
19 "notes": {
20 "type": "string",
21 "description": "asdf"
22 }
23 }
24} \ No newline at end of file
diff --git a/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json b/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json
index 1e9ef8810..54ceb5c34 100644
--- a/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json
+++ b/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json
@@ -7,5 +7,14 @@
7 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"], 7 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"],
8 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"], 8 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"],
9 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"] 9 ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"]
10 ] 10 ],
11 "config": {
12 "features": {
13 "via": true,
14 "lto": true
15 },
16 "dynamic_keymap": {
17 "layer_count": 4
18 }
19 }
11} 20}
diff --git a/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk
deleted file mode 100644
index 36b7ba9cb..000000000
--- a/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk
+++ /dev/null
@@ -1,2 +0,0 @@
1VIA_ENABLE = yes
2LTO_ENABLE = yes
diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py
index c0c148f1c..ca7e14fe6 100755
--- a/lib/python/qmk/cli/generate/config_h.py
+++ b/lib/python/qmk/cli/generate/config_h.py
@@ -5,11 +5,11 @@ from pathlib import Path
5from dotty_dict import dotty 5from dotty_dict import dotty
6from milc import cli 6from milc import cli
7 7
8from qmk.decorators import automagic_keyboard, automagic_keymap
9from qmk.info import info_json 8from qmk.info import info_json
10from qmk.json_schema import json_load 9from qmk.json_schema import json_load, validate
11from qmk.keyboard import keyboard_completer, keyboard_folder 10from qmk.keyboard import keyboard_completer, keyboard_folder
12from qmk.path import is_keyboard, normpath 11from qmk.keymap import locate_keymap
12from qmk.path import normpath
13 13
14 14
15def direct_pins(direct_pins, postfix): 15def direct_pins(direct_pins, postfix):
@@ -157,25 +157,22 @@ def generate_split_config(kb_info_json, config_h_lines):
157 157
158@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') 158@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
159@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") 159@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
160@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate config.h for.') 160@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate config.h for.')
161@cli.argument('-km', '--keymap', arg_only=True, help='Keymap to generate config.h for.')
161@cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True) 162@cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True)
162@automagic_keyboard
163@automagic_keymap
164def generate_config_h(cli): 163def generate_config_h(cli):
165 """Generates the info_config.h file. 164 """Generates the info_config.h file.
166 """ 165 """
167 # Determine our keyboard(s) 166 # Determine our keyboard/keymap
168 if not cli.config.generate_config_h.keyboard: 167 if cli.args.keymap:
169 cli.log.error('Missing parameter: --keyboard') 168 km = locate_keymap(cli.args.keyboard, cli.args.keymap)
170 cli.subcommands['info'].print_help() 169 km_json = json_load(km)
171 return False 170 validate(km_json, 'qmk.keymap.v1')
172 171 kb_info_json = dotty(km_json.get('config', {}))
173 if not is_keyboard(cli.config.generate_config_h.keyboard): 172 else:
174 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_config_h.keyboard) 173 kb_info_json = dotty(info_json(cli.args.keyboard))
175 return False
176 174
177 # Build the info_config.h file. 175 # Build the info_config.h file.
178 kb_info_json = dotty(info_json(cli.config.generate_config_h.keyboard))
179 config_h_lines = ['/* This file was generated by `qmk generate-config-h`. Do not edit or copy.' ' */', '', '#pragma once'] 176 config_h_lines = ['/* This file was generated by `qmk generate-config-h`. Do not edit or copy.' ' */', '', '#pragma once']
180 177
181 generate_config_items(kb_info_json, config_h_lines) 178 generate_config_items(kb_info_json, config_h_lines)
diff --git a/lib/python/qmk/cli/generate/keyboard_h.py b/lib/python/qmk/cli/generate/keyboard_h.py
index 22500dbc9..c9d7f549b 100755
--- a/lib/python/qmk/cli/generate/keyboard_h.py
+++ b/lib/python/qmk/cli/generate/keyboard_h.py
@@ -2,7 +2,6 @@
2""" 2"""
3from milc import cli 3from milc import cli
4 4
5from qmk.decorators import automagic_keyboard, automagic_keymap
6from qmk.info import info_json 5from qmk.info import info_json
7from qmk.keyboard import keyboard_completer, keyboard_folder 6from qmk.keyboard import keyboard_completer, keyboard_folder
8from qmk.path import normpath 7from qmk.path import normpath
@@ -29,14 +28,12 @@ def would_populate_layout_h(keyboard):
29 28
30@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') 29@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
31@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") 30@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
32@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate keyboard.h for.') 31@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate keyboard.h for.')
33@cli.subcommand('Used by the make system to generate keyboard.h from info.json', hidden=True) 32@cli.subcommand('Used by the make system to generate keyboard.h from info.json', hidden=True)
34@automagic_keyboard
35@automagic_keymap
36def generate_keyboard_h(cli): 33def generate_keyboard_h(cli):
37 """Generates the keyboard.h file. 34 """Generates the keyboard.h file.
38 """ 35 """
39 has_layout_h = would_populate_layout_h(cli.config.generate_keyboard_h.keyboard) 36 has_layout_h = would_populate_layout_h(cli.args.keyboard)
40 37
41 # Build the layouts.h file. 38 # Build the layouts.h file.
42 keyboard_h_lines = ['/* This file was generated by `qmk generate-keyboard-h`. Do not edit or copy.' ' */', '', '#pragma once', '#include "quantum.h"'] 39 keyboard_h_lines = ['/* This file was generated by `qmk generate-keyboard-h`. Do not edit or copy.' ' */', '', '#pragma once', '#include "quantum.h"']
diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py
index 2712b81cb..cdf17dfbc 100755
--- a/lib/python/qmk/cli/generate/rules_mk.py
+++ b/lib/python/qmk/cli/generate/rules_mk.py
@@ -5,11 +5,11 @@ from pathlib import Path
5from dotty_dict import dotty 5from dotty_dict import dotty
6from milc import cli 6from milc import cli
7 7
8from qmk.decorators import automagic_keyboard, automagic_keymap
9from qmk.info import info_json 8from qmk.info import info_json
10from qmk.json_schema import json_load 9from qmk.json_schema import json_load, validate
11from qmk.keyboard import keyboard_completer, keyboard_folder 10from qmk.keyboard import keyboard_completer, keyboard_folder
12from qmk.path import is_keyboard, normpath 11from qmk.keymap import locate_keymap
12from qmk.path import normpath
13 13
14 14
15def process_mapping_rule(kb_info_json, rules_key, info_dict): 15def process_mapping_rule(kb_info_json, rules_key, info_dict):
@@ -39,23 +39,21 @@ def process_mapping_rule(kb_info_json, rules_key, info_dict):
39@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to') 39@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
40@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages") 40@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
41@cli.argument('-e', '--escape', arg_only=True, action='store_true', help="Escape spaces in quiet mode") 41@cli.argument('-e', '--escape', arg_only=True, action='store_true', help="Escape spaces in quiet mode")
42@cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Keyboard to generate config.h for.') 42@cli.argument('-kb', '--keyboard', arg_only=True, type=keyboard_folder, completer=keyboard_completer, required=True, help='Keyboard to generate rules.mk for.')
43@cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True) 43@cli.argument('-km', '--keymap', arg_only=True, help='Keymap to generate rules.mk for.')
44@automagic_keyboard 44@cli.subcommand('Used by the make system to generate rules.mk from info.json', hidden=True)
45@automagic_keymap
46def generate_rules_mk(cli): 45def generate_rules_mk(cli):
47 """Generates a rules.mk file from info.json. 46 """Generates a rules.mk file from info.json.
48 """ 47 """
49 if not cli.config.generate_rules_mk.keyboard: 48 # Determine our keyboard/keymap
50 cli.log.error('Missing parameter: --keyboard') 49 if cli.args.keymap:
51 cli.subcommands['info'].print_help() 50 km = locate_keymap(cli.args.keyboard, cli.args.keymap)
52 return False 51 km_json = json_load(km)
53 52 validate(km_json, 'qmk.keymap.v1')
54 if not is_keyboard(cli.config.generate_rules_mk.keyboard): 53 kb_info_json = dotty(km_json.get('config', {}))
55 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_rules_mk.keyboard) 54 else:
56 return False 55 kb_info_json = dotty(info_json(cli.args.keyboard))
57 56
58 kb_info_json = dotty(info_json(cli.config.generate_rules_mk.keyboard))
59 info_rules_map = json_load(Path('data/mappings/info_rules.json')) 57 info_rules_map = json_load(Path('data/mappings/info_rules.json'))
60 rules_mk_lines = ['# This file was generated by `qmk generate-rules-mk`. Do not edit or copy.', ''] 58 rules_mk_lines = ['# This file was generated by `qmk generate-rules-mk`. Do not edit or copy.', '']
61 59