summaryrefslogtreecommitdiff
path: root/builddefs
diff options
context:
space:
mode:
Diffstat (limited to 'builddefs')
-rw-r--r--builddefs/build_full_test.mk37
-rw-r--r--builddefs/build_json.mk36
-rw-r--r--builddefs/build_keyboard.mk627
-rw-r--r--builddefs/build_layout.mk36
-rw-r--r--builddefs/build_test.mk95
-rw-r--r--builddefs/common_features.mk1034
-rw-r--r--builddefs/common_rules.mk408
-rw-r--r--builddefs/converters.mk34
-rw-r--r--builddefs/disable_features.mk27
-rw-r--r--builddefs/docsgen/.gitignore5
-rw-r--r--builddefs/docsgen/.vitepress/config.mts58
-rw-r--r--builddefs/docsgen/.vitepress/theme/QMKLayout.vue29
-rw-r--r--builddefs/docsgen/.vitepress/theme/custom.css19
-rw-r--r--builddefs/docsgen/.vitepress/theme/index.ts13
-rwxr-xr-xbuilddefs/docsgen/build-docs.sh6
-rw-r--r--builddefs/docsgen/package.json14
-rwxr-xr-xbuilddefs/docsgen/start-docs.sh5
-rw-r--r--builddefs/docsgen/yarn.lock820
-rw-r--r--builddefs/generic_features.mk75
-rw-r--r--builddefs/message.mk113
-rw-r--r--builddefs/show_options.mk151
-rw-r--r--builddefs/support.mk11
-rw-r--r--builddefs/testlist.mk23
23 files changed, 3676 insertions, 0 deletions
diff --git a/builddefs/build_full_test.mk b/builddefs/build_full_test.mk
new file mode 100644
index 0000000000..82bb9387a6
--- /dev/null
+++ b/builddefs/build_full_test.mk
@@ -0,0 +1,37 @@
1# Copyright 2017 Fred Sundvik
2#
3# This program is free software: you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation, either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16$(TEST_OUTPUT)_INC := \
17 tests/test_common/common_config.h
18
19$(TEST_OUTPUT)_SRC := \
20 $(QUANTUM_SRC) \
21 $(SRC) \
22 $(QUANTUM_PATH)/keymap_introspection.c \
23 tests/test_common/matrix.c \
24 tests/test_common/pointing_device_driver.c \
25 tests/test_common/test_driver.cpp \
26 tests/test_common/keyboard_report_util.cpp \
27 tests/test_common/mouse_report_util.cpp \
28 tests/test_common/test_fixture.cpp \
29 tests/test_common/test_keymap_key.cpp \
30 tests/test_common/test_logger.cpp \
31 $(patsubst $(ROOTDIR)/%,%,$(wildcard $(TEST_PATH)/*.cpp))
32
33$(TEST_OUTPUT)_DEFS := $(OPT_DEFS) "-DKEYMAP_C=\"keymap.c\""
34
35$(TEST_OUTPUT)_CONFIG := $(TEST_PATH)/config.h
36
37VPATH += $(TOP_DIR)/tests/test_common
diff --git a/builddefs/build_json.mk b/builddefs/build_json.mk
new file mode 100644
index 0000000000..54f256480b
--- /dev/null
+++ b/builddefs/build_json.mk
@@ -0,0 +1,36 @@
1# Look for a json keymap file
2ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","")
3 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json
4 KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_5)
5else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.json)","")
6 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_4)/keymap.json
7 KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_4)
8else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.json)","")
9 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_3)/keymap.json
10 KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_3)
11else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.json)","")
12 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_2)/keymap.json
13 KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_2)
14else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
15 KEYMAP_JSON := $(MAIN_KEYMAP_PATH_1)/keymap.json
16 KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_1)
17endif
18
19ifneq ($(QMK_USERSPACE),)
20 ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json)","")
21 KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.json
22 KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
23 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json)","")
24 KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.json
25 KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
26 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json)","")
27 KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.json
28 KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
29 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json)","")
30 KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.json
31 KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
32 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json)","")
33 KEYMAP_JSON := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.json
34 KEYMAP_JSON_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
35 endif
36endif
diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk
new file mode 100644
index 0000000000..0df95342f9
--- /dev/null
+++ b/builddefs/build_keyboard.mk
@@ -0,0 +1,627 @@
1# Determine what keyboard we are building and setup the build environment.
2#
3# We support folders up to 5 levels deep below `keyboards/`. This file is
4# responsible for determining which folder is being used and doing the
5# corresponding environment setup.
6
7ifndef VERBOSE
8.SILENT:
9endif
10
11.DEFAULT_GOAL := all
12
13include paths.mk
14include $(BUILDDEFS_PATH)/support.mk
15include $(BUILDDEFS_PATH)/message.mk
16
17# Helper to add defines with a 'QMK_' prefix
18define add_qmk_prefix_defs
19 ifdef $1
20 # Need to cater for 'STM32L4xx+'
21 OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
22 endif
23endef
24
25# Set the qmk cli to use
26QMK_BIN ?= qmk
27
28# Set the filename for the final firmware binary
29KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
30TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
31
32ifeq ($(strip $(DUMP_CI_METADATA)),yes)
33 $(info CI Metadata: KEYBOARD=$(KEYBOARD))
34 $(info CI Metadata: KEYMAP=$(KEYMAP))
35endif
36
37# Force expansion
38override TARGET := $(TARGET)
39
40ifneq ($(FORCE_LAYOUT),)
41 override TARGET := $(TARGET)_$(FORCE_LAYOUT)
42endif
43ifneq ($(CONVERT_TO),)
44 override TARGET := $(TARGET)_$(CONVERT_TO)
45endif
46
47# Object files and generated keymap directory
48# To put object files in current directory, use a dot (.), do NOT make
49# this an empty or blank macro!
50INTERMEDIATE_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
51
52ifdef SKIP_VERSION
53 OPT_DEFS += -DSKIP_VERSION
54endif
55
56# Generate the version.h file
57VERSION_H_FLAGS :=
58ifdef SKIP_VERSION
59VERSION_H_FLAGS += --skip-all
60endif
61ifdef SKIP_GIT
62VERSION_H_FLAGS += --skip-git
63endif
64
65# Determine which subfolders exist.
66KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
67KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
68KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2)))
69KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3)))
70KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4)))
71KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1))
72KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2))
73KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3))
74KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4))
75KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5))
76KEYBOARD_PATHS :=
77KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1)
78KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2)
79KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3)
80KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4)
81KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5)
82
83ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
84 KEYBOARD_PATHS += $(KEYBOARD_PATH_5)
85endif
86ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
87 KEYBOARD_PATHS += $(KEYBOARD_PATH_4)
88endif
89ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
90 KEYBOARD_PATHS += $(KEYBOARD_PATH_3)
91endif
92ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
93 KEYBOARD_PATHS += $(KEYBOARD_PATH_2)
94endif
95ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
96 KEYBOARD_PATHS += $(KEYBOARD_PATH_1)
97endif
98
99
100# Pull in rules.mk files from all our subfolders
101-include $(KEYBOARD_PATH_5)/rules.mk
102-include $(KEYBOARD_PATH_4)/rules.mk
103-include $(KEYBOARD_PATH_3)/rules.mk
104-include $(KEYBOARD_PATH_2)/rules.mk
105-include $(KEYBOARD_PATH_1)/rules.mk
106
107# Create dependencies on DD keyboard config - structure validated elsewhere
108DD_CONFIG_FILES :=
109ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
110 DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
111endif
112ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
113 DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
114endif
115ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
116 DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
117endif
118ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
119 DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
120endif
121ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
122 DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
123endif
124
125ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
126 DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
127endif
128ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
129 DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
130endif
131ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
132 DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
133endif
134ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
135 DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
136endif
137ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
138 DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
139endif
140
141MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
142MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
143MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
144MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
145MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
146
147# Pull in rules from DD keyboard config
148INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk)
149include $(INFO_RULES_MK)
150
151# Check for keymap.json first, so we can regenerate keymap.c
152include $(BUILDDEFS_PATH)/build_json.mk
153
154# Pull in keymap level rules.mk
155ifeq ("$(wildcard $(KEYMAP_PATH))", "")
156 # Look through the possible keymap folders until we find a matching keymap.c
157 ifneq ($(QMK_USERSPACE),)
158 ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c)","")
159 -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/rules.mk
160 KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c
161 KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
162 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c)","")
163 -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/rules.mk
164 KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c
165 KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
166 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c)","")
167 -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/rules.mk
168 KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c
169 KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
170 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c)","")
171 -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/rules.mk
172 KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c
173 KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
174 else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c)","")
175 -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/rules.mk
176 KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c
177 KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
178 endif
179 endif
180 ifeq ($(KEYMAP_PATH),)
181 ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
182 -include $(MAIN_KEYMAP_PATH_1)/rules.mk
183 KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
184 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
185 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
186 -include $(MAIN_KEYMAP_PATH_2)/rules.mk
187 KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
188 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
189 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
190 -include $(MAIN_KEYMAP_PATH_3)/rules.mk
191 KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
192 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
193 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
194 -include $(MAIN_KEYMAP_PATH_4)/rules.mk
195 KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
196 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
197 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
198 -include $(MAIN_KEYMAP_PATH_5)/rules.mk
199 KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
200 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
201 else ifneq ($(LAYOUTS),)
202 # If we haven't found a keymap yet fall back to community layouts
203 include $(BUILDDEFS_PATH)/build_layout.mk
204 else ifeq ("$(wildcard $(KEYMAP_JSON_PATH))", "") # Not finding keymap.c is fine if we found a keymap.json
205 $(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
206 # this state should never be reached
207 endif
208 endif
209endif
210
211# Have we found a keymap.json?
212ifneq ("$(wildcard $(KEYMAP_JSON))", "")
213 ifneq ("$(wildcard $(KEYMAP_C))", "")
214 # Allow a separately-found keymap.c next to keymap.json -- the keymap.c
215 # generator will include the other keymap.c in the process, if supplied.
216 OTHER_KEYMAP_C := $(KEYMAP_C)
217 OPT_DEFS += -DOTHER_KEYMAP_C=\"$(OTHER_KEYMAP_C)\"
218 endif
219
220 KEYMAP_PATH := $(KEYMAP_JSON_PATH)
221
222 KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
223 KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
224
225 ifeq ($(OTHER_KEYMAP_C),)
226 # Load the keymap-level rules.mk if exists (and we havent already loaded it for keymap.c)
227 -include $(KEYMAP_PATH)/rules.mk
228 endif
229
230 # Load any rules.mk content from keymap.json
231 INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
232 include $(INFO_RULES_MK)
233
234# Add rules to generate the keymap files - indentation here is important
235$(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
236 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
237 $(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
238 @$(BUILD_CMD)
239
240$(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
241 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
242 $(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
243 @$(BUILD_CMD)
244
245$(INTERMEDIATE_OUTPUT)/src/keymap.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
246 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
247 $(eval CMD=$(QMK_BIN) generate-keymap-h --quiet --output $(INTERMEDIATE_OUTPUT)/src/keymap.h $(KEYMAP_JSON))
248 @$(BUILD_CMD)
249
250generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c $(INTERMEDIATE_OUTPUT)/src/keymap.h
251
252endif
253
254# Community modules
255COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
256include $(COMMUNITY_RULES_MK)
257
258ifneq ($(COMMUNITY_MODULES),)
259
260$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
261 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
262 $(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
263 @$(BUILD_CMD)
264
265$(INTERMEDIATE_OUTPUT)/src/community_modules.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
266 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
267 $(eval CMD=$(QMK_BIN) generate-community-modules-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(KEYMAP_JSON))
268 @$(BUILD_CMD)
269
270$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
271 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
272 $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-c -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(KEYMAP_JSON))
273 @$(BUILD_CMD)
274
275$(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
276 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
277 $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
278 @$(BUILD_CMD)
279
280$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
281 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
282 $(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
283 @$(BUILD_CMD)
284
285$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
286 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
287 $(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
288 @$(BUILD_CMD)
289
290SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
291
292generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
293
294endif
295
296include $(BUILDDEFS_PATH)/converters.mk
297
298# Generate the board's version.h file.
299$(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(INTERMEDIATE_OUTPUT)/src/version.h)
300
301MCU_ORIG := $(MCU)
302include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk)
303
304# PLATFORM_KEY should be detected in DD keyboard config via key 'processor' (or rules.mk 'MCU')
305ifeq ($(PLATFORM_KEY),)
306 $(call CATASTROPHIC_ERROR,Platform not defined)
307endif
308PLATFORM=$(shell echo $(PLATFORM_KEY) | tr '[:lower:]' '[:upper:]')
309
310# Find all the C source files to be compiled in subfolders.
311KEYBOARD_SRC :=
312
313KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c
314KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c
315KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c
316KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c
317KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c
318
319ifneq ("$(wildcard $(KEYBOARD_C_5))","")
320 KEYBOARD_SRC += $(KEYBOARD_C_5)
321endif
322ifneq ("$(wildcard $(KEYBOARD_C_4))","")
323 KEYBOARD_SRC += $(KEYBOARD_C_4)
324endif
325ifneq ("$(wildcard $(KEYBOARD_C_3))","")
326 KEYBOARD_SRC += $(KEYBOARD_C_3)
327endif
328ifneq ("$(wildcard $(KEYBOARD_C_2))","")
329 KEYBOARD_SRC += $(KEYBOARD_C_2)
330endif
331ifneq ("$(wildcard $(KEYBOARD_C_1))","")
332 KEYBOARD_SRC += $(KEYBOARD_C_1)
333endif
334
335# Generate KEYBOARD_name_subname for all levels of the keyboard folder
336KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1)))
337KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2)))
338KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3)))
339KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4)))
340KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5)))
341
342ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
343 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
344endif
345ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
346 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
347endif
348ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
349 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
350endif
351ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
352 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
353endif
354ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
355 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
356endif
357
358# Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
359# that the same keymap may be used on multiple keyboards.
360#
361# We grab the most top-level include file that we can. That file should
362# use #ifdef statements to include all the necessary subfolder includes,
363# as described here:
364#
365# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
366#
367ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
368 FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
369endif
370ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
371 FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
372endif
373ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
374 FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
375endif
376ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
377 FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
378endif
379ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
380 FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
381endif
382
383# Find all of the config.h files and add them to our CONFIG_H define.
384CONFIG_H :=
385
386define config_h_community_module_appender
387 ifneq ("$(wildcard $(1)/config.h)","")
388 CONFIG_H += $(1)/config.h
389 endif
390endef
391$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module))))
392
393ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
394 CONFIG_H += $(KEYBOARD_PATH_5)/config.h
395endif
396ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
397 CONFIG_H += $(KEYBOARD_PATH_4)/config.h
398endif
399ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
400 CONFIG_H += $(KEYBOARD_PATH_3)/config.h
401endif
402ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
403 CONFIG_H += $(KEYBOARD_PATH_2)/config.h
404endif
405ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
406 CONFIG_H += $(KEYBOARD_PATH_1)/config.h
407endif
408
409POST_CONFIG_H :=
410
411define post_config_h_community_module_appender
412 ifneq ("$(wildcard $(1)/post_config.h)","")
413 POST_CONFIG_H += $(1)/post_config.h
414 endif
415endef
416$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module))))
417
418ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
419 POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
420endif
421ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","")
422 POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h
423endif
424ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","")
425 POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h
426endif
427ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","")
428 POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h
429endif
430ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
431 POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
432endif
433
434CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
435KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
436
437$(INTERMEDIATE_OUTPUT)/src/info_config.h: $(DD_CONFIG_FILES)
438 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
439 $(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_config.h)
440 @$(BUILD_CMD)
441
442$(INTERMEDIATE_OUTPUT)/src/default_keyboard.c: $(DD_CONFIG_FILES)
443 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
444 $(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c)
445 @$(BUILD_CMD)
446
447$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h: $(DD_CONFIG_FILES)
448 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
449 $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h)
450 @$(BUILD_CMD)
451
452generated-files: $(INTERMEDIATE_OUTPUT)/src/info_config.h $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h
453
454generated-files: $(INTERMEDIATE_OUTPUT)/src/info_deps.d
455
456$(INTERMEDIATE_OUTPUT)/src/info_deps.d:
457 @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
458 $(eval CMD=$(QMK_BIN) generate-make-dependencies -kb $(KEYBOARD) -km $(KEYMAP) -o $(INTERMEDIATE_OUTPUT)/src/info_deps.d)
459 @$(BUILD_CMD)
460
461-include $(INTERMEDIATE_OUTPUT)/src/info_deps.d
462
463.INTERMEDIATE : generated-files
464
465# Userspace setup and definitions
466ifeq ("$(USER_NAME)","")
467 USER_NAME := $(KEYMAP)
468endif
469USER_PATH := users/$(USER_NAME)
470
471# If we have userspace, then add it to the lookup VPATH
472ifneq ($(wildcard $(QMK_USERSPACE)),)
473 VPATH += $(QMK_USERSPACE)
474endif
475
476# If the equivalent users directory exists in userspace, use that in preference to anything currently in the main repo
477ifneq ($(QMK_USERSPACE),)
478 ifneq ($(wildcard $(QMK_USERSPACE)/$(USER_PATH)),)
479 USER_PATH := $(QMK_USERSPACE)/$(USER_PATH)
480 endif
481endif
482
483# Pull in user level rules.mk
484-include $(USER_PATH)/rules.mk
485ifneq ("$(wildcard $(USER_PATH)/config.h)","")
486 CONFIG_H += $(USER_PATH)/config.h
487endif
488ifneq ("$(wildcard $(USER_PATH)/post_config.h)","")
489 POST_CONFIG_H += $(USER_PATH)/post_config.h
490endif
491
492# Disable features that a keyboard doesn't support
493-include $(BUILDDEFS_PATH)/disable_features.mk
494
495ifneq ("$(CONVERTER)","")
496 -include $(CONVERTER)/post_converter.mk
497endif
498
499# Pull in post_rules.mk files from all our subfolders
500-include $(KEYBOARD_PATH_1)/post_rules.mk
501-include $(KEYBOARD_PATH_2)/post_rules.mk
502-include $(KEYBOARD_PATH_3)/post_rules.mk
503-include $(KEYBOARD_PATH_4)/post_rules.mk
504-include $(KEYBOARD_PATH_5)/post_rules.mk
505
506define post_rules_mk_community_module_includer
507 ifneq ("$(wildcard $(1)/post_rules.mk)","")
508 include $(1)/post_rules.mk
509 endif
510endef
511$(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module))))
512
513ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
514 CONFIG_H += $(KEYMAP_PATH)/config.h
515endif
516ifneq ("$(KEYMAP_H)","")
517 CONFIG_H += $(KEYMAP_H)
518endif
519
520ifeq ($(KEYMAP_C),)
521 $(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
522endif
523
524OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
525
526# If a keymap or userspace places their keymap array in another file instead, allow for it to be included
527# !!NOTE!! -- For this to work, the source file cannot be part of $(SRC), so users should not add it via `SRC += <file>`
528ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
529OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
530endif
531
532# project specific files
533SRC += \
534 $(KEYBOARD_SRC) \
535 $(QUANTUM_DIR)/keymap_introspection.c \
536 $(QUANTUM_SRC) \
537 $(QUANTUM_DIR)/main.c \
538
539# Optimize size but this may cause error "relocation truncated to fit"
540#EXTRALDFLAGS = -Wl,--relax
541
542# Search Path
543VPATH += $(KEYMAP_PATH)
544VPATH += $(USER_PATH)
545VPATH += $(KEYBOARD_PATHS)
546VPATH += $(COMMON_VPATH)
547VPATH += $(INTERMEDIATE_OUTPUT)/src
548
549include $(BUILDDEFS_PATH)/common_features.mk
550include $(BUILDDEFS_PATH)/generic_features.mk
551include $(TMK_PATH)/protocol.mk
552include $(PLATFORM_PATH)/common.mk
553
554SRC += $(patsubst %.c,%.clib,$(LIB_SRC))
555SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC))
556
557-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk
558include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
559-include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk
560
561ifneq ($(strip $(PROTOCOL)),)
562PROTOCOL_KEY = $(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]'))
563else
564PROTOCOL_KEY = $(PLATFORM_KEY)
565endif
566include $(TMK_PATH)/protocol/$(PROTOCOL_KEY)/$(PROTOCOL_KEY).mk
567
568# Setup definitions based on the selected MCU
569$(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
570$(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
571$(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
572$(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
573$(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
574$(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
575$(eval $(call add_qmk_prefix_defs,OPT,OPT))
576
577# Control whether intermediate file listings are generated
578# e.g.:
579# make handwired/onekey/blackpill_f411:default KEEP_INTERMEDIATES=yes
580# cat .build/obj_handwired_onekey_blackpill_f411_default/quantum/quantum.i | sed -e 's@^#.*@@g' -e 's@^\s*//.*@@g' -e '/^\s*$/d' | clang-format
581ifeq ($(strip $(KEEP_INTERMEDIATES)), yes)
582 OPT_DEFS += -save-temps=obj
583endif
584
585OUTPUTS := $(INTERMEDIATE_OUTPUT)
586$(INTERMEDIATE_OUTPUT)_SRC := $(SRC) $(PLATFORM_SRC)
587$(INTERMEDIATE_OUTPUT)_DEFS := \
588 -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h\" \
589 -DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
590 $(OPT_DEFS)
591$(INTERMEDIATE_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
592$(INTERMEDIATE_OUTPUT)_CONFIG := $(CONFIG_H) $(POST_CONFIG_H)
593
594# Default target.
595all: build check-size
596
597build: elf cpfirmware
598check-size: build
599check-md5: build
600objs-size: build
601
602ifneq ($(strip $(TOP_SYMBOLS)),)
603ifeq ($(strip $(TOP_SYMBOLS)),yes)
604NUM_TOP_SYMBOLS := 10
605else
606NUM_TOP_SYMBOLS := $(strip $(TOP_SYMBOLS))
607endif
608all: top-symbols
609check-size: top-symbols
610top-symbols: build
611 echo "###########################################"
612 echo "# Highest flash usage:"
613 $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [RrTt] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
614 echo "###########################################"
615 echo "# Highest RAM usage:"
616 $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [BbCDdGgSs] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
617 echo "###########################################"
618endif
619
620include $(BUILDDEFS_PATH)/show_options.mk
621include $(BUILDDEFS_PATH)/common_rules.mk
622
623# Ensure we have generated files available for each of the objects
624define GEN_FILES
625$1: generated-files
626endef
627$(foreach O,$(OBJ),$(eval $(call GEN_FILES,$(patsubst %.a,%.o,$(O)))))
diff --git a/builddefs/build_layout.mk b/builddefs/build_layout.mk
new file mode 100644
index 0000000000..7a5dbf58b6
--- /dev/null
+++ b/builddefs/build_layout.mk
@@ -0,0 +1,36 @@
1LAYOUTS_PATH := layouts
2LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/))))
3
4ifneq ($(QMK_USERSPACE),)
5 LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH))
6endif
7
8define SEARCH_LAYOUTS_REPO
9 LAYOUT_KEYMAP_PATH := $$(LAYOUTS_REPO)/$$(LAYOUT)/$$(KEYMAP)
10 LAYOUT_KEYMAP_JSON := $$(LAYOUT_KEYMAP_PATH)/keymap.json
11 LAYOUT_KEYMAP_C := $$(LAYOUT_KEYMAP_PATH)/keymap.c
12 ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_JSON))","")
13 KEYMAP_JSON := $$(LAYOUT_KEYMAP_JSON)
14 KEYMAP_JSON_PATH := $$(LAYOUT_KEYMAP_PATH)
15 endif
16 ifneq ("$$(wildcard $$(LAYOUT_KEYMAP_C))","")
17 -include $$(LAYOUT_KEYMAP_PATH)/rules.mk
18 KEYMAP_C := $$(LAYOUT_KEYMAP_C)
19 KEYMAP_PATH := $$(LAYOUT_KEYMAP_PATH)
20 endif
21endef
22
23define SEARCH_LAYOUTS
24 $$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO)))
25endef
26
27ifneq ($(FORCE_LAYOUT),)
28 ifneq (,$(findstring $(FORCE_LAYOUT),$(LAYOUTS)))
29 $(info Forcing layout: $(FORCE_LAYOUT))
30 LAYOUTS := $(FORCE_LAYOUT)
31 else
32 $(call CATASTROPHIC_ERROR,Invalid layout,Forced layout does not exist)
33 endif
34endif
35
36$(foreach LAYOUT,$(LAYOUTS),$(eval $(call SEARCH_LAYOUTS)))
diff --git a/builddefs/build_test.mk b/builddefs/build_test.mk
new file mode 100644
index 0000000000..ccdad1b4e7
--- /dev/null
+++ b/builddefs/build_test.mk
@@ -0,0 +1,95 @@
1ifndef VERBOSE
2.SILENT:
3endif
4
5.DEFAULT_GOAL := all
6
7OPT = g
8
9include paths.mk
10include $(BUILDDEFS_PATH)/support.mk
11include $(BUILDDEFS_PATH)/message.mk
12
13TARGET=test/$(TEST_OUTPUT)
14
15GTEST_OUTPUT = $(BUILD_DIR)/gtest
16
17TEST_OBJ = $(BUILD_DIR)/test_obj
18
19OUTPUTS := $(TEST_OBJ)/$(TEST_OUTPUT) $(GTEST_OUTPUT)
20
21GTEST_INC := \
22 $(LIB_PATH)/googletest/googletest/include \
23 $(LIB_PATH)/googletest/googlemock/include
24
25GTEST_INTERNAL_INC := \
26 $(LIB_PATH)/googletest/googletest \
27 $(LIB_PATH)/googletest/googlemock
28
29$(GTEST_OUTPUT)_SRC := \
30 googletest/src/gtest-all.cc\
31 googlemock/src/gmock-all.cc
32
33$(GTEST_OUTPUT)_DEFS :=
34$(GTEST_OUTPUT)_INC := $(GTEST_INC) $(GTEST_INTERNAL_INC)
35
36LDFLAGS += -lstdc++ -lpthread -shared-libgcc
37CREATE_MAP := no
38
39VPATH += \
40 $(LIB_PATH)/googletest \
41 $(LIB_PATH)/googlemock \
42 $(COMMON_VPATH) \
43 $(TEST_PATH)
44
45all: elf
46
47PLATFORM:=TEST
48PLATFORM_KEY:=test
49BOOTLOADER_TYPE:=none
50
51DEBUG ?= 0
52ifneq ($(strip $(DEBUG)), 0)
53CONSOLE_ENABLE = yes
54endif
55
56ifneq ($(filter $(FULL_TESTS),$(TEST)),)
57include tests/test_common/build.mk
58include $(TEST_PATH)/test.mk
59endif
60
61include $(BUILDDEFS_PATH)/common_features.mk
62include $(BUILDDEFS_PATH)/generic_features.mk
63include $(PLATFORM_PATH)/common.mk
64include $(TMK_PATH)/protocol.mk
65include $(QUANTUM_PATH)/battery/tests/rules.mk
66include $(QUANTUM_PATH)/debounce/tests/rules.mk
67include $(QUANTUM_PATH)/encoder/tests/rules.mk
68include $(QUANTUM_PATH)/os_detection/tests/rules.mk
69include $(QUANTUM_PATH)/sequencer/tests/rules.mk
70include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk
71include $(QUANTUM_PATH)/logging/print.mk
72include $(PLATFORM_PATH)/test/rules.mk
73ifneq ($(filter $(FULL_TESTS),$(TEST)),)
74include $(BUILDDEFS_PATH)/build_full_test.mk
75endif
76
77$(TEST_OUTPUT)_SRC += \
78 tests/test_common/main.cpp \
79 $(QUANTUM_PATH)/logging/print.c
80
81ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
82$(TEST_OUTPUT)_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
83endif
84
85$(TEST_OBJ)/$(TEST_OUTPUT)_SRC := $($(TEST_OUTPUT)_SRC)
86$(TEST_OBJ)/$(TEST_OUTPUT)_INC := $($(TEST_OUTPUT)_INC) $(VPATH) $(GTEST_INC)
87$(TEST_OBJ)/$(TEST_OUTPUT)_DEFS := $($(TEST_OUTPUT)_DEFS)
88$(TEST_OBJ)/$(TEST_OUTPUT)_CONFIG := $($(TEST_OUTPUT)_CONFIG)
89
90include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
91include $(BUILDDEFS_PATH)/common_rules.mk
92
93
94$(shell mkdir -p $(BUILD_DIR)/test 2>/dev/null)
95$(shell mkdir -p $(TEST_OBJ) 2>/dev/null)
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
new file mode 100644
index 0000000000..cd4e67a4bd
--- /dev/null
+++ b/builddefs/common_features.mk
@@ -0,0 +1,1034 @@
1# Copyright 2017 Fred Sundvik
2#
3# This program is free software: you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation, either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16QUANTUM_SRC += \
17 $(QUANTUM_DIR)/quantum.c \
18 $(QUANTUM_DIR)/bitwise.c \
19 $(QUANTUM_DIR)/led.c \
20 $(QUANTUM_DIR)/action.c \
21 $(QUANTUM_DIR)/action_layer.c \
22 $(QUANTUM_DIR)/action_tapping.c \
23 $(QUANTUM_DIR)/action_util.c \
24 $(QUANTUM_DIR)/eeconfig.c \
25 $(QUANTUM_DIR)/keyboard.c \
26 $(QUANTUM_DIR)/keymap_common.c \
27 $(QUANTUM_DIR)/keycode_config.c \
28 $(QUANTUM_DIR)/sync_timer.c \
29 $(QUANTUM_DIR)/logging/debug.c \
30 $(QUANTUM_DIR)/logging/sendchar.c \
31 $(QUANTUM_DIR)/process_keycode/process_default_layer.c \
32 $(QUANTUM_DIR)/process_keycode/process_oneshot.c \
33 $(QUANTUM_DIR)/process_keycode/process_quantum.c \
34
35include $(QUANTUM_DIR)/nvm/rules.mk
36
37VPATH += $(QUANTUM_DIR)/logging
38# Fall back to lib/printf if there is no platform provided print
39ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
40 include $(QUANTUM_PATH)/logging/print.mk
41else
42 include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk
43endif
44
45ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes)
46 OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
47 CONSOLE_ENABLE = yes
48else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api)
49 OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE
50endif
51
52AUDIO_ENABLE ?= no
53ifeq ($(strip $(AUDIO_ENABLE)), yes)
54 ifeq ($(PLATFORM),CHIBIOS)
55 AUDIO_DRIVER ?= dac_basic
56 ifeq ($(strip $(AUDIO_DRIVER)), dac_basic)
57 OPT_DEFS += -DAUDIO_DRIVER_DAC
58 else ifeq ($(strip $(AUDIO_DRIVER)), dac_additive)
59 OPT_DEFS += -DAUDIO_DRIVER_DAC
60 ## stm32f2 and above have a usable DAC unit, f1 do not, and need to use pwm instead
61 else ifeq ($(strip $(AUDIO_DRIVER)), pwm_software)
62 OPT_DEFS += -DAUDIO_DRIVER_PWM
63 else ifeq ($(strip $(AUDIO_DRIVER)), pwm_hardware)
64 OPT_DEFS += -DAUDIO_DRIVER_PWM
65 endif
66 else
67 # fallback for all other platforms is pwm
68 AUDIO_DRIVER ?= pwm_hardware
69 OPT_DEFS += -DAUDIO_DRIVER_PWM
70 endif
71 OPT_DEFS += -DAUDIO_ENABLE
72 COMMON_VPATH += $(QUANTUM_PATH)/audio
73 MUSIC_ENABLE = yes
74 SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
75 SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
76 SRC += $(QUANTUM_DIR)/audio/audio.c ## common audio code, hardware agnostic
77 SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/audio_$(strip $(AUDIO_DRIVER)).c
78 SRC += $(QUANTUM_DIR)/audio/voices.c
79 SRC += $(QUANTUM_DIR)/audio/luts.c
80endif
81
82ifeq ($(strip $(SEQUENCER_ENABLE)), yes)
83 MUSIC_ENABLE = yes
84endif
85
86ifeq ($(strip $(MIDI_ENABLE)), yes)
87 OPT_DEFS += -DMIDI_ENABLE
88 MUSIC_ENABLE = yes
89 COMMON_VPATH += $(QUANTUM_PATH)/midi
90 SRC += $(QUANTUM_DIR)/midi/midi.c
91 SRC += $(QUANTUM_DIR)/midi/midi_device.c
92 SRC += $(QUANTUM_DIR)/midi/qmk_midi.c
93 SRC += $(QUANTUM_DIR)/midi/sysex_tools.c
94 SRC += $(QUANTUM_DIR)/midi/bytequeue/bytequeue.c
95 SRC += $(QUANTUM_DIR)/midi/bytequeue/interrupt_setting.c
96 SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
97endif
98
99VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
100STENO_PROTOCOL ?= all
101ifeq ($(strip $(STENO_ENABLE)), yes)
102 ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),)
103 $(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol)
104 else
105 OPT_DEFS += -DSTENO_ENABLE
106 VIRTSER_ENABLE ?= yes
107
108 ifeq ($(strip $(STENO_PROTOCOL)), geminipr)
109 OPT_DEFS += -DSTENO_ENABLE_GEMINI
110 endif
111 ifeq ($(strip $(STENO_PROTOCOL)), txbolt)
112 OPT_DEFS += -DSTENO_ENABLE_BOLT
113 endif
114 ifeq ($(strip $(STENO_PROTOCOL)), all)
115 OPT_DEFS += -DSTENO_ENABLE_ALL
116 OPT_DEFS += -DSTENO_ENABLE_GEMINI
117 OPT_DEFS += -DSTENO_ENABLE_BOLT
118 endif
119
120 SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
121 endif
122endif
123
124ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
125 MOUSE_ENABLE := yes
126endif
127
128VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 paw3222 pmw3320 pmw3360 pmw3389 pimoroni_trackball custom
129ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
130 ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
131 $(call CATASTROPHIC_ERROR,Invalid POINTING_DEVICE_DRIVER,POINTING_DEVICE_DRIVER="$(POINTING_DEVICE_DRIVER)" is not a valid pointing device type)
132 else
133 OPT_DEFS += -DPOINTING_DEVICE_ENABLE
134 MOUSE_ENABLE := yes
135 VPATH += $(QUANTUM_DIR)/pointing_device
136 SRC += $(QUANTUM_DIR)/pointing_device/pointing_device.c
137 SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_auto_mouse.c
138 ifneq ($(strip $(POINTING_DEVICE_DRIVER)), custom)
139 SRC += drivers/sensors/$(strip $(POINTING_DEVICE_DRIVER)).c
140 OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(shell echo $(POINTING_DEVICE_DRIVER) | tr '[:lower:]' '[:upper:]'))
141 endif
142 OPT_DEFS += -DPOINTING_DEVICE_DRIVER_$(strip $(POINTING_DEVICE_DRIVER))
143 OPT_DEFS += -DPOINTING_DEVICE_DRIVER_NAME=$(strip $(POINTING_DEVICE_DRIVER))
144 ifeq ($(strip $(POINTING_DEVICE_DRIVER)), adns9800)
145 SPI_DRIVER_REQUIRED = yes
146 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), analog_joystick)
147 ANALOG_DRIVER_REQUIRED = yes
148 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), azoteq_iqs5xx)
149 I2C_DRIVER_REQUIRED = yes
150 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_i2c)
151 I2C_DRIVER_REQUIRED = yes
152 SRC += drivers/sensors/cirque_pinnacle.c
153 SRC += drivers/sensors/cirque_pinnacle_gestures.c
154 SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
155 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), cirque_pinnacle_spi)
156 SPI_DRIVER_REQUIRED = yes
157 SRC += drivers/sensors/cirque_pinnacle.c
158 SRC += drivers/sensors/cirque_pinnacle_gestures.c
159 SRC += $(QUANTUM_DIR)/pointing_device/pointing_device_gestures.c
160 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), paw3222)
161 SPI_DRIVER_REQUIRED = yes
162 else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pimoroni_trackball)
163 I2C_DRIVER_REQUIRED = yes
164 else ifneq ($(filter $(strip $(POINTING_DEVICE_DRIVER)),pmw3360 pmw3389),)
165 SPI_DRIVER_REQUIRED = yes
166 SRC += drivers/sensors/pmw33xx_common.c
167 endif
168 endif
169endif
170
171QUANTUM_PAINTER_ENABLE ?= no
172ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
173 include $(QUANTUM_DIR)/painter/rules.mk
174endif
175
176VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
177EEPROM_DRIVER ?= vendor
178ifneq ($(strip $(EEPROM_DRIVER)),none)
179 ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
180 $(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
181 else
182 OPT_DEFS += -DEEPROM_ENABLE
183 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
184 COMMON_VPATH += $(DRIVER_PATH)/eeprom
185 COMMON_VPATH += $(PLATFORM_COMMON_DIR)
186 ifeq ($(strip $(EEPROM_DRIVER)), custom)
187 # Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
188 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
189 SRC += eeprom_driver.c
190 else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
191 # Wear-leveling EEPROM implementation
192 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
193 SRC += eeprom_driver.c eeprom_wear_leveling.c
194 else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
195 # External I2C EEPROM implementation
196 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
197 I2C_DRIVER_REQUIRED = yes
198 SRC += eeprom_driver.c eeprom_i2c.c
199 else ifeq ($(strip $(EEPROM_DRIVER)), spi)
200 # External SPI EEPROM implementation
201 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
202 SPI_DRIVER_REQUIRED = yes
203 SRC += eeprom_driver.c eeprom_spi.c
204 else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
205 # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
206 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
207 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
208 COMMON_VPATH += $(DRIVER_PATH)/flash
209 SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
210 else ifeq ($(strip $(EEPROM_DRIVER)), transient)
211 # Transient EEPROM implementation -- no data storage but provides runtime area for it
212 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
213 SRC += eeprom_driver.c eeprom_transient.c
214 else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
215 # Vendor-implemented EEPROM
216 OPT_DEFS += -DEEPROM_VENDOR
217 ifeq ($(PLATFORM),AVR)
218 # Automatically provided by avr-libc, nothing required
219 else ifeq ($(PLATFORM),CHIBIOS)
220 ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
221 # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
222 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
223 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
224 COMMON_VPATH += $(DRIVER_PATH)/flash
225 SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
226 else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
227 # Wear-leveling EEPROM implementation, backed by MCU flash
228 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
229 SRC += eeprom_driver.c eeprom_wear_leveling.c
230 WEAR_LEVELING_DRIVER ?= embedded_flash
231 else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
232 # True EEPROM on STM32L0xx, L1xx
233 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
234 SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
235 else ifneq ($(filter $(MCU_SERIES),RP2040),)
236 # Wear-leveling EEPROM implementation, backed by RP2040 flash
237 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
238 SRC += eeprom_driver.c eeprom_wear_leveling.c
239 WEAR_LEVELING_DRIVER ?= rp2040_flash
240 else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
241 # Teensy EEPROM implementations
242 OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
243 SRC += eeprom_kinetis_flexram.c
244 else
245 # Fall back to transient, i.e. non-persistent
246 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
247 SRC += eeprom_driver.c eeprom_transient.c
248 endif
249 else ifeq ($(PLATFORM),TEST)
250 # Test harness "EEPROM"
251 OPT_DEFS += -DEEPROM_TEST_HARNESS
252 SRC += eeprom.c
253 endif
254 endif
255 endif
256endif
257
258VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy
259WEAR_LEVELING_DRIVER ?= none
260ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
261 ifeq ($(filter $(WEAR_LEVELING_DRIVER),$(VALID_WEAR_LEVELING_DRIVER_TYPES)),)
262 $(call CATASTROPHIC_ERROR,Invalid WEAR_LEVELING_DRIVER,WEAR_LEVELING_DRIVER="$(WEAR_LEVELING_DRIVER)" is not a valid wear leveling driver)
263 else
264 FNV_ENABLE := yes
265 OPT_DEFS += -DWEAR_LEVELING_ENABLE
266 OPT_DEFS += -DWEAR_LEVELING_$(strip $(shell echo $(WEAR_LEVELING_DRIVER) | tr '[:lower:]' '[:upper:]'))
267 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling
268 COMMON_VPATH += $(DRIVER_PATH)/wear_leveling
269 COMMON_VPATH += $(QUANTUM_DIR)/wear_leveling
270 SRC += wear_leveling.c
271 ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
272 OPT_DEFS += -DHAL_USE_EFL
273 SRC += wear_leveling_efl.c
274 else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
275 FLASH_DRIVER := spi
276 SRC += wear_leveling_flash_spi.c
277 else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
278 SRC += wear_leveling_rp2040_flash.c
279 else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
280 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
281 SRC += legacy_flash_ops.c wear_leveling_legacy.c
282 endif
283 endif
284endif
285
286VALID_FLASH_DRIVER_TYPES := spi custom
287FLASH_DRIVER ?= none
288ifneq ($(strip $(FLASH_DRIVER)), none)
289 ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
290 $(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver)
291 else
292 OPT_DEFS += -DFLASH_ENABLE -DFLASH_DRIVER -DFLASH_DRIVER_$(strip $(shell echo $(FLASH_DRIVER) | tr '[:lower:]' '[:upper:]'))
293 COMMON_VPATH += $(DRIVER_PATH)/flash
294 ifeq ($(strip $(FLASH_DRIVER)),spi)
295 SRC += flash_spi.c
296 SPI_DRIVER_REQUIRED = yes
297 endif
298 endif
299endif
300
301RGBLIGHT_ENABLE ?= no
302VALID_RGBLIGHT_TYPES := ws2812 apa102 custom
303
304ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
305 RGBLIGHT_DRIVER ?= ws2812
306
307 ifeq ($(filter $(RGBLIGHT_DRIVER),$(VALID_RGBLIGHT_TYPES)),)
308 $(call CATASTROPHIC_ERROR,Invalid RGBLIGHT_DRIVER,RGBLIGHT_DRIVER="$(RGBLIGHT_DRIVER)" is not a valid RGB type)
309 else
310 COMMON_VPATH += $(QUANTUM_DIR)/rgblight
311 POST_CONFIG_H += $(QUANTUM_DIR)/rgblight/rgblight_post_config.h
312 OPT_DEFS += -DRGBLIGHT_ENABLE
313 OPT_DEFS += -DRGBLIGHT_$(strip $(shell echo $(RGBLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
314 SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
315 SRC += $(QUANTUM_DIR)/color.c
316 SRC += $(QUANTUM_DIR)/rgblight/rgblight.c
317 SRC += $(QUANTUM_DIR)/rgblight/rgblight_drivers.c
318 CIE1931_CURVE := yes
319 endif
320
321 ifeq ($(strip $(RGBLIGHT_DRIVER)), ws2812)
322 WS2812_DRIVER_REQUIRED := yes
323 endif
324
325 ifeq ($(strip $(RGBLIGHT_DRIVER)), apa102)
326 APA102_DRIVER_REQUIRED := yes
327 endif
328
329 ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
330 OPT_DEFS += -DVELOCIKEY_ENABLE
331 endif
332endif
333
334# Deprecated driver names - do not use
335ifeq ($(strip $(LED_MATRIX_DRIVER)), aw20216)
336LED_MATRIX_DRIVER := aw20216s
337endif
338ifeq ($(strip $(LED_MATRIX_DRIVER)), ckled2001)
339LED_MATRIX_DRIVER := snled27351
340endif
341
342LED_MATRIX_ENABLE ?= no
343VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom
344
345ifeq ($(strip $(LED_MATRIX_ENABLE)), yes)
346 ifeq ($(filter $(LED_MATRIX_DRIVER),$(VALID_LED_MATRIX_TYPES)),)
347 $(call CATASTROPHIC_ERROR,Invalid LED_MATRIX_DRIVER,LED_MATRIX_DRIVER="$(LED_MATRIX_DRIVER)" is not a valid matrix type)
348 endif
349 OPT_DEFS += -DLED_MATRIX_ENABLE
350 OPT_DEFS += -DLED_MATRIX_$(strip $(shell echo $(LED_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
351
352 COMMON_VPATH += $(QUANTUM_DIR)/led_matrix
353 COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations
354 COMMON_VPATH += $(QUANTUM_DIR)/led_matrix/animations/runners
355 POST_CONFIG_H += $(QUANTUM_DIR)/led_matrix/post_config.h
356 SRC += $(QUANTUM_DIR)/process_keycode/process_led_matrix.c
357 SRC += $(QUANTUM_DIR)/led_matrix/led_matrix.c
358 SRC += $(QUANTUM_DIR)/led_matrix/led_matrix_drivers.c
359 LIB8TION_ENABLE := yes
360 CIE1931_CURVE := yes
361
362 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3218)
363 I2C_DRIVER_REQUIRED = yes
364 COMMON_VPATH += $(DRIVER_PATH)/led/issi
365 SRC += is31fl3218-mono.c
366 endif
367
368 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3236)
369 I2C_DRIVER_REQUIRED = yes
370 COMMON_VPATH += $(DRIVER_PATH)/led/issi
371 SRC += is31fl3236-mono.c
372 endif
373
374 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3729)
375 I2C_DRIVER_REQUIRED = yes
376 COMMON_VPATH += $(DRIVER_PATH)/led/issi
377 SRC += is31fl3729-mono.c
378 endif
379
380 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3731)
381 I2C_DRIVER_REQUIRED = yes
382 COMMON_VPATH += $(DRIVER_PATH)/led/issi
383 SRC += is31fl3731-mono.c
384 endif
385
386 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3733)
387 I2C_DRIVER_REQUIRED = yes
388 COMMON_VPATH += $(DRIVER_PATH)/led/issi
389 SRC += is31fl3733-mono.c
390 endif
391
392 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3736)
393 I2C_DRIVER_REQUIRED = yes
394 COMMON_VPATH += $(DRIVER_PATH)/led/issi
395 SRC += is31fl3736-mono.c
396 endif
397
398 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3737)
399 I2C_DRIVER_REQUIRED = yes
400 COMMON_VPATH += $(DRIVER_PATH)/led/issi
401 SRC += is31fl3737-mono.c
402 endif
403
404 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3741)
405 I2C_DRIVER_REQUIRED = yes
406 COMMON_VPATH += $(DRIVER_PATH)/led/issi
407 SRC += is31fl3741-mono.c
408 endif
409
410 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3742a)
411 I2C_DRIVER_REQUIRED = yes
412 COMMON_VPATH += $(DRIVER_PATH)/led/issi
413 SRC += is31fl3742a-mono.c
414 endif
415
416 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3743a)
417 I2C_DRIVER_REQUIRED = yes
418 COMMON_VPATH += $(DRIVER_PATH)/led/issi
419 SRC += is31fl3743a-mono.c
420 endif
421
422 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3745)
423 I2C_DRIVER_REQUIRED = yes
424 COMMON_VPATH += $(DRIVER_PATH)/led/issi
425 SRC += is31fl3745-mono.c
426 endif
427
428 ifeq ($(strip $(LED_MATRIX_DRIVER)), is31fl3746a)
429 I2C_DRIVER_REQUIRED = yes
430 COMMON_VPATH += $(DRIVER_PATH)/led/issi
431 SRC += is31fl3746a-mono.c
432 endif
433
434 ifeq ($(strip $(LED_MATRIX_DRIVER)), snled27351)
435 I2C_DRIVER_REQUIRED = yes
436 COMMON_VPATH += $(DRIVER_PATH)/led
437 SRC += snled27351-mono.c
438 endif
439
440 ifeq ($(strip $(LED_MATRIX_CUSTOM_KB)), yes)
441 OPT_DEFS += -DLED_MATRIX_CUSTOM_KB
442 endif
443
444 ifeq ($(strip $(LED_MATRIX_CUSTOM_USER)), yes)
445 OPT_DEFS += -DLED_MATRIX_CUSTOM_USER
446 endif
447endif
448
449# Deprecated driver names - do not use
450ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216)
451RGB_MATRIX_DRIVER := aw20216s
452endif
453ifeq ($(strip $(RGB_MATRIX_DRIVER)), ckled2001)
454RGB_MATRIX_DRIVER := snled27351
455endif
456
457RGB_MATRIX_ENABLE ?= no
458
459VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 ws2812 custom
460ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
461 ifeq ($(filter $(RGB_MATRIX_DRIVER),$(VALID_RGB_MATRIX_TYPES)),)
462 $(call CATASTROPHIC_ERROR,Invalid RGB_MATRIX_DRIVER,RGB_MATRIX_DRIVER="$(RGB_MATRIX_DRIVER)" is not a valid matrix type)
463 endif
464 OPT_DEFS += -DRGB_MATRIX_ENABLE
465 OPT_DEFS += -DRGB_MATRIX_$(strip $(shell echo $(RGB_MATRIX_DRIVER) | tr '[:lower:]' '[:upper:]'))
466
467 COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix
468 COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations
469 COMMON_VPATH += $(QUANTUM_DIR)/rgb_matrix/animations/runners
470 POST_CONFIG_H += $(QUANTUM_DIR)/rgb_matrix/post_config.h
471
472 # TODO: Remove this
473 SRC += $(QUANTUM_DIR)/process_keycode/process_underglow.c
474
475 SRC += $(QUANTUM_DIR)/process_keycode/process_rgb_matrix.c
476 SRC += $(QUANTUM_DIR)/color.c
477 SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix.c
478 SRC += $(QUANTUM_DIR)/rgb_matrix/rgb_matrix_drivers.c
479 LIB8TION_ENABLE := yes
480 CIE1931_CURVE := yes
481
482 ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216s)
483 SPI_DRIVER_REQUIRED = yes
484 COMMON_VPATH += $(DRIVER_PATH)/led
485 SRC += aw20216s.c
486 endif
487
488 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3218)
489 I2C_DRIVER_REQUIRED = yes
490 COMMON_VPATH += $(DRIVER_PATH)/led/issi
491 SRC += is31fl3218.c
492 endif
493
494 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3236)
495 I2C_DRIVER_REQUIRED = yes
496 COMMON_VPATH += $(DRIVER_PATH)/led/issi
497 SRC += is31fl3236.c
498 endif
499
500 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3729)
501 I2C_DRIVER_REQUIRED = yes
502 COMMON_VPATH += $(DRIVER_PATH)/led/issi
503 SRC += is31fl3729.c
504 endif
505
506 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3731)
507 I2C_DRIVER_REQUIRED = yes
508 COMMON_VPATH += $(DRIVER_PATH)/led/issi
509 SRC += is31fl3731.c
510 endif
511
512 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3733)
513 I2C_DRIVER_REQUIRED = yes
514 COMMON_VPATH += $(DRIVER_PATH)/led/issi
515 SRC += is31fl3733.c
516 endif
517
518 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3736)
519 I2C_DRIVER_REQUIRED = yes
520 COMMON_VPATH += $(DRIVER_PATH)/led/issi
521 SRC += is31fl3736.c
522 endif
523
524 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3737)
525 I2C_DRIVER_REQUIRED = yes
526 COMMON_VPATH += $(DRIVER_PATH)/led/issi
527 SRC += is31fl3737.c
528 endif
529
530 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3741)
531 I2C_DRIVER_REQUIRED = yes
532 COMMON_VPATH += $(DRIVER_PATH)/led/issi
533 SRC += is31fl3741.c
534 endif
535
536 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3742a)
537 I2C_DRIVER_REQUIRED = yes
538 COMMON_VPATH += $(DRIVER_PATH)/led/issi
539 SRC += is31fl3742a.c
540 endif
541
542 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3743a)
543 I2C_DRIVER_REQUIRED = yes
544 COMMON_VPATH += $(DRIVER_PATH)/led/issi
545 SRC += is31fl3743a.c
546 endif
547
548 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3745)
549 I2C_DRIVER_REQUIRED = yes
550 COMMON_VPATH += $(DRIVER_PATH)/led/issi
551 SRC += is31fl3745.c
552 endif
553
554 ifeq ($(strip $(RGB_MATRIX_DRIVER)), is31fl3746a)
555 I2C_DRIVER_REQUIRED = yes
556 COMMON_VPATH += $(DRIVER_PATH)/led/issi
557 SRC += is31fl3746a.c
558 endif
559
560 ifeq ($(strip $(RGB_MATRIX_DRIVER)), snled27351)
561 I2C_DRIVER_REQUIRED = yes
562 COMMON_VPATH += $(DRIVER_PATH)/led
563 SRC += snled27351.c
564 endif
565
566 ifeq ($(strip $(RGB_MATRIX_DRIVER)), ws2812)
567 WS2812_DRIVER_REQUIRED := yes
568 endif
569
570 ifeq ($(strip $(RGB_MATRIX_DRIVER)), apa102)
571 APA102_DRIVER_REQUIRED := yes
572 endif
573
574 ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
575 OPT_DEFS += -DRGB_MATRIX_CUSTOM_KB
576 endif
577
578 ifeq ($(strip $(RGB_MATRIX_CUSTOM_USER)), yes)
579 OPT_DEFS += -DRGB_MATRIX_CUSTOM_USER
580 endif
581endif
582
583VARIABLE_TRACE ?= no
584ifneq ($(strip $(VARIABLE_TRACE)),no)
585 SRC += $(QUANTUM_DIR)/variable_trace.c
586 OPT_DEFS += -DNUM_TRACED_VARIABLES=$(strip $(VARIABLE_TRACE))
587 ifneq ($(strip $(MAX_VARIABLE_TRACE_SIZE)),)
588 OPT_DEFS += -DMAX_VARIABLE_TRACE_SIZE=$(strip $(MAX_VARIABLE_TRACE_SIZE))
589 endif
590endif
591
592ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
593 SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
594 OPT_DEFS += -DSLEEP_LED_ENABLE
595
596 NO_SUSPEND_POWER_DOWN := yes
597endif
598
599VALID_BACKLIGHT_TYPES := pwm timer software custom
600
601BACKLIGHT_ENABLE ?= no
602BACKLIGHT_DRIVER ?= pwm
603ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
604 ifeq ($(filter $(BACKLIGHT_DRIVER),$(VALID_BACKLIGHT_TYPES)),)
605 $(call CATASTROPHIC_ERROR,Invalid BACKLIGHT_DRIVER,BACKLIGHT_DRIVER="$(BACKLIGHT_DRIVER)" is not a valid backlight type)
606 endif
607
608 COMMON_VPATH += $(QUANTUM_DIR)/backlight
609 COMMON_VPATH += $(DRIVER_PATH)/backlight
610 SRC += $(QUANTUM_DIR)/backlight/backlight.c
611 SRC += $(QUANTUM_DIR)/process_keycode/process_backlight.c
612 OPT_DEFS += -DBACKLIGHT_ENABLE
613 OPT_DEFS += -DBACKLIGHT_$(strip $(shell echo $(BACKLIGHT_DRIVER) | tr '[:lower:]' '[:upper:]'))
614
615 ifneq ($(strip $(BACKLIGHT_DRIVER)), custom)
616 SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
617
618 ifeq ($(strip $(BACKLIGHT_DRIVER)), software)
619 SRC += $(DRIVER_PATH)/backlight/backlight_software.c
620 else
621 SRC += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/backlight_$(strip $(BACKLIGHT_DRIVER)).c
622 endif
623 endif
624endif
625
626ifeq ($(strip $(CIE1931_CURVE)), yes)
627 OPT_DEFS += -DUSE_CIE1931_CURVE
628 LED_TABLES := yes
629endif
630
631ifeq ($(strip $(LED_TABLES)), yes)
632 SRC += $(QUANTUM_DIR)/led_tables.c
633endif
634
635ifeq ($(strip $(VIA_ENABLE)), yes)
636 DYNAMIC_KEYMAP_ENABLE := yes
637 RAW_ENABLE := yes
638 BOOTMAGIC_ENABLE := yes
639 TRI_LAYER_ENABLE := yes
640 ifeq ($(strip $(VIA_INSECURE)), yes)
641 OPT_DEFS += -DVIA_INSECURE
642 endif
643endif
644
645ifeq ($(strip $(RAW_ENABLE)), yes)
646 OPT_DEFS += -DRAW_ENABLE
647 SRC += raw_hid.c
648endif
649
650ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
651 SEND_STRING_ENABLE := yes
652endif
653
654VALID_CUSTOM_MATRIX_TYPES:= yes lite no
655
656CUSTOM_MATRIX ?= no
657ifneq ($(strip $(CUSTOM_MATRIX)), yes)
658 ifeq ($(filter $(CUSTOM_MATRIX),$(VALID_CUSTOM_MATRIX_TYPES)),)
659 $(call CATASTROPHIC_ERROR,Invalid CUSTOM_MATRIX,CUSTOM_MATRIX="$(CUSTOM_MATRIX)" is not a valid custom matrix type)
660 endif
661
662 # Include common stuff for all non custom matrix users
663 QUANTUM_SRC += $(QUANTUM_DIR)/matrix_common.c
664
665 # if 'lite' then skip the actual matrix implementation
666 ifneq ($(strip $(CUSTOM_MATRIX)), lite)
667 # Include the standard or split matrix code if needed
668 QUANTUM_SRC += $(QUANTUM_DIR)/matrix.c
669 endif
670endif
671
672# Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually.
673DEBOUNCE_TYPE ?= sym_defer_g
674ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
675 QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
676endif
677
678
679VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor
680
681SERIAL_DRIVER ?= bitbang
682ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),)
683 $(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver)
684endif
685
686ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
687 POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
688 OPT_DEFS += -DSPLIT_KEYBOARD
689 CRC_ENABLE := yes
690
691 # Include files used by all split keyboards
692 QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_util.c
693
694 # Determine which (if any) transport files are required
695 ifneq ($(strip $(SPLIT_TRANSPORT)), custom)
696 QUANTUM_SRC += $(QUANTUM_DIR)/split_common/transport.c \
697 $(QUANTUM_DIR)/split_common/transactions.c
698
699 OPT_DEFS += -DSPLIT_COMMON_TRANSACTIONS
700
701 # Functions added via QUANTUM_LIB_SRC are only included in the final binary if they're called.
702 # Unused functions are pruned away, which is why we can add multiple drivers here without bloat.
703 ifeq ($(PLATFORM),AVR)
704 ifneq ($(NO_I2C),yes)
705 QUANTUM_LIB_SRC += i2c_master.c \
706 i2c_slave.c
707 endif
708 endif
709
710 OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
711 ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
712 QUANTUM_LIB_SRC += serial.c
713 else
714 QUANTUM_LIB_SRC += serial_protocol.c
715 QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
716 endif
717 endif
718 COMMON_VPATH += $(QUANTUM_PATH)/split_common
719endif
720
721ifeq ($(strip $(FNV_ENABLE)), yes)
722 OPT_DEFS += -DFNV_ENABLE
723 VPATH += $(LIB_PATH)/fnv
724 SRC += qmk_fnv_type_validation.c hash_32a.c hash_64a.c
725endif
726
727ifeq ($(strip $(LIB8TION_ENABLE)), yes)
728 ifneq (,$(filter $(MCU), atmega16u2 atmega32u2 at90usb162))
729 # ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
730 OPT_DEFS += -DLIB8_ATTINY
731 endif
732 OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
733 SRC += $(LIB_PATH)/lib8tion/lib8tion.c
734endif
735
736VALID_HAPTIC_DRIVER_TYPES := drv2605l solenoid
737ifeq ($(strip $(HAPTIC_ENABLE)),yes)
738 ifeq ($(filter $(HAPTIC_DRIVER),$(VALID_HAPTIC_DRIVER_TYPES)),)
739 $(call CATASTROPHIC_ERROR,Invalid HAPTIC_DRIVER,HAPTIC_DRIVER="$(HAPTIC_DRIVER)" is not a valid Haptic driver)
740 else
741 OPT_DEFS += -DHAPTIC_$(strip $(shell echo $(HAPTIC_DRIVER) | tr '[:lower:]' '[:upper:]'))
742 COMMON_VPATH += $(DRIVER_PATH)/haptic
743
744 ifeq ($(strip $(HAPTIC_DRIVER)), drv2605l)
745 I2C_DRIVER_REQUIRED = yes
746 SRC += drv2605l.c
747 endif
748
749 ifeq ($(strip $(HAPTIC_DRIVER)), solenoid)
750 SRC += solenoid.c
751 endif
752 endif
753endif
754
755ifeq ($(strip $(HD44780_ENABLE)), yes)
756 OPT_DEFS += -DHD44780_ENABLE
757 COMMON_VPATH += $(DRIVER_PATH)/lcd
758 SRC += hd44780.c
759endif
760
761VALID_OLED_DRIVER_TYPES := custom ssd1306
762OLED_DRIVER ?= ssd1306
763VALID_OLED_TRANSPORT_TYPES := i2c spi custom
764OLED_TRANSPORT ?= i2c
765ifeq ($(strip $(OLED_ENABLE)), yes)
766 ifeq ($(filter $(OLED_DRIVER),$(VALID_OLED_DRIVER_TYPES)),)
767 $(call CATASTROPHIC_ERROR,Invalid OLED_DRIVER,OLED_DRIVER="$(OLED_DRIVER)" is not a valid OLED driver)
768 else
769 ifeq ($(filter $(OLED_TRANSPORT),$(VALID_OLED_TRANSPORT_TYPES)),)
770 $(call CATASTROPHIC_ERROR,Invalid OLED_TRANSPORT,OLED_TRANSPORT="$(OLED_TRANSPORT)" is not a valid OLED transport)
771 else
772 OPT_DEFS += -DOLED_ENABLE
773 OPT_DEFS += -DOLED_$(strip $(shell echo $(OLED_DRIVER) | tr '[:lower:]' '[:upper:]'))
774 COMMON_VPATH += $(DRIVER_PATH)/oled
775 ifneq ($(strip $(OLED_DRIVER)), custom)
776 SRC += oled_driver.c
777 endif
778
779 OPT_DEFS += -DOLED_TRANSPORT_$(strip $(shell echo $(OLED_TRANSPORT) | tr '[:lower:]' '[:upper:]'))
780 ifeq ($(strip $(OLED_TRANSPORT)), i2c)
781 I2C_DRIVER_REQUIRED = yes
782 endif
783 ifeq ($(strip $(OLED_TRANSPORT)), spi)
784 SPI_DRIVER_REQUIRED = yes
785 endif
786 endif
787 endif
788endif
789
790ifeq ($(strip $(ST7565_ENABLE)), yes)
791 OPT_DEFS += -DST7565_ENABLE
792 SPI_DRIVER_REQUIRED = yes
793 COMMON_VPATH += $(DRIVER_PATH)/oled # For glcdfont.h
794 COMMON_VPATH += $(DRIVER_PATH)/lcd
795 SRC += st7565.c
796endif
797
798ifeq ($(strip $(UCIS_ENABLE)), yes)
799 OPT_DEFS += -DUCIS_ENABLE
800 UNICODE_COMMON := yes
801 SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c \
802 $(QUANTUM_DIR)/unicode/ucis.c
803endif
804
805ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
806 OPT_DEFS += -DUNICODEMAP_ENABLE
807 UNICODE_COMMON := yes
808 SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c \
809 $(QUANTUM_DIR)/unicode/unicodemap.c
810endif
811
812ifeq ($(strip $(UNICODE_ENABLE)), yes)
813 OPT_DEFS += -DUNICODE_ENABLE
814 UNICODE_COMMON := yes
815 SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
816endif
817
818ifeq ($(strip $(UNICODE_COMMON)), yes)
819 OPT_DEFS += -DUNICODE_COMMON_ENABLE
820 COMMON_VPATH += $(QUANTUM_DIR)/unicode
821 SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c \
822 $(QUANTUM_DIR)/unicode/unicode.c \
823 $(QUANTUM_DIR)/unicode/utf8.c
824endif
825
826ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes)
827 PS2_ENABLE := yes
828 MOUSE_ENABLE := yes
829 SRC += ps2_mouse.c
830 OPT_DEFS += -DPS2_MOUSE_ENABLE
831endif
832
833VALID_PS2_DRIVER_TYPES := busywait interrupt usart vendor
834
835PS2_DRIVER ?= busywait
836ifeq ($(strip $(PS2_ENABLE)), yes)
837 ifeq ($(filter $(PS2_DRIVER),$(VALID_PS2_DRIVER_TYPES)),)
838 $(call CATASTROPHIC_ERROR,Invalid PS2_DRIVER,PS2_DRIVER="$(PS2_DRIVER)" is not a valid PS/2 driver)
839 endif
840
841 OPT_DEFS += -DPS2_DRIVER_$(strip $(shell echo $(PS2_DRIVER) | tr '[:lower:]' '[:upper:]'))
842
843 COMMON_VPATH += $(DRIVER_PATH)/ps2
844 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/ps2
845 OPT_DEFS += -DPS2_ENABLE
846
847 ifneq ($(strip $(PS2_DRIVER)), vendor)
848 SRC += ps2_io.c
849 endif
850
851 SRC += ps2_$(strip $(PS2_DRIVER)).c
852endif
853
854JOYSTICK_ENABLE ?= no
855VALID_JOYSTICK_TYPES := analog digital
856JOYSTICK_DRIVER ?= analog
857ifeq ($(strip $(JOYSTICK_ENABLE)), yes)
858 ifeq ($(filter $(JOYSTICK_DRIVER),$(VALID_JOYSTICK_TYPES)),)
859 $(call CATASTROPHIC_ERROR,Invalid JOYSTICK_DRIVER,JOYSTICK_DRIVER="$(JOYSTICK_DRIVER)" is not a valid joystick driver)
860 endif
861 OPT_DEFS += -DJOYSTICK_ENABLE
862 OPT_DEFS += -DJOYSTICK_$(strip $(shell echo $(JOYSTICK_DRIVER) | tr '[:lower:]' '[:upper:]'))
863 SRC += $(QUANTUM_DIR)/process_keycode/process_joystick.c
864 SRC += $(QUANTUM_DIR)/joystick.c
865
866 ifeq ($(strip $(JOYSTICK_DRIVER)), analog)
867 ANALOG_DRIVER_REQUIRED = yes
868 endif
869endif
870
871USBPD_ENABLE ?= no
872VALID_USBPD_DRIVER_TYPES = custom vendor
873USBPD_DRIVER ?= vendor
874ifeq ($(strip $(USBPD_ENABLE)), yes)
875 ifeq ($(filter $(strip $(USBPD_DRIVER)),$(VALID_USBPD_DRIVER_TYPES)),)
876 $(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,USBPD_DRIVER="$(USBPD_DRIVER)" is not a valid USBPD driver)
877 else
878 OPT_DEFS += -DUSBPD_ENABLE
879 ifeq ($(strip $(USBPD_DRIVER)), vendor)
880 # Vendor-specific implementations
881 OPT_DEFS += -DUSBPD_VENDOR
882 ifeq ($(strip $(MCU_SERIES)), STM32G4xx)
883 OPT_DEFS += -DUSBPD_STM32G4
884 SRC += usbpd_stm32g4.c
885 else
886 $(call CATASTROPHIC_ERROR,Invalid USBPD_DRIVER,There is no vendor-provided USBPD driver available)
887 endif
888 else ifeq ($(strip $(USBPD_DRIVER)), custom)
889 OPT_DEFS += -DUSBPD_CUSTOM
890 # Board designers can add their own driver to $(SRC)
891 endif
892 endif
893endif
894
895BLUETOOTH_ENABLE ?= no
896VALID_BLUETOOTH_DRIVER_TYPES := bluefruit_le custom rn42
897ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
898 ifeq ($(filter $(strip $(BLUETOOTH_DRIVER)),$(VALID_BLUETOOTH_DRIVER_TYPES)),)
899 $(call CATASTROPHIC_ERROR,Invalid BLUETOOTH_DRIVER,BLUETOOTH_DRIVER="$(BLUETOOTH_DRIVER)" is not a valid Bluetooth driver type)
900 endif
901 OPT_DEFS += -DBLUETOOTH_ENABLE
902 OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
903 NO_USB_STARTUP_CHECK := yes
904 CONNECTION_ENABLE := yes
905 COMMON_VPATH += $(DRIVER_PATH)/bluetooth
906 SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
907
908 ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
909 SPI_DRIVER_REQUIRED = yes
910 SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
911 SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
912 endif
913
914 ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
915 UART_DRIVER_REQUIRED = yes
916 SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
917 SRC += $(DRIVER_PATH)/bluetooth/rn42.c
918 endif
919endif
920
921ENCODER_ENABLE ?= no
922ENCODER_DRIVER ?= quadrature
923VALID_ENCODER_DRIVER_TYPES := quadrature custom
924ifeq ($(strip $(ENCODER_ENABLE)), yes)
925 ifeq ($(filter $(ENCODER_DRIVER),$(VALID_ENCODER_DRIVER_TYPES)),)
926 $(call CATASTROPHIC_ERROR,Invalid ENCODER_DRIVER,ENCODER_DRIVER="$(ENCODER_DRIVER)" is not a valid encoder driver)
927 endif
928 SRC += $(QUANTUM_DIR)/encoder.c
929 OPT_DEFS += -DENCODER_ENABLE
930 OPT_DEFS += -DENCODER_DRIVER_$(strip $(shell echo $(ENCODER_DRIVER) | tr '[:lower:]' '[:upper:]'))
931
932 COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/encoder
933 COMMON_VPATH += $(DRIVER_PATH)/encoder
934
935 ifneq ($(strip $(ENCODER_DRIVER)), custom)
936 SRC += encoder_$(strip $(ENCODER_DRIVER)).c
937 endif
938
939 ifeq ($(strip $(ENCODER_MAP_ENABLE)), yes)
940 OPT_DEFS += -DENCODER_MAP_ENABLE
941 endif
942endif
943
944ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
945 ifeq ($(strip $(DIP_SWITCH_MAP_ENABLE)), yes)
946 OPT_DEFS += -DDIP_SWITCH_MAP_ENABLE
947 endif
948endif
949
950ifeq ($(strip $(BATTERY_ENABLE)), yes)
951 BATTERY_DRIVER_REQUIRED := yes
952endif
953
954VALID_BATTERY_DRIVER_TYPES := adc custom vendor
955
956BATTERY_DRIVER ?= none
957ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
958 ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
959 $(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
960 endif
961
962 OPT_DEFS += -DBATTERY_DRIVER_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
963
964 COMMON_VPATH += $(DRIVER_PATH)/battery
965
966 ifneq ($(strip $(BATTERY_DRIVER)), custom)
967 SRC += battery_$(strip $(BATTERY_DRIVER)).c
968 endif
969
970 # add extra deps
971 ifeq ($(strip $(BATTERY_DRIVER)), adc)
972 ANALOG_DRIVER_REQUIRED = yes
973 endif
974endif
975
976VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
977
978WS2812_DRIVER ?= bitbang
979ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
980 ifeq ($(filter $(WS2812_DRIVER),$(VALID_WS2812_DRIVER_TYPES)),)
981 $(call CATASTROPHIC_ERROR,Invalid WS2812_DRIVER,WS2812_DRIVER="$(WS2812_DRIVER)" is not a valid WS2812 driver)
982 endif
983
984 OPT_DEFS += -DWS2812_$(strip $(shell echo $(WS2812_DRIVER) | tr '[:lower:]' '[:upper:]'))
985
986 COMMON_VPATH += $(DRIVER_PATH)/led
987
988 SRC += ws2812.c ws2812_$(strip $(WS2812_DRIVER)).c
989
990 ifeq ($(strip $(PLATFORM)), CHIBIOS)
991 ifeq ($(strip $(WS2812_DRIVER)), pwm)
992 OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
993 endif
994 endif
995
996 # add extra deps
997 ifeq ($(strip $(WS2812_DRIVER)), i2c)
998 I2C_DRIVER_REQUIRED = yes
999 endif
1000endif
1001
1002ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes)
1003 COMMON_VPATH += $(DRIVER_PATH)/led
1004 SRC += apa102.c
1005endif
1006
1007ifeq ($(strip $(ANALOG_DRIVER_REQUIRED)), yes)
1008 OPT_DEFS += -DHAL_USE_ADC=TRUE
1009 QUANTUM_LIB_SRC += analog.c
1010endif
1011
1012ifeq ($(strip $(I2C_DRIVER_REQUIRED)), yes)
1013 OPT_DEFS += -DHAL_USE_I2C=TRUE
1014 QUANTUM_LIB_SRC += i2c_master.c
1015endif
1016
1017ifeq ($(strip $(SPI_DRIVER_REQUIRED)), yes)
1018 OPT_DEFS += -DHAL_USE_SPI=TRUE
1019 QUANTUM_LIB_SRC += spi_master.c
1020endif
1021
1022ifeq ($(strip $(UART_DRIVER_REQUIRED)), yes)
1023 ifeq ($(strip $(PLATFORM)), CHIBIOS)
1024 ifneq ($(filter $(MCU_SERIES),RP2040),)
1025 OPT_DEFS += -DHAL_USE_SIO=TRUE
1026 QUANTUM_LIB_SRC += uart_sio.c
1027 else
1028 OPT_DEFS += -DHAL_USE_SERIAL=TRUE
1029 QUANTUM_LIB_SRC += uart_serial.c
1030 endif
1031 else
1032 QUANTUM_LIB_SRC += uart.c
1033 endif
1034endif
diff --git a/builddefs/common_rules.mk b/builddefs/common_rules.mk
new file mode 100644
index 0000000000..d6f91b10e4
--- /dev/null
+++ b/builddefs/common_rules.mk
@@ -0,0 +1,408 @@
1# Hey Emacs, this is a -*- makefile -*-
2#----------------------------------------------------------------------------
3
4# Enable vpath searching for source files only
5# Without this, output files, could be read from the wrong .build directories
6VPATH_SRC := $(VPATH)
7vpath %.c $(VPATH_SRC)
8vpath %.h $(VPATH_SRC)
9vpath %.cpp $(VPATH_SRC)
10vpath %.cc $(VPATH_SRC)
11vpath %.hpp $(VPATH_SRC)
12vpath %.S $(VPATH_SRC)
13VPATH :=
14
15# Helper to return the distinct elements of a list
16uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1)))
17
18# Convert all SRC to OBJ
19define OBJ_FROM_SRC
20$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$(patsubst %.clib,$1/%.a,$($1_SRC))))))
21endef
22$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
23
24# Define a list of all objects
25OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
26NO_LTO_OBJ := $(filter %.a,$(OBJ))
27
28MASTER_OUTPUT := $(firstword $(OUTPUTS))
29
30# Output format. (can be srec, ihex, binary)
31FORMAT = ihex
32
33# Optimization level, can be [0, 1, 2, 3, s].
34OPT ?= s
35
36# Compiler flag to set the C and C++ language standard level
37CSTANDARD = -std=gnu11
38CXXSTANDARD = -std=gnu++14
39
40# Speed up recompilations by opt-in usage of ccache
41USE_CCACHE ?= no
42ifneq ($(USE_CCACHE),no)
43 CC_PREFIX ?= ccache
44endif
45
46#---------------- Debug Options ----------------
47
48DEBUG_ENABLE ?= no
49ifeq ($(strip $(DEBUG_ENABLE)),yes)
50 CFLAGS += -ggdb3
51 CXXFLAGS += -ggdb3
52 ASFLAGS += -ggdb3
53# Create a map file when debugging
54 LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
55endif
56
57
58#---------------- C Compiler Options ----------------
59
60ifeq ($(strip $(LTO_ENABLE)), yes)
61 CDEFS += -flto
62 CDEFS += -DLTO_ENABLE
63endif
64
65CFLAGS += $(CDEFS)
66CFLAGS += -O$(OPT)
67# add color
68ifeq ($(COLOR),true)
69ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "")
70 CFLAGS+= -fdiagnostics-color
71endif
72endif
73CFLAGS += -Wall
74CFLAGS += -Wstrict-prototypes
75ifneq ($(strip $(ALLOW_WARNINGS)), yes)
76 CFLAGS += -Werror
77endif
78CFLAGS += $(CSTANDARD)
79
80# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
81# Fixing of multiple variable definitions must be made.
82CFLAGS += -fcommon
83
84#---------------- C++ Compiler Options ----------------
85
86CXXFLAGS += $(CXXDEFS)
87CXXFLAGS += -O$(OPT)
88# to suppress "warning: only initialized variables can be placed into program memory area"
89CXXFLAGS += -w
90CXXFLAGS += -Wall
91CXXFLAGS += -Wundef
92
93ifneq ($(strip $(ALLOW_WARNINGS)), yes)
94 CXXFLAGS += -Werror
95endif
96
97#---------------- Assembler Options ----------------
98
99ASFLAGS += $(ADEFS)
100ifeq ($(VERBOSE_AS_CMD),yes)
101 ASFLAGS += -v
102endif
103
104#---------------- Linker Options ----------------
105
106ifeq ($(VERBOSE_LD_CMD),yes)
107 LDFLAGS += -v
108endif
109
110LDFLAGS += $(EXTMEMOPTS)
111LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
112LDFLAGS += -lm
113# You can give EXTRALDFLAGS at 'make' command line.
114LDFLAGS += $(EXTRALDFLAGS)
115
116#---------------- Assembler Listings ----------------
117
118ADHLNS_ENABLE ?= no
119ifeq ($(ADHLNS_ENABLE),yes)
120 # Avoid "Options to '-Xassembler' do not match" - only specify assembler options at LTO link time
121 ifeq ($(strip $(LTO_ENABLE)), yes)
122 LDFLAGS += -Wa,-adhlns=$(BUILD_DIR)/$(TARGET).lst
123 else
124 CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
125 CXXFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
126 ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),--listing-cont-lines=100
127 endif
128endif
129
130# Define programs and commands.
131SHELL = sh
132SED = sed
133REMOVE = rm -f
134REMOVEDIR = rmdir
135COPY = cp
136WINSHELL = cmd
137SECHO = $(SILENT) || echo
138MD5SUM ?= md5sum
139ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),)
140 MD5SUM = md5
141endif
142
143# UF2 format settings
144# To produce a UF2 file in your build, add to your keyboard's rules.mk:
145# FIRMWARE_FORMAT = uf2
146UF2CONV = $(TOP_DIR)/util/uf2conv.py
147UF2CONV_ARGS ?=
148UF2_FAMILY ?= 0x0
149
150# Compiler flags to generate dependency files.
151#GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
152GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
153
154
155# Combine all necessary flags and optional flags.
156# Add target processor to flags.
157# You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
158ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
159ALL_CXXFLAGS = $(MCUFLAGS) -x c++ $(CXXFLAGS) $(EXTRAFLAGS)
160ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
161
162define NO_LTO
163$(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto
164endef
165$(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ))))
166
167MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
168
169# For a ChibiOS build, ensure that the board files have the hook overrides injected
170define BOARDSRC_INJECT_HOOKS
171$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
172endef
173$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
174
175# Add QMK specific flags
176DFU_SUFFIX ?= dfu-suffix
177DFU_SUFFIX_ARGS ?=
178
179
180elf: $(BUILD_DIR)/$(TARGET).elf
181hex: $(BUILD_DIR)/$(TARGET).hex
182uf2: $(BUILD_DIR)/$(TARGET).uf2
183cpfirmware_qmk: $(FIRMWARE_FORMAT)
184 $(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to qmk_firmware folder" | $(AWK_CMD)
185 $(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
186eep: $(BUILD_DIR)/$(TARGET).eep
187lss: $(BUILD_DIR)/$(TARGET).lss
188sym: $(BUILD_DIR)/$(TARGET).sym
189LIBNAME=lib$(TARGET).a
190lib: $(LIBNAME)
191
192cpfirmware: cpfirmware_qmk
193
194ifneq ($(QMK_USERSPACE),)
195cpfirmware: cpfirmware_userspace
196cpfirmware_userspace: cpfirmware_qmk
197 $(SILENT) || printf "Copying $(TARGET).$(FIRMWARE_FORMAT) to userspace folder" | $(AWK_CMD)
198 $(COPY) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT) $(QMK_USERSPACE)/$(TARGET).$(FIRMWARE_FORMAT) && $(PRINT_OK)
199endif
200
201# Display size of file, modifying the output so people don't mistakenly grab the hex output
202BINARY_SIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(SED) -e 's/\.build\/.*$$/$(TARGET).$(FIRMWARE_FORMAT)/g'
203
204sizebefore:
205 @if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(BINARY_SIZE); \
206 2>/dev/null; $(SECHO); fi
207
208sizeafter: $(BUILD_DIR)/$(TARGET).hex
209 @if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO); $(SECHO) $(MSG_SIZE_AFTER); $(SILENT) || $(BINARY_SIZE); \
210 2>/dev/null; $(SECHO); fi
211
212# Display compiler version information.
213gccversion :
214 @$(SILENT) || $(CC) --version
215
216# Create final output files (.hex, .eep) from ELF output file.
217%.hex: %.elf
218 $(eval CMD=$(HEX) $< $@)
219 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
220 @$(SILENT) || printf "$(MSG_FLASH) $@" | $(AWK_CMD)
221 @$(BUILD_CMD)
222
223%.uf2: %.elf
224 $(eval CMD=$(HEX) $< $(BUILD_DIR)/$(TARGET).tmp && $(UF2CONV) $(UF2CONV_ARGS) $(BUILD_DIR)/$(TARGET).tmp --output $@ --convert --family $(UF2_FAMILY) >/dev/null 2>&1)
225 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
226 @$(SILENT) || printf "$(MSG_UF2) $@" | $(AWK_CMD)
227 @$(BUILD_CMD)
228
229%.eep: %.elf
230 $(eval CMD=$(EEP) $< $@ || exit 0)
231 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
232 @$(SILENT) || printf "$(MSG_EEPROM) $@" | $(AWK_CMD)
233 @$(BUILD_CMD)
234
235# Create extended listing file from ELF output file.
236%.lss: %.elf
237 $(eval CMD=$(OBJDUMP) -h -S -z $< > $@)
238 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
239 @$(SILENT) || printf "$(MSG_EXTENDED_LISTING) $@" | $(AWK_CMD)
240 @$(BUILD_CMD)
241
242# Create a symbol table from ELF output file.
243%.sym: %.elf
244 $(eval CMD=$(NM) -n $< > $@ )
245 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
246 @$(SILENT) || printf "$(MSG_SYMBOL_TABLE) $@" | $(AWK_CMD)
247 @$(BUILD_CMD)
248
249%.bin: %.elf
250 $(eval CMD=$(BIN) $< $@ || exit 0)
251 #@$(SILENT) || printf "$(MSG_EXECUTING) '$(CMD)':\n"
252 @$(SILENT) || printf "$(MSG_BIN) $@" | $(AWK_CMD)
253 @$(BUILD_CMD)
254 if [ ! -z "$(DFU_SUFFIX_ARGS)" ]; then \
255 $(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null ;\
256 fi
257 #$(SILENT) || printf "$(MSG_EXECUTING) '$(DFU_SUFFIX) $(DFU_SUFFIX_ARGS) -a $(BUILD_DIR)/$(TARGET).bin 1>/dev/null':\n" ;\
258 $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
259
260BEGIN = gccversion sizebefore
261
262# Link: create ELF output file from object files.
263.SECONDARY : $(BUILD_DIR)/$(TARGET).elf
264.PRECIOUS : $(OBJ)
265# Note the obj.txt depeendency is there to force linking if a source file is deleted
266%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
267 @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
268 $(eval CMD=MAKE=$(MAKE) $(CC) $(ALL_CFLAGS) $(call uniq,$(OBJ)) --output $@ $(LDFLAGS))
269 @$(BUILD_CMD)
270
271
272define GEN_OBJRULE
273$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
274ifdef $1_CONFIG
275$1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG))
276endif
277$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
278$1_CXXFLAGS = $$(ALL_CXXFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS) $$(NOLTO_CFLAGS)
279$1_ASFLAGS = $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
280
281# Compile: create object files from C source files.
282$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
283 @mkdir -p $$(@D)
284 @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
285 $$(eval CC_EXEC := $$(CC))
286 ifneq ($$(VERBOSE_C_CMD),)
287 $$(if $$(filter $$(notdir $$(VERBOSE_C_CMD)),$$(notdir $$<)),$$(eval CC_EXEC += -v))
288 endif
289 ifneq ($$(VERBOSE_C_INCLUDE),)
290 $$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
291 endif
292 $$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
293 @$$(BUILD_CMD)
294 ifneq ($$(DUMP_C_MACROS),)
295 $$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
296 @$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
297 endif
298
299# Compile: create object files from C++ source files.
300$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
301 @mkdir -p $$(@D)
302 @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
303 $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
304 @$$(BUILD_CMD)
305
306$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
307 @mkdir -p $$(@D)
308 @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
309 $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
310 @$$(BUILD_CMD)
311
312# Assemble: create object files from assembler source files.
313$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
314 @mkdir -p $$(@D)
315 @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
316 $$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
317 @$$(BUILD_CMD)
318
319$1/%.a : $1/%.o
320 @mkdir -p $$(@D)
321 @$(SILENT) || printf "Archiving: $$<" | $$(AWK_CMD)
322 $$(eval CMD=$$(AR) rcs $$@ $$<)
323 @$$(BUILD_CMD)
324
325$1/force:
326
327$1/cflags.txt: $1/force
328 echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
329
330$1/cxxflags.txt: $1/force
331 echo '$$($1_CXXFLAGS)' | cmp -s - $$@ || echo '$$($1_CXXFLAGS)' > $$@
332
333$1/asflags.txt: $1/force
334 echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
335
336$1/compiler.txt: $1/force
337 test -f $$@ || touch $$@
338 $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
339endef
340
341.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
342$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
343 echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
344
345.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
346$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
347 echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
348
349
350# We have to use static rules for the .d files for some reason
351DEPS = $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
352# Keep the .d files
353.PRECIOUS: $(DEPS)
354# Empty rule to force recompilation if the .d file is missing
355$(DEPS):
356
357
358$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
359
360# Create preprocessed source for use in sending a bug report.
361%.i : %.c | $(BEGIN)
362 $(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
363
364# Target: clean project.
365clean:
366 $(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
367 $(REMOVE) $(BUILD_DIR)/$(TARGET).*
368
369show_path:
370 @echo VPATH=$(VPATH)
371 @echo SRC=$(SRC)
372 @echo OBJ=$(OBJ)
373
374dump_vars: ERROR_IF_EMPTY=""
375dump_vars: ERROR_IF_NONBOOL=""
376dump_vars: ERROR_IF_UNSET=""
377dump_vars: CATASTROPHIC_ERROR=""
378dump_vars:
379 @$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V))))
380
381objs-size:
382 for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE)
383
384
385# size check optionally implemented in its platform.mk
386check-size:
387
388check-md5:
389 $(MD5SUM) $(BUILD_DIR)/$(TARGET).$(FIRMWARE_FORMAT)
390
391# Create build directory
392$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
393
394# Create object files directory
395$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
396
397# Include the dependency files.
398-include $(patsubst %.o,%.d,$(patsubst %.a,%.o,$(OBJ)))
399
400
401# Listing of phony targets.
402.PHONY : all dump_vars finish sizebefore sizeafter qmkversion \
403gccversion build elf hex uf2 eep lss sym coff extcoff \
404clean clean_list debug gdb-config show_path \
405program teensy dfu dfu-ee dfu-start \
406flash dfu-split-left dfu-split-right \
407avrdude-split-left avrdude-split-right \
408avrdude-loop usbasp
diff --git a/builddefs/converters.mk b/builddefs/converters.mk
new file mode 100644
index 0000000000..9f8e80706e
--- /dev/null
+++ b/builddefs/converters.mk
@@ -0,0 +1,34 @@
1# Remove whitespace from any rule.mk provided vars
2# - env cannot be overwritten but cannot have whitespace anyway
3CONVERT_TO:=$(strip $(CONVERT_TO))
4ifneq ($(CONVERT_TO),)
5
6 # stash so we can overwrite env provided vars if needed
7 ACTIVE_CONVERTER=$(CONVERT_TO)
8
9 ifeq ($(PIN_COMPATIBLE),)
10 $(call CATASTROPHIC_ERROR,Converting to '$(CONVERT_TO)' not possible!)
11 endif
12
13 # glob to search each platfrorm and/or check for valid converter
14 CONVERTER := $(wildcard $(PLATFORM_PATH)/*/converters/$(PIN_COMPATIBLE)_to_$(CONVERT_TO)/)
15 ifeq ($(CONVERTER),)
16 $(call CATASTROPHIC_ERROR,Converting from '$(PIN_COMPATIBLE)' to '$(CONVERT_TO)' not possible!)
17 endif
18
19 -include $(CONVERTER)/pre_converter.mk
20
21 PLATFORM_KEY = $(shell echo $(CONVERTER) | cut -d "/" -f2)
22
23 # Configure any defaults
24 OPT_DEFS += -DCONVERT_TO_$(shell echo $(CONVERT_TO) | tr '[:lower:]' '[:upper:]')
25 OPT_DEFS += -DCONVERTER_TARGET=\"$(CONVERT_TO)\"
26 OPT_DEFS += -DCONVERTER_ENABLED
27 VPATH += $(CONVERTER)
28
29 # Configure for "alias" - worst case it produces an idential define
30 OPT_DEFS += -DCONVERT_TO_$(shell echo $(ACTIVE_CONVERTER) | tr '[:lower:]' '[:upper:]')
31
32 # Finally run any converter specific logic
33 include $(CONVERTER)/converter.mk
34endif
diff --git a/builddefs/disable_features.mk b/builddefs/disable_features.mk
new file mode 100644
index 0000000000..fe918b72b2
--- /dev/null
+++ b/builddefs/disable_features.mk
@@ -0,0 +1,27 @@
1# Unconditionally disable features that a keyboard advertises it doesn't support
2
3FEATURE_NAMES :=
4FEATURE_NAMES += AUDIO
5FEATURE_NAMES += BACKLIGHT
6FEATURE_NAMES += BLUETOOTH
7FEATURE_NAMES += DIP_SWITCH
8FEATURE_NAMES += DYNAMIC_KEYMAP
9FEATURE_NAMES += ENCODER
10FEATURE_NAMES += HAPTIC
11FEATURE_NAMES += HD44780
12FEATURE_NAMES += IOS_DEVICE
13FEATURE_NAMES += LCD_BACKLIGHT
14FEATURE_NAMES += LCD
15FEATURE_NAMES += OLED
16FEATURE_NAMES += POINTING_DEVICE
17FEATURE_NAMES += PS2_MOUSE
18FEATURE_NAMES += RGBLIGHT
19FEATURE_NAMES += RGB_MATRIX
20FEATURE_NAMES += SLEEP_LED
21FEATURE_NAMES += STENO
22FEATURE_NAMES += SWAP_HANDS
23FEATURE_NAMES += WATCHDOG
24FEATURE_NAMES += XT
25
26$(foreach AFEATURE,$(FEATURE_NAMES),\
27 $(if $(filter $($(AFEATURE)_SUPPORTED),no),$(eval $(AFEATURE)_ENABLE=no)))
diff --git a/builddefs/docsgen/.gitignore b/builddefs/docsgen/.gitignore
new file mode 100644
index 0000000000..e71427cba3
--- /dev/null
+++ b/builddefs/docsgen/.gitignore
@@ -0,0 +1,5 @@
1node_modules
2.vitepress/cache
3.vitepress/.temp
4.vitepress/dist
5docs
diff --git a/builddefs/docsgen/.vitepress/config.mts b/builddefs/docsgen/.vitepress/config.mts
new file mode 100644
index 0000000000..d2fe2886b2
--- /dev/null
+++ b/builddefs/docsgen/.vitepress/config.mts
@@ -0,0 +1,58 @@
1import { defineConfig } from "vitepress";
2import { tabsMarkdownPlugin } from "vitepress-plugin-tabs";
3import sidebar from "../../../docs/_sidebar.json";
4
5// https://vitepress.dev/reference/site-config
6export default defineConfig(({ mode }) => {
7 const prod = mode === "production";
8 return {
9 title: "QMK Firmware",
10 description: "Documentation for QMK Firmware",
11
12 srcDir: prod ? "docs" : "../../docs",
13 outDir: "../../.build/docs",
14 cleanUrls: true,
15
16 markdown: {
17 config(md) {
18 md.use(tabsMarkdownPlugin);
19 },
20 },
21
22 vite: {
23 resolve: {
24 preserveSymlinks: true,
25 },
26 },
27
28 themeConfig: {
29 // https://vitepress.dev/reference/default-theme-config
30 logo: {
31 light: "/qmk-logo-light.svg",
32 dark: "/qmk-logo-dark.svg",
33 },
34 title: 'QMK Firmware',
35
36 nav: [{ text: "Home", link: "/" }],
37
38 search: {
39 provider: "local",
40 },
41
42 editLink: {
43 pattern: 'https://github.com/qmk/qmk_firmware/edit/master/docs/:path'
44 },
45 lastUpdated: true,
46
47 sidebar: sidebar,
48
49 externalLinkIcon: true,
50
51 socialLinks: [
52 { icon: { svg: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M 29 3 C 28.0625 3 27.164063 3.382813 26.5 4 C 25.835938 4.617188 25.363281 5.433594 25 6.40625 C 24.355469 8.140625 24.085938 10.394531 24.03125 13.03125 C 19.234375 13.179688 14.820313 14.421875 11.28125 16.46875 C 10.214844 15.46875 8.855469 14.96875 7.5 14.96875 C 6.089844 14.96875 4.675781 15.511719 3.59375 16.59375 C 1.425781 18.761719 1.425781 22.238281 3.59375 24.40625 L 3.84375 24.65625 C 3.3125 26.035156 3 27.488281 3 29 C 3 33.527344 5.566406 37.585938 9.5625 40.4375 C 13.558594 43.289063 19.007813 45 25 45 C 30.992188 45 36.441406 43.289063 40.4375 40.4375 C 44.433594 37.585938 47 33.527344 47 29 C 47 27.488281 46.6875 26.035156 46.15625 24.65625 L 46.40625 24.40625 C 48.574219 22.238281 48.574219 18.761719 46.40625 16.59375 C 45.324219 15.511719 43.910156 14.96875 42.5 14.96875 C 41.144531 14.96875 39.785156 15.46875 38.71875 16.46875 C 35.195313 14.433594 30.800781 13.191406 26.03125 13.03125 C 26.09375 10.546875 26.363281 8.46875 26.875 7.09375 C 27.164063 6.316406 27.527344 5.757813 27.875 5.4375 C 28.222656 5.117188 28.539063 5 29 5 C 29.460938 5 29.683594 5.125 30.03125 5.40625 C 30.378906 5.6875 30.785156 6.148438 31.3125 6.6875 C 32.253906 7.652344 33.695313 8.714844 36.09375 8.9375 C 36.539063 11.238281 38.574219 13 41 13 C 43.75 13 46 10.75 46 8 C 46 5.25 43.75 3 41 3 C 38.605469 3 36.574219 4.710938 36.09375 6.96875 C 34.3125 6.796875 33.527344 6.109375 32.75 5.3125 C 32.300781 4.851563 31.886719 4.3125 31.3125 3.84375 C 30.738281 3.375 29.9375 3 29 3 Z M 41 5 C 42.667969 5 44 6.332031 44 8 C 44 9.667969 42.667969 11 41 11 C 39.332031 11 38 9.667969 38 8 C 38 6.332031 39.332031 5 41 5 Z M 25 15 C 30.609375 15 35.675781 16.613281 39.28125 19.1875 C 42.886719 21.761719 45 25.226563 45 29 C 45 32.773438 42.886719 36.238281 39.28125 38.8125 C 35.675781 41.386719 30.609375 43 25 43 C 19.390625 43 14.324219 41.386719 10.71875 38.8125 C 7.113281 36.238281 5 32.773438 5 29 C 5 25.226563 7.113281 21.761719 10.71875 19.1875 C 14.324219 16.613281 19.390625 15 25 15 Z M 7.5 16.9375 C 8.203125 16.9375 8.914063 17.148438 9.53125 17.59375 C 7.527344 19.03125 5.886719 20.769531 4.75 22.71875 C 3.582031 21.296875 3.660156 19.339844 5 18 C 5.714844 17.285156 6.609375 16.9375 7.5 16.9375 Z M 42.5 16.9375 C 43.390625 16.9375 44.285156 17.285156 45 18 C 46.339844 19.339844 46.417969 21.296875 45.25 22.71875 C 44.113281 20.769531 42.472656 19.03125 40.46875 17.59375 C 41.085938 17.148438 41.796875 16.9375 42.5 16.9375 Z M 17 22 C 14.800781 22 13 23.800781 13 26 C 13 28.199219 14.800781 30 17 30 C 19.199219 30 21 28.199219 21 26 C 21 23.800781 19.199219 22 17 22 Z M 33 22 C 30.800781 22 29 23.800781 29 26 C 29 28.199219 30.800781 30 33 30 C 35.199219 30 37 28.199219 37 26 C 37 23.800781 35.199219 22 33 22 Z M 17 24 C 18.117188 24 19 24.882813 19 26 C 19 27.117188 18.117188 28 17 28 C 15.882813 28 15 27.117188 15 26 C 15 24.882813 15.882813 24 17 24 Z M 33 24 C 34.117188 24 35 24.882813 35 26 C 35 27.117188 34.117188 28 33 28 C 31.882813 28 31 27.117188 31 26 C 31 24.882813 31.882813 24 33 24 Z M 34.15625 33.84375 C 34.101563 33.851563 34.050781 33.859375 34 33.875 C 33.683594 33.9375 33.417969 34.144531 33.28125 34.4375 C 33.28125 34.4375 32.757813 35.164063 31.4375 36 C 30.117188 36.835938 28.058594 37.6875 25 37.6875 C 21.941406 37.6875 19.882813 36.835938 18.5625 36 C 17.242188 35.164063 16.71875 34.4375 16.71875 34.4375 C 16.492188 34.082031 16.066406 33.90625 15.65625 34 C 15.332031 34.082031 15.070313 34.316406 14.957031 34.632813 C 14.84375 34.945313 14.894531 35.292969 15.09375 35.5625 C 15.09375 35.5625 15.863281 36.671875 17.46875 37.6875 C 19.074219 38.703125 21.558594 39.6875 25 39.6875 C 28.441406 39.6875 30.925781 38.703125 32.53125 37.6875 C 34.136719 36.671875 34.90625 35.5625 34.90625 35.5625 C 35.207031 35.273438 35.296875 34.824219 35.128906 34.441406 C 34.960938 34.058594 34.574219 33.820313 34.15625 33.84375 Z"/></svg>' }, link: "https://reddit.com/r/olkb" },
53 { icon: "discord", link: "https://discord.gg/qmk" },
54 { icon: "github", link: "https://github.com/qmk/qmk_firmware" },
55 ],
56 }
57 };
58});
diff --git a/builddefs/docsgen/.vitepress/theme/QMKLayout.vue b/builddefs/docsgen/.vitepress/theme/QMKLayout.vue
new file mode 100644
index 0000000000..9d7a41f9e2
--- /dev/null
+++ b/builddefs/docsgen/.vitepress/theme/QMKLayout.vue
@@ -0,0 +1,29 @@
1<script setup>
2import DefaultTheme from 'vitepress/theme'
3import { useRouter } from 'vitepress'
4import { onBeforeMount } from 'vue';
5import aliases from "../../../../docs/_aliases.json";
6
7const router = useRouter()
8onBeforeMount(async () => {
9 // Convert from docsify-style to vitepress-style URLs
10 let newUrl = window.location.href.replace(/\/#\//, '/').replace(/\?id=/, '#');
11
12 // Convert any aliases
13 let testUrl = new URL(newUrl);
14 while (testUrl.pathname in aliases) {
15 testUrl.pathname = aliases[testUrl.pathname];
16 }
17 newUrl = testUrl.toString();
18
19 // Redirect if required
20 if (newUrl != window.location.href) {
21 window.history.replaceState({}, '', newUrl);
22 await router.go(newUrl);
23 }
24});
25</script>
26
27<template>
28 <DefaultTheme.Layout/>
29</template>
diff --git a/builddefs/docsgen/.vitepress/theme/custom.css b/builddefs/docsgen/.vitepress/theme/custom.css
new file mode 100644
index 0000000000..732cb5b74f
--- /dev/null
+++ b/builddefs/docsgen/.vitepress/theme/custom.css
@@ -0,0 +1,19 @@
1/* Override <kbd> as vitepress doesn't put them with borders */
2kbd {
3 border: 1px solid var(--vp-c-text-1);
4 border-radius: 5px;
5 margin: 0.2em;
6 padding: 0.2em;
7}
8
9:root {
10 --vp-nav-logo-height: 32px;
11
12 --vp-layout-max-width: calc(98% + 64px);
13
14 --vp-sidebar-width: 300px;
15}
16
17.VPDoc.has-aside .content-container {
18 max-width: unset !important;
19}
diff --git a/builddefs/docsgen/.vitepress/theme/index.ts b/builddefs/docsgen/.vitepress/theme/index.ts
new file mode 100644
index 0000000000..3c820ec5ab
--- /dev/null
+++ b/builddefs/docsgen/.vitepress/theme/index.ts
@@ -0,0 +1,13 @@
1import type { Theme } from 'vitepress'
2import DefaultTheme from 'vitepress/theme'
3import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client'
4import QMKLayout from './QMKLayout.vue'
5import './custom.css'
6
7export default {
8 extends: DefaultTheme,
9 Layout: QMKLayout,
10 enhanceApp({ app }) {
11 enhanceAppWithTabs(app)
12 }
13} satisfies Theme
diff --git a/builddefs/docsgen/build-docs.sh b/builddefs/docsgen/build-docs.sh
new file mode 100755
index 0000000000..2ea884752f
--- /dev/null
+++ b/builddefs/docsgen/build-docs.sh
@@ -0,0 +1,6 @@
1#!/usr/bin/env bash
2
3cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
4yarn install
5[[ -e docs ]] || ln -sf ../../docs docs
6DEBUG='vitepress:*,vite:*' yarn run docs:build
diff --git a/builddefs/docsgen/package.json b/builddefs/docsgen/package.json
new file mode 100644
index 0000000000..b6c56f3448
--- /dev/null
+++ b/builddefs/docsgen/package.json
@@ -0,0 +1,14 @@
1{
2 "license": "GPL-2.0-or-later",
3 "devDependencies": {
4 "vite": "^5.4.21",
5 "vitepress": "^1.1.0",
6 "vitepress-plugin-tabs": "^0.5.0",
7 "vue": "^3.4.24"
8 },
9 "scripts": {
10 "docs:dev": "vitepress dev --host 0.0.0.0",
11 "docs:build": "vitepress build",
12 "docs:preview": "vitepress preview --host 0.0.0.0"
13 }
14}
diff --git a/builddefs/docsgen/start-docs.sh b/builddefs/docsgen/start-docs.sh
new file mode 100755
index 0000000000..e6e044c6a1
--- /dev/null
+++ b/builddefs/docsgen/start-docs.sh
@@ -0,0 +1,5 @@
1#!/usr/bin/env bash
2
3cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
4yarn install
5DEBUG='vitepress:*,vite:*' yarn run docs:dev
diff --git a/builddefs/docsgen/yarn.lock b/builddefs/docsgen/yarn.lock
new file mode 100644
index 0000000000..e5eaaa2c8f
--- /dev/null
+++ b/builddefs/docsgen/yarn.lock
@@ -0,0 +1,820 @@
1# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2# yarn lockfile v1
3
4
5"@algolia/autocomplete-core@1.9.3":
6 version "1.9.3"
7 resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7"
8 integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==
9 dependencies:
10 "@algolia/autocomplete-plugin-algolia-insights" "1.9.3"
11 "@algolia/autocomplete-shared" "1.9.3"
12
13"@algolia/autocomplete-plugin-algolia-insights@1.9.3":
14 version "1.9.3"
15 resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587"
16 integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==
17 dependencies:
18 "@algolia/autocomplete-shared" "1.9.3"
19
20"@algolia/autocomplete-preset-algolia@1.9.3":
21 version "1.9.3"
22 resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da"
23 integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==
24 dependencies:
25 "@algolia/autocomplete-shared" "1.9.3"
26
27"@algolia/autocomplete-shared@1.9.3":
28 version "1.9.3"
29 resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa"
30 integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==
31
32"@algolia/cache-browser-local-storage@4.23.3":
33 version "4.23.3"
34 resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.3.tgz#0cc26b96085e1115dac5fcb9d826651ba57faabc"
35 integrity sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==
36 dependencies:
37 "@algolia/cache-common" "4.23.3"
38
39"@algolia/cache-common@4.23.3":
40 version "4.23.3"
41 resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.23.3.tgz#3bec79092d512a96c9bfbdeec7cff4ad36367166"
42 integrity sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==
43
44"@algolia/cache-in-memory@4.23.3":
45 version "4.23.3"
46 resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.23.3.tgz#3945f87cd21ffa2bec23890c85305b6b11192423"
47 integrity sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==
48 dependencies:
49 "@algolia/cache-common" "4.23.3"
50
51"@algolia/client-account@4.23.3":
52 version "4.23.3"
53 resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.23.3.tgz#8751bbf636e6741c95e7c778488dee3ee430ac6f"
54 integrity sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==
55 dependencies:
56 "@algolia/client-common" "4.23.3"
57 "@algolia/client-search" "4.23.3"
58 "@algolia/transporter" "4.23.3"
59
60"@algolia/client-analytics@4.23.3":
61 version "4.23.3"
62 resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.23.3.tgz#f88710885278fe6fb6964384af59004a5a6f161d"
63 integrity sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==
64 dependencies:
65 "@algolia/client-common" "4.23.3"
66 "@algolia/client-search" "4.23.3"
67 "@algolia/requester-common" "4.23.3"
68 "@algolia/transporter" "4.23.3"
69
70"@algolia/client-common@4.23.3":
71 version "4.23.3"
72 resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.23.3.tgz#891116aa0db75055a7ecc107649f7f0965774704"
73 integrity sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==
74 dependencies:
75 "@algolia/requester-common" "4.23.3"
76 "@algolia/transporter" "4.23.3"
77
78"@algolia/client-personalization@4.23.3":
79 version "4.23.3"
80 resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.23.3.tgz#35fa8e5699b0295fbc400a8eb211dc711e5909db"
81 integrity sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==
82 dependencies:
83 "@algolia/client-common" "4.23.3"
84 "@algolia/requester-common" "4.23.3"
85 "@algolia/transporter" "4.23.3"
86
87"@algolia/client-search@4.23.3":
88 version "4.23.3"
89 resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.23.3.tgz#a3486e6af13a231ec4ab43a915a1f318787b937f"
90 integrity sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==
91 dependencies:
92 "@algolia/client-common" "4.23.3"
93 "@algolia/requester-common" "4.23.3"
94 "@algolia/transporter" "4.23.3"
95
96"@algolia/logger-common@4.23.3":
97 version "4.23.3"
98 resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.23.3.tgz#35c6d833cbf41e853a4f36ba37c6e5864920bfe9"
99 integrity sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==
100
101"@algolia/logger-console@4.23.3":
102 version "4.23.3"
103 resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.23.3.tgz#30f916781826c4db5f51fcd9a8a264a06e136985"
104 integrity sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==
105 dependencies:
106 "@algolia/logger-common" "4.23.3"
107
108"@algolia/recommend@4.23.3":
109 version "4.23.3"
110 resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.23.3.tgz#53d4f194d22d9c72dc05f3f7514c5878f87c5890"
111 integrity sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==
112 dependencies:
113 "@algolia/cache-browser-local-storage" "4.23.3"
114 "@algolia/cache-common" "4.23.3"
115 "@algolia/cache-in-memory" "4.23.3"
116 "@algolia/client-common" "4.23.3"
117 "@algolia/client-search" "4.23.3"
118 "@algolia/logger-common" "4.23.3"
119 "@algolia/logger-console" "4.23.3"
120 "@algolia/requester-browser-xhr" "4.23.3"
121 "@algolia/requester-common" "4.23.3"
122 "@algolia/requester-node-http" "4.23.3"
123 "@algolia/transporter" "4.23.3"
124
125"@algolia/requester-browser-xhr@4.23.3":
126 version "4.23.3"
127 resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.3.tgz#9e47e76f60d540acc8b27b4ebc7a80d1b41938b9"
128 integrity sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==
129 dependencies:
130 "@algolia/requester-common" "4.23.3"
131
132"@algolia/requester-common@4.23.3":
133 version "4.23.3"
134 resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.23.3.tgz#7dbae896e41adfaaf1d1fa5f317f83a99afb04b3"
135 integrity sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==
136
137"@algolia/requester-node-http@4.23.3":
138 version "4.23.3"
139 resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.23.3.tgz#c9f94a5cb96a15f48cea338ab6ef16bbd0ff989f"
140 integrity sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==
141 dependencies:
142 "@algolia/requester-common" "4.23.3"
143
144"@algolia/transporter@4.23.3":
145 version "4.23.3"
146 resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.23.3.tgz#545b045b67db3850ddf0bbecbc6c84ff1f3398b7"
147 integrity sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==
148 dependencies:
149 "@algolia/cache-common" "4.23.3"
150 "@algolia/logger-common" "4.23.3"
151 "@algolia/requester-common" "4.23.3"
152
153"@babel/parser@^7.24.4":
154 version "7.24.4"
155 resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
156 integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
157
158"@docsearch/css@3.6.0", "@docsearch/css@^3.6.0":
159 version "3.6.0"
160 resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.0.tgz#0e9f56f704b3a34d044d15fd9962ebc1536ba4fb"
161 integrity sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==
162
163"@docsearch/js@^3.6.0":
164 version "3.6.0"
165 resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.6.0.tgz#f9e46943449b9092d874944f7a80bcc071004cfb"
166 integrity sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==
167 dependencies:
168 "@docsearch/react" "3.6.0"
169 preact "^10.0.0"
170
171"@docsearch/react@3.6.0":
172 version "3.6.0"
173 resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.0.tgz#b4f25228ecb7fc473741aefac592121e86dd2958"
174 integrity sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==
175 dependencies:
176 "@algolia/autocomplete-core" "1.9.3"
177 "@algolia/autocomplete-preset-algolia" "1.9.3"
178 "@docsearch/css" "3.6.0"
179 algoliasearch "^4.19.1"
180
181"@esbuild/aix-ppc64@0.21.5":
182 version "0.21.5"
183 resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
184 integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
185
186"@esbuild/android-arm64@0.21.5":
187 version "0.21.5"
188 resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
189 integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
190
191"@esbuild/android-arm@0.21.5":
192 version "0.21.5"
193 resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
194 integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
195
196"@esbuild/android-x64@0.21.5":
197 version "0.21.5"
198 resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
199 integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
200
201"@esbuild/darwin-arm64@0.21.5":
202 version "0.21.5"
203 resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
204 integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
205
206"@esbuild/darwin-x64@0.21.5":
207 version "0.21.5"
208 resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
209 integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
210
211"@esbuild/freebsd-arm64@0.21.5":
212 version "0.21.5"
213 resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
214 integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
215
216"@esbuild/freebsd-x64@0.21.5":
217 version "0.21.5"
218 resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
219 integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
220
221"@esbuild/linux-arm64@0.21.5":
222 version "0.21.5"
223 resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
224 integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
225
226"@esbuild/linux-arm@0.21.5":
227 version "0.21.5"
228 resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
229 integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
230
231"@esbuild/linux-ia32@0.21.5":
232 version "0.21.5"
233 resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
234 integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
235
236"@esbuild/linux-loong64@0.21.5":
237 version "0.21.5"
238 resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
239 integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
240
241"@esbuild/linux-mips64el@0.21.5":
242 version "0.21.5"
243 resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
244 integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
245
246"@esbuild/linux-ppc64@0.21.5":
247 version "0.21.5"
248 resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
249 integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
250
251"@esbuild/linux-riscv64@0.21.5":
252 version "0.21.5"
253 resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
254 integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
255
256"@esbuild/linux-s390x@0.21.5":
257 version "0.21.5"
258 resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
259 integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
260
261"@esbuild/linux-x64@0.21.5":
262 version "0.21.5"
263 resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
264 integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
265
266"@esbuild/netbsd-x64@0.21.5":
267 version "0.21.5"
268 resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
269 integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
270
271"@esbuild/openbsd-x64@0.21.5":
272 version "0.21.5"
273 resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
274 integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
275
276"@esbuild/sunos-x64@0.21.5":
277 version "0.21.5"
278 resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
279 integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
280
281"@esbuild/win32-arm64@0.21.5":
282 version "0.21.5"
283 resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
284 integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
285
286"@esbuild/win32-ia32@0.21.5":
287 version "0.21.5"
288 resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
289 integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
290
291"@esbuild/win32-x64@0.21.5":
292 version "0.21.5"
293 resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
294 integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
295
296"@jridgewell/sourcemap-codec@^1.4.15":
297 version "1.4.15"
298 resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
299 integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
300
301"@rollup/rollup-android-arm-eabi@4.31.0":
302 version "4.31.0"
303 resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz#d4dd60da0075a6ce9a6c76d71b8204f3e1822285"
304 integrity sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==
305
306"@rollup/rollup-android-arm64@4.31.0":
307 version "4.31.0"
308 resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz#25c4d33259a7a2ccd2f52a5ffcc0bb3ab3f0729d"
309 integrity sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==
310
311"@rollup/rollup-darwin-arm64@4.31.0":
312 version "4.31.0"
313 resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz#d137dff254b19163a6b52ac083a71cd055dae844"
314 integrity sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==
315
316"@rollup/rollup-darwin-x64@4.31.0":
317 version "4.31.0"
318 resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz#58ff20b5dacb797d3adca19f02a21c532f9d55bf"
319 integrity sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==
320
321"@rollup/rollup-freebsd-arm64@4.31.0":
322 version "4.31.0"
323 resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz#96ce1a241c591ec3e068f4af765d94eddb24e60c"
324 integrity sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==
325
326"@rollup/rollup-freebsd-x64@4.31.0":
327 version "4.31.0"
328 resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz#e59e7ede505be41f0b4311b0b943f8eb44938467"
329 integrity sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==
330
331"@rollup/rollup-linux-arm-gnueabihf@4.31.0":
332 version "4.31.0"
333 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz#e455ca6e4ff35bd46d62201c153352e717000a7b"
334 integrity sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==
335
336"@rollup/rollup-linux-arm-musleabihf@4.31.0":
337 version "4.31.0"
338 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz#bc1a93d807d19e70b1e343a5bfea43723bcd6327"
339 integrity sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==
340
341"@rollup/rollup-linux-arm64-gnu@4.31.0":
342 version "4.31.0"
343 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz#f38bf843f1dc3d5de680caf31084008846e3efae"
344 integrity sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==
345
346"@rollup/rollup-linux-arm64-musl@4.31.0":
347 version "4.31.0"
348 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz#b3987a96c18b7287129cf735be2dbf83e94d9d05"
349 integrity sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==
350
351"@rollup/rollup-linux-loongarch64-gnu@4.31.0":
352 version "4.31.0"
353 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz#0f0324044e71c4f02e9f49e7ec4e347b655b34ee"
354 integrity sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==
355
356"@rollup/rollup-linux-powerpc64le-gnu@4.31.0":
357 version "4.31.0"
358 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz#809479f27f1fd5b4eecd2aa732132ad952d454ba"
359 integrity sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==
360
361"@rollup/rollup-linux-riscv64-gnu@4.31.0":
362 version "4.31.0"
363 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz#7bc75c4f22db04d3c972f83431739cfa41c6a36e"
364 integrity sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==
365
366"@rollup/rollup-linux-s390x-gnu@4.31.0":
367 version "4.31.0"
368 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz#cfe8052345c55864d83ae343362cf1912480170e"
369 integrity sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==
370
371"@rollup/rollup-linux-x64-gnu@4.31.0":
372 version "4.31.0"
373 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz#c6b048f1e25f3fea5b4bd246232f4d07a159c5a0"
374 integrity sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==
375
376"@rollup/rollup-linux-x64-musl@4.31.0":
377 version "4.31.0"
378 resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz#615273ac52d1a201f4de191cbd3389016a9d7d80"
379 integrity sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==
380
381"@rollup/rollup-win32-arm64-msvc@4.31.0":
382 version "4.31.0"
383 resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz#32ed85810c1b831c648eca999d68f01255b30691"
384 integrity sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==
385
386"@rollup/rollup-win32-ia32-msvc@4.31.0":
387 version "4.31.0"
388 resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz#d47effada68bcbfdccd30c4a788d42e4542ff4d3"
389 integrity sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==
390
391"@rollup/rollup-win32-x64-msvc@4.31.0":
392 version "4.31.0"
393 resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz#7a2d89a82cf0388d60304964217dd7beac6de645"
394 integrity sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==
395
396"@shikijs/core@1.3.0", "@shikijs/core@^1.3.0":
397 version "1.3.0"
398 resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.3.0.tgz#5b93b51ddb8def1e3a1543107f9b5b0540f716f6"
399 integrity sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==
400
401"@shikijs/transformers@^1.3.0":
402 version "1.3.0"
403 resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.3.0.tgz#b03c5733ef61e25e4f53666bf11889f8876f34e9"
404 integrity sha512-3mlpg2I9CjhjE96dEWQOGeCWoPcyTov3s4aAsHmgvnTHa8MBknEnCQy8/xivJPSpD+olqOqIEoHnLfbNJK29AA==
405 dependencies:
406 shiki "1.3.0"
407
408"@types/estree@1.0.6":
409 version "1.0.6"
410 resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
411 integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
412
413"@types/linkify-it@*":
414 version "3.0.5"
415 resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8"
416 integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==
417
418"@types/markdown-it@^14.0.1":
419 version "14.0.1"
420 resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.0.1.tgz#3d3fdf9dba83b69edececc070d39ec72b84270a7"
421 integrity sha512-6WfOG3jXR78DW8L5cTYCVVGAsIFZskRHCDo5tbqa+qtKVt4oDRVH7hyIWu1SpDQJlmIoEivNQZ5h+AGAOrgOtQ==
422 dependencies:
423 "@types/linkify-it" "*"
424 "@types/mdurl" "*"
425
426"@types/mdurl@*":
427 version "1.0.5"
428 resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39"
429 integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==
430
431"@types/web-bluetooth@^0.0.20":
432 version "0.0.20"
433 resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
434 integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
435
436"@vitejs/plugin-vue@^5.0.4":
437 version "5.0.4"
438 resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz#508d6a0f2440f86945835d903fcc0d95d1bb8a37"
439 integrity sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==
440
441"@vue/compiler-core@3.4.24":
442 version "3.4.24"
443 resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.24.tgz#6b4a5ffddcd874a692f2acfa68981201bcd7096b"
444 integrity sha512-vbW/tgbwJYj62N/Ww99x0zhFTkZDTcGh3uwJEuadZ/nF9/xuFMC4693P9r+3sxGXISABpDKvffY5ApH9pmdd1A==
445 dependencies:
446 "@babel/parser" "^7.24.4"
447 "@vue/shared" "3.4.24"
448 entities "^4.5.0"
449 estree-walker "^2.0.2"
450 source-map-js "^1.2.0"
451
452"@vue/compiler-dom@3.4.24":
453 version "3.4.24"
454 resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.24.tgz#b7335a49f095b6d35e48b6f7be8da513c1fa52b8"
455 integrity sha512-4XgABML/4cNndVsQndG6BbGN7+EoisDwi3oXNovqL/4jdNhwvP8/rfRMTb6FxkxIxUUtg6AI1/qZvwfSjxJiWA==
456 dependencies:
457 "@vue/compiler-core" "3.4.24"
458 "@vue/shared" "3.4.24"
459
460"@vue/compiler-sfc@3.4.24":
461 version "3.4.24"
462 resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.24.tgz#2872e353147ce2a145169a33ddd4d68dc95c3a18"
463 integrity sha512-nRAlJUK02FTWfA2nuvNBAqsDZuERGFgxZ8sGH62XgFSvMxO2URblzulExsmj4gFZ8e+VAyDooU9oAoXfEDNxTA==
464 dependencies:
465 "@babel/parser" "^7.24.4"
466 "@vue/compiler-core" "3.4.24"
467 "@vue/compiler-dom" "3.4.24"
468 "@vue/compiler-ssr" "3.4.24"
469 "@vue/shared" "3.4.24"
470 estree-walker "^2.0.2"
471 magic-string "^0.30.10"
472 postcss "^8.4.38"
473 source-map-js "^1.2.0"
474
475"@vue/compiler-ssr@3.4.24":
476 version "3.4.24"
477 resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.24.tgz#0d11fe54dabd17cbd6393a16bf7f785da1cfab46"
478 integrity sha512-ZsAtr4fhaUFnVcDqwW3bYCSDwq+9Gk69q2r/7dAHDrOMw41kylaMgOP4zRnn6GIEJkQznKgrMOGPMFnLB52RbQ==
479 dependencies:
480 "@vue/compiler-dom" "3.4.24"
481 "@vue/shared" "3.4.24"
482
483"@vue/devtools-api@^7.0.27":
484 version "7.1.2"
485 resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.1.2.tgz#8808b0f008842b756bf1e9c30788837abb62ab3a"
486 integrity sha512-AKd49cN3BdRgttmX5Aw8op7sx6jmaPwaILcDjaa05UKc1yIHDYST7P8yGZs6zd2pKFETAQz40gmyG7+b57slsQ==
487 dependencies:
488 "@vue/devtools-kit" "^7.1.2"
489
490"@vue/devtools-kit@^7.1.2":
491 version "7.1.2"
492 resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.1.2.tgz#dfb7306edf895dadc556dd5f0c516809c2f94826"
493 integrity sha512-UTrcUSOhlI9eXqbPMHUWwA6NQiiPT3onzXsVk2JHGR8ZFFSkzsWTTpHyVA1woG8zvgu2HNV/wigW2k87p858zw==
494 dependencies:
495 "@vue/devtools-shared" "^7.1.2"
496 hookable "^5.5.3"
497 mitt "^3.0.1"
498 perfect-debounce "^1.0.0"
499 speakingurl "^14.0.1"
500
501"@vue/devtools-shared@^7.1.2":
502 version "7.1.2"
503 resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.1.2.tgz#7b1c1de10bab4756f271c377370a62833b4ee94b"
504 integrity sha512-r9cUf93VMhKSsxF2/cBbf6Lm1nRBx+r1pRuji5CiAf3JIPYPOjeEqJ13OuwP1fauYh1tyBFcCxt3eJPvHT59gg==
505 dependencies:
506 rfdc "^1.3.1"
507
508"@vue/reactivity@3.4.24":
509 version "3.4.24"
510 resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.24.tgz#150584316ca2acc4ed19a24f9f29863c3a17a7b2"
511 integrity sha512-nup3fSYg4i4LtNvu9slF/HF/0dkMQYfepUdORBcMSsankzRPzE7ypAFurpwyRBfU1i7Dn1kcwpYsE1wETSh91g==
512 dependencies:
513 "@vue/shared" "3.4.24"
514
515"@vue/runtime-core@3.4.24":
516 version "3.4.24"
517 resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.24.tgz#066c544dc59a07a96c12874a57b750c239124874"
518 integrity sha512-c7iMfj6cJMeAG3s5yOn9Rc5D9e2/wIuaozmGf/ICGCY3KV5H7mbTVdvEkd4ZshTq7RUZqj2k7LMJWVx+EBiY1g==
519 dependencies:
520 "@vue/reactivity" "3.4.24"
521 "@vue/shared" "3.4.24"
522
523"@vue/runtime-dom@3.4.24":
524 version "3.4.24"
525 resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.24.tgz#4f8e7acbe1e8ffa7c55af1366e4438729ebe9b20"
526 integrity sha512-uXKzuh/Emfad2Y7Qm0ABsLZZV6H3mAJ5ZVqmAOlrNQRf+T5mxpPGZBfec1hkP41t6h6FwF6RSGCs/gd8WbuySQ==
527 dependencies:
528 "@vue/runtime-core" "3.4.24"
529 "@vue/shared" "3.4.24"
530 csstype "^3.1.3"
531
532"@vue/server-renderer@3.4.24":
533 version "3.4.24"
534 resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.24.tgz#80dd546f8d6a9f5c4f8b68083fe9cc2d62299332"
535 integrity sha512-H+DLK4sQF6sRgzKyofmlEVBIV/9KrQU6HIV7nt6yIwSGGKvSwlV8pqJlebUKLpbXaNHugdSfAbP6YmXF69lxow==
536 dependencies:
537 "@vue/compiler-ssr" "3.4.24"
538 "@vue/shared" "3.4.24"
539
540"@vue/shared@3.4.24":
541 version "3.4.24"
542 resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.24.tgz#278ac71f492b392b9b17fe8fc7d324db1a8842db"
543 integrity sha512-BW4tajrJBM9AGAknnyEw5tO2xTmnqgup0VTnDAMcxYmqOX0RG0b9aSUGAbEKolD91tdwpA6oCwbltoJoNzpItw==
544
545"@vueuse/core@10.9.0", "@vueuse/core@^10.9.0":
546 version "10.9.0"
547 resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.9.0.tgz#7d779a95cf0189de176fee63cee4ba44b3c85d64"
548 integrity sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==
549 dependencies:
550 "@types/web-bluetooth" "^0.0.20"
551 "@vueuse/metadata" "10.9.0"
552 "@vueuse/shared" "10.9.0"
553 vue-demi ">=0.14.7"
554
555"@vueuse/integrations@^10.9.0":
556 version "10.9.0"
557 resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.9.0.tgz#2b1a9556215ad3c1f96d39cbfbef102cf6e0ec05"
558 integrity sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==
559 dependencies:
560 "@vueuse/core" "10.9.0"
561 "@vueuse/shared" "10.9.0"
562 vue-demi ">=0.14.7"
563
564"@vueuse/metadata@10.9.0":
565 version "10.9.0"
566 resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.9.0.tgz#769a1a9db65daac15cf98084cbf7819ed3758620"
567 integrity sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==
568
569"@vueuse/shared@10.9.0":
570 version "10.9.0"
571 resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.9.0.tgz#13af2a348de15d07b7be2fd0c7fc9853a69d8fe0"
572 integrity sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==
573 dependencies:
574 vue-demi ">=0.14.7"
575
576algoliasearch@^4.19.1:
577 version "4.23.3"
578 resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.23.3.tgz#e09011d0a3b0651444916a3e6bbcba064ec44b60"
579 integrity sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==
580 dependencies:
581 "@algolia/cache-browser-local-storage" "4.23.3"
582 "@algolia/cache-common" "4.23.3"
583 "@algolia/cache-in-memory" "4.23.3"
584 "@algolia/client-account" "4.23.3"
585 "@algolia/client-analytics" "4.23.3"
586 "@algolia/client-common" "4.23.3"
587 "@algolia/client-personalization" "4.23.3"
588 "@algolia/client-search" "4.23.3"
589 "@algolia/logger-common" "4.23.3"
590 "@algolia/logger-console" "4.23.3"
591 "@algolia/recommend" "4.23.3"
592 "@algolia/requester-browser-xhr" "4.23.3"
593 "@algolia/requester-common" "4.23.3"
594 "@algolia/requester-node-http" "4.23.3"
595 "@algolia/transporter" "4.23.3"
596
597csstype@^3.1.3:
598 version "3.1.3"
599 resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
600 integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
601
602entities@^4.5.0:
603 version "4.5.0"
604 resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
605 integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
606
607esbuild@^0.21.3:
608 version "0.21.5"
609 resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
610 integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
611 optionalDependencies:
612 "@esbuild/aix-ppc64" "0.21.5"
613 "@esbuild/android-arm" "0.21.5"
614 "@esbuild/android-arm64" "0.21.5"
615 "@esbuild/android-x64" "0.21.5"
616 "@esbuild/darwin-arm64" "0.21.5"
617 "@esbuild/darwin-x64" "0.21.5"
618 "@esbuild/freebsd-arm64" "0.21.5"
619 "@esbuild/freebsd-x64" "0.21.5"
620 "@esbuild/linux-arm" "0.21.5"
621 "@esbuild/linux-arm64" "0.21.5"
622 "@esbuild/linux-ia32" "0.21.5"
623 "@esbuild/linux-loong64" "0.21.5"
624 "@esbuild/linux-mips64el" "0.21.5"
625 "@esbuild/linux-ppc64" "0.21.5"
626 "@esbuild/linux-riscv64" "0.21.5"
627 "@esbuild/linux-s390x" "0.21.5"
628 "@esbuild/linux-x64" "0.21.5"
629 "@esbuild/netbsd-x64" "0.21.5"
630 "@esbuild/openbsd-x64" "0.21.5"
631 "@esbuild/sunos-x64" "0.21.5"
632 "@esbuild/win32-arm64" "0.21.5"
633 "@esbuild/win32-ia32" "0.21.5"
634 "@esbuild/win32-x64" "0.21.5"
635
636estree-walker@^2.0.2:
637 version "2.0.2"
638 resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
639 integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
640
641focus-trap@^7.5.4:
642 version "7.5.4"
643 resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2"
644 integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==
645 dependencies:
646 tabbable "^6.2.0"
647
648fsevents@~2.3.2, fsevents@~2.3.3:
649 version "2.3.3"
650 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
651 integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
652
653hookable@^5.5.3:
654 version "5.5.3"
655 resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d"
656 integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
657
658magic-string@^0.30.10:
659 version "0.30.10"
660 resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
661 integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==
662 dependencies:
663 "@jridgewell/sourcemap-codec" "^1.4.15"
664
665mark.js@8.11.1:
666 version "8.11.1"
667 resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5"
668 integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==
669
670minisearch@^6.3.0:
671 version "6.3.0"
672 resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b"
673 integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==
674
675mitt@^3.0.1:
676 version "3.0.1"
677 resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
678 integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
679
680nanoid@^3.3.8:
681 version "3.3.8"
682 resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf"
683 integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==
684
685perfect-debounce@^1.0.0:
686 version "1.0.0"
687 resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
688 integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
689
690picocolors@^1.1.1:
691 version "1.1.1"
692 resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
693 integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
694
695postcss@^8.4.38, postcss@^8.4.43:
696 version "8.5.1"
697 resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.1.tgz#e2272a1f8a807fafa413218245630b5db10a3214"
698 integrity sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==
699 dependencies:
700 nanoid "^3.3.8"
701 picocolors "^1.1.1"
702 source-map-js "^1.2.1"
703
704preact@^10.0.0:
705 version "10.20.2"
706 resolved "https://registry.yarnpkg.com/preact/-/preact-10.20.2.tgz#0b343299a8c020562311cc25db93b3d832ec5e71"
707 integrity sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==
708
709rfdc@^1.3.1:
710 version "1.3.1"
711 resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
712 integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
713
714rollup@^4.20.0:
715 version "4.31.0"
716 resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4"
717 integrity sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==
718 dependencies:
719 "@types/estree" "1.0.6"
720 optionalDependencies:
721 "@rollup/rollup-android-arm-eabi" "4.31.0"
722 "@rollup/rollup-android-arm64" "4.31.0"
723 "@rollup/rollup-darwin-arm64" "4.31.0"
724 "@rollup/rollup-darwin-x64" "4.31.0"
725 "@rollup/rollup-freebsd-arm64" "4.31.0"
726 "@rollup/rollup-freebsd-x64" "4.31.0"
727 "@rollup/rollup-linux-arm-gnueabihf" "4.31.0"
728 "@rollup/rollup-linux-arm-musleabihf" "4.31.0"
729 "@rollup/rollup-linux-arm64-gnu" "4.31.0"
730 "@rollup/rollup-linux-arm64-musl" "4.31.0"
731 "@rollup/rollup-linux-loongarch64-gnu" "4.31.0"
732 "@rollup/rollup-linux-powerpc64le-gnu" "4.31.0"
733 "@rollup/rollup-linux-riscv64-gnu" "4.31.0"
734 "@rollup/rollup-linux-s390x-gnu" "4.31.0"
735 "@rollup/rollup-linux-x64-gnu" "4.31.0"
736 "@rollup/rollup-linux-x64-musl" "4.31.0"
737 "@rollup/rollup-win32-arm64-msvc" "4.31.0"
738 "@rollup/rollup-win32-ia32-msvc" "4.31.0"
739 "@rollup/rollup-win32-x64-msvc" "4.31.0"
740 fsevents "~2.3.2"
741
742shiki@1.3.0, shiki@^1.3.0:
743 version "1.3.0"
744 resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.3.0.tgz#3eda35cb49f6f0a98525e9da48fc072e6c655a3f"
745 integrity sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==
746 dependencies:
747 "@shikijs/core" "1.3.0"
748
749source-map-js@^1.2.0:
750 version "1.2.0"
751 resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
752 integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
753
754source-map-js@^1.2.1:
755 version "1.2.1"
756 resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
757 integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
758
759speakingurl@^14.0.1:
760 version "14.0.1"
761 resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
762 integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
763
764tabbable@^6.2.0:
765 version "6.2.0"
766 resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
767 integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
768
769vite@^5.2.9, vite@^5.4.21:
770 version "5.4.21"
771 resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027"
772 integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==
773 dependencies:
774 esbuild "^0.21.3"
775 postcss "^8.4.43"
776 rollup "^4.20.0"
777 optionalDependencies:
778 fsevents "~2.3.3"
779
780vitepress-plugin-tabs@^0.5.0:
781 version "0.5.0"
782 resolved "https://registry.yarnpkg.com/vitepress-plugin-tabs/-/vitepress-plugin-tabs-0.5.0.tgz#2b193a72ed36b9fcd63e3907d3044fe7b6cf3e4e"
783 integrity sha512-SIhFWwGsUkTByfc2b279ray/E0Jt8vDTsM1LiHxmCOBAEMmvzIBZSuYYT1DpdDTiS3SuJieBheJkYnwCq/yD9A==
784
785vitepress@^1.1.0:
786 version "1.1.3"
787 resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.1.3.tgz#ded22392f5274680aaba8bb81dd4fb1c4741c02e"
788 integrity sha512-hGrIYN0w9IHWs0NQSnlMjKV/v/HLfD+Ywv5QdvCSkiT32mpNOOwUrZjnqZv/JL/WBPpUc94eghTUvmipxw0xrA==
789 dependencies:
790 "@docsearch/css" "^3.6.0"
791 "@docsearch/js" "^3.6.0"
792 "@shikijs/core" "^1.3.0"
793 "@shikijs/transformers" "^1.3.0"
794 "@types/markdown-it" "^14.0.1"
795 "@vitejs/plugin-vue" "^5.0.4"
796 "@vue/devtools-api" "^7.0.27"
797 "@vueuse/core" "^10.9.0"
798 "@vueuse/integrations" "^10.9.0"
799 focus-trap "^7.5.4"
800 mark.js "8.11.1"
801 minisearch "^6.3.0"
802 shiki "^1.3.0"
803 vite "^5.2.9"
804 vue "^3.4.23"
805
806vue-demi@>=0.14.7:
807 version "0.14.7"
808 resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2"
809 integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
810
811vue@^3.4.23, vue@^3.4.24:
812 version "3.4.24"
813 resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.24.tgz#f269549939a6c092480f018aa0bd886ba64f4c6f"
814 integrity sha512-NPdx7dLGyHmKHGRRU5bMRYVE+rechR+KDU5R2tSTNG36PuMwbfAJ+amEvOAw7BPfZp5sQulNELSLm5YUkau+Sg==
815 dependencies:
816 "@vue/compiler-dom" "3.4.24"
817 "@vue/compiler-sfc" "3.4.24"
818 "@vue/runtime-dom" "3.4.24"
819 "@vue/server-renderer" "3.4.24"
820 "@vue/shared" "3.4.24"
diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk
new file mode 100644
index 0000000000..6d394977bd
--- /dev/null
+++ b/builddefs/generic_features.mk
@@ -0,0 +1,75 @@
1# Copyright 2021 QMK
2#
3# This program is free software: you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation, either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16GRAVE_ESC_ENABLE ?= yes
17MAGIC_ENABLE ?= yes
18SEND_STRING_ENABLE ?= yes
19SPACE_CADET_ENABLE ?= yes
20
21GENERIC_FEATURES = \
22 AUTO_SHIFT \
23 AUTOCORRECT \
24 BATTERY \
25 BOOTMAGIC \
26 CAPS_WORD \
27 COMBO \
28 COMMAND \
29 CONNECTION \
30 CRC \
31 DEFERRED_EXEC \
32 DIGITIZER \
33 DIP_SWITCH \
34 DYNAMIC_KEYMAP \
35 DYNAMIC_MACRO \
36 DYNAMIC_TAPPING_TERM \
37 GRAVE_ESC \
38 HAPTIC \
39 KEYCODE_STRING \
40 KEY_LOCK \
41 KEY_OVERRIDE \
42 LAYER_LOCK \
43 LEADER \
44 MAGIC \
45 MOUSEKEY \
46 MUSIC \
47 OS_DETECTION \
48 PROGRAMMABLE_BUTTON \
49 REPEAT_KEY \
50 SECURE \
51 SEND_STRING \
52 SEQUENCER \
53 SPACE_CADET \
54 SWAP_HANDS \
55 TAP_DANCE \
56 TRI_LAYER \
57 VIA \
58 VIRTSER \
59 WPM \
60
61define HANDLE_GENERIC_FEATURE
62 # $$(info "Processing: $1_ENABLE $2.c")
63 SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
64 SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
65 SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
66 SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
67 VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
68 OPT_DEFS += -D$1_ENABLE
69endef
70
71$(foreach F,$(GENERIC_FEATURES),\
72 $(if $(filter yes, $(strip $($(F)_ENABLE))),\
73 $(eval $(call HANDLE_GENERIC_FEATURE,$(F),$(shell echo $(F) | tr '[:upper:]' '[:lower:]'))) \
74 ) \
75)
diff --git a/builddefs/message.mk b/builddefs/message.mk
new file mode 100644
index 0000000000..7c8f87f990
--- /dev/null
+++ b/builddefs/message.mk
@@ -0,0 +1,113 @@
1COLOR ?= true
2
3ifeq ($(COLOR),true)
4 NO_COLOR=\033[0m
5 OK_COLOR=\033[32;01m
6 ERROR_COLOR=\033[31;01m
7 WARN_COLOR=\033[33;01m
8 SKIPPED_COLOR=\033[36;01m
9 BLUE=\033[0;34m
10 BOLD=\033[1m
11endif
12
13ifneq ($(shell echo "1 2 3" | awk '{ printf "%2s", $$3; }' 2>/dev/null)," 3")
14 AWK=awk
15else
16 AWK=cat && test
17endif
18
19ON_ERROR ?= exit 1
20
21OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
22ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
23WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
24SKIPPED_STRING=$(SKIPPED_COLOR)[SKIPPED]$(NO_COLOR)\n
25
26TAB_LOG = printf "\n%s\n\n" "$$LOG" | $(AWK) '{ sub(/^/," | "); print }'
27TAB_LOG_PLAIN = printf "%s\n" "$$LOG"
28AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
29AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
30PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR)
31PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG)
32PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && $(ON_ERROR)
33PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN)
34PRINT_SKIPPED_PLAIN = ($(SILENT) || printf " $(SKIPPED_STRING)" | $(AWK_STATUS))
35PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS)
36BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi;
37MAKE_MSG_FORMAT = $(AWK) '{ printf "%-118s", $$0;}'
38
39# The UNSYNC_OUTPUT_CMD command disables the `--output-sync` for the current command, if the `--output-sync` granularity is `target` or lower.
40# This is achieved by telling make to treat the current command as if it invokes a recursive make subcommand (as if by calling `$(MAKE)`).
41UNSYNC_OUTPUT_CMD = +true
42
43# Define Messages
44# English
45MSG_ERRORS_NONE = Errors: none
46MSG_ERRORS = $(ERROR_COLOR)Make finished with errors\n$(NO_COLOR)
47MSG_BEGIN = -------- begin --------
48MSG_END = -------- end --------
49MSG_SIZE_BEFORE = Size before:
50MSG_SIZE_AFTER = Size after:
51MSG_COFF = Converting to AVR COFF:
52MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
53MSG_FLASH = Creating load file for flashing:
54MSG_UF2 = Creating UF2 file for deployment:
55MSG_EEPROM = Creating load file for EEPROM:
56MSG_BIN = Creating binary load file for flashing:
57MSG_EXTENDED_LISTING = Creating Extended Listing:
58MSG_SYMBOL_TABLE = Creating Symbol Table:
59MSG_EXECUTING = Executing:
60MSG_LINKING = Linking:
61MSG_COMPILING = Compiling:
62MSG_COMPILING_CXX = Compiling:
63MSG_ASSEMBLING = Assembling:
64MSG_CLEANING = Cleaning project:
65MSG_CREATING_LIBRARY = Creating library:
66MSG_GENERATING = Generating:
67MSG_NOT_REPO = $(WARN_COLOR)WARNING:$(NO_COLOR) Target folder is not a git repo, you probably downloaded a zip file instead of cloning.\n\
68Please consider following $(BOLD)https://docs.qmk.fm/\#/newbs_getting_started$(NO_COLOR).\n\n
69MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\
70Please consider running $(BOLD)qmk git-submodule$(NO_COLOR).\n\n
71
72define GENERATE_MSG_MAKE_KB
73 MSG_MAKE_KB_ACTUAL := Making $$(KB_SP) with keymap $(BOLD)$$(CURRENT_KM)$(NO_COLOR)
74 ifneq ($$(MAKE_TARGET),)
75 MSG_MAKE_KB_ACTUAL += and target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
76 endif
77endef
78MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL)
79define GENERATE_MSG_MAKE_TEST
80 MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_NAME)$(NO_COLOR)
81 ifneq ($$(MAKE_TARGET),)
82 MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR)
83 endif
84endef
85MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL)
86MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR)
87define GENERATE_MSG_AVAILABLE_KEYMAPS
88 MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR):
89endef
90MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
91
92MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n
93MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
94MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
95MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n
96MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
97MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
98MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n\n\
99 Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
100MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
101MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
102MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n
103BOOTLOADER_RETRY_TIME ?= 0.5
104MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
105
106define WARNING_MESSAGE
107 $(shell printf "\n %-99s $(WARN_STRING)\n" "$1" >&2)
108endef
109
110define CATASTROPHIC_ERROR
111 $(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2)
112 $(error $1)
113endef
diff --git a/builddefs/show_options.mk b/builddefs/show_options.mk
new file mode 100644
index 0000000000..1c1a3ebf8e
--- /dev/null
+++ b/builddefs/show_options.mk
@@ -0,0 +1,151 @@
1BUILD_OPTION_NAMES = \
2 BOOTMAGIC_ENABLE \
3 MOUSEKEY_ENABLE \
4 EXTRAKEY_ENABLE \
5 CONSOLE_ENABLE \
6 COMMAND_ENABLE \
7 NKRO_ENABLE \
8 CUSTOM_MATRIX \
9 DEBOUNCE_TYPE \
10 SPLIT_KEYBOARD \
11 DYNAMIC_KEYMAP_ENABLE \
12 USB_HID_ENABLE \
13 VIA_ENABLE
14
15HARDWARE_OPTION_NAMES = \
16 SLEEP_LED_ENABLE \
17 BACKLIGHT_ENABLE \
18 BACKLIGHT_DRIVER \
19 RGBLIGHT_ENABLE \
20 RGBLIGHT_DRIVER \
21 RGB_MATRIX_ENABLE \
22 RGB_MATRIX_DRIVER \
23 CIE1931_CURVE \
24 MIDI_ENABLE \
25 BLUETOOTH_ENABLE \
26 BLUETOOTH_DRIVER \
27 AUDIO_ENABLE \
28 HD44780_ENABLE \
29 ENCODER_ENABLE \
30 LED_TABLES \
31 POINTING_DEVICE_ENABLE \
32 DIP_SWITCH_ENABLE
33
34OTHER_OPTION_NAMES = \
35 UNICODE_ENABLE \
36 UCIS_ENABLE \
37 UNICODEMAP_ENABLE \
38 UNICODE_COMMON \
39 AUTO_SHIFT_ENABLE \
40 DYNAMIC_TAPPING_TERM_ENABLE \
41 COMBO_ENABLE \
42 KEY_LOCK_ENABLE \
43 KEY_OVERRIDE_ENABLE \
44 LEADER_ENABLE \
45 STENO_ENABLE \
46 STENO_PROTOCOL \
47 TAP_DANCE_ENABLE \
48 VIRTSER_ENABLE \
49 OLED_ENABLE \
50 OLED_DRIVER \
51 LED_BACK_ENABLE \
52 LED_UNDERGLOW_ENABLE \
53 LED_ANIMATIONS \
54 IOS_DEVICE_ENABLE \
55 HELIX ZINC \
56 AUTOLOG_ENABLE \
57 DEBUG_ENABLE \
58 ENCODER_MAP_ENABLE \
59 ENCODER_ENABLE_CUSTOM \
60 GERMAN_ENABLE \
61 HAPTIC_ENABLE \
62 KEYLOGGER_ENABLE \
63 LCD_BACKLIGHT_ENABLE \
64 MACROS_ENABLED \
65 PS2_ENABLE \
66 PS2_MOUSE_ENABLE \
67 PS2_DRIVER \
68 RAW_ENABLE \
69 SWAP_HANDS_ENABLE \
70 WATCHDOG_ENABLE \
71 ERGOINU \
72 NO_USB_STARTUP_CHECK \
73 DISABLE_PROMICRO_LEDs \
74 MITOSIS_DATAGROK_BOTTOMSPACE \
75 MITOSIS_DATAGROK_SLOWUART \
76 RGB_MATRIX_KEYPRESSES \
77 LED_MIRRORED \
78 RGBLIGHT_FULL_POWER \
79 LTO_ENABLE \
80 PROGRAMMABLE_BUTTON_ENABLE \
81 SECURE_ENABLE \
82 CAPS_WORD_ENABLE \
83 AUTOCORRECT_ENABLE \
84 TRI_LAYER_ENABLE \
85 REPEAT_KEY_ENABLE
86
87define NAME_ECHO
88 @printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)"
89
90endef
91
92define YAML_NAME_ECHO
93 @echo ' $1 : "$(strip $($1))"'
94
95endef
96
97.PHONY: show_build_options0 show_build_options
98show_build_options0:
99 @echo " KEYBOARD = $(KEYBOARD)"
100 @echo " KEYMAP = $(KEYMAP)"
101 @echo " MCU = $(MCU)"
102 @echo " MCU_SERIES = $(MCU_SERIES)"
103 @echo " PLATFORM = $(PLATFORM)"
104 @echo " BOOTLOADER = $(BOOTLOADER)"
105 @echo " FIRMWARE_FORMAT = $(FIRMWARE_FORMAT)"
106 @echo
107 @echo "Build Options:"
108 $(foreach A_OPTION_NAME,$(sort $(BUILD_OPTION_NAMES)),\
109 $(call NAME_ECHO,$(A_OPTION_NAME)))
110
111show_build_options: show_build_options0
112 @echo
113 @echo "If you want to know more, please try 'show_all_features' or 'show_full_features'"
114 @echo
115
116.PHONY: show_all_features
117show_all_features: show_build_options0
118 @echo
119 @echo "Hardware Options:"
120 $(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
121 $(if $($(A_OPTION_NAME)),$(call NAME_ECHO,$(A_OPTION_NAME))))
122 @echo
123 @echo "Other Options:"
124 $(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
125 $(if $($(A_OPTION_NAME)),$(call NAME_ECHO,$(A_OPTION_NAME))))
126
127.PHONY: show_full_features
128show_full_features: show_build_options0
129 @echo
130 @echo "Hardware Options:"
131 $(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
132 $(call NAME_ECHO,$(A_OPTION_NAME)))
133 @echo
134 @echo "Other Options:"
135 $(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
136 $(call NAME_ECHO,$(A_OPTION_NAME)))
137
138.PHONY: yaml_build_options
139yaml_build_options:
140 @echo '- KEYBOARD : "$(KEYBOARD)"'
141 @echo ' KEYMAP : "$(KEYMAP)"'
142 @echo ' MCU : "$(MCU)"'
143 @echo ' MCU_SERIES : "$(MCU_SERIES)"'
144 @echo ' PLATFORM : "$(PLATFORM)"'
145 @echo ' FIRMWARE_FORMAT : "$(FIRMWARE_FORMAT)"'
146 $(foreach A_OPTION_NAME,$(sort $(BUILD_OPTION_NAMES)),\
147 $(call YAML_NAME_ECHO,$(A_OPTION_NAME)))
148 $(foreach A_OPTION_NAME,$(sort $(HARDWARE_OPTION_NAMES)),\
149 $(if $($(A_OPTION_NAME)),$(call YAML_NAME_ECHO,$(A_OPTION_NAME))))
150 $(foreach A_OPTION_NAME,$(sort $(OTHER_OPTION_NAMES)),\
151 $(if $($(A_OPTION_NAME)),$(call YAML_NAME_ECHO,$(A_OPTION_NAME))))
diff --git a/builddefs/support.mk b/builddefs/support.mk
new file mode 100644
index 0000000000..7ef7b9b041
--- /dev/null
+++ b/builddefs/support.mk
@@ -0,0 +1,11 @@
1# Helper to determine if a compiler option is supported
2# Args:
3# $(1) = option to test, if successful will be output
4# $(2) = option to use if $(1) is not supported
5# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
6cc-option = $(shell \
7 if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
8 then echo "$(1)"; else echo "$(2)"; fi)
9
10# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
11, := ,
diff --git a/builddefs/testlist.mk b/builddefs/testlist.mk
new file mode 100644
index 0000000000..2e81fe576b
--- /dev/null
+++ b/builddefs/testlist.mk
@@ -0,0 +1,23 @@
1TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk)))
2FULL_TESTS := $(notdir $(TEST_LIST))
3
4include $(QUANTUM_PATH)/battery/tests/testlist.mk
5include $(QUANTUM_PATH)/debounce/tests/testlist.mk
6include $(QUANTUM_PATH)/encoder/tests/testlist.mk
7include $(QUANTUM_PATH)/os_detection/tests/testlist.mk
8include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
9include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk
10include $(PLATFORM_PATH)/test/testlist.mk
11
12define VALIDATE_TEST_LIST
13 ifneq ($1,)
14 ifeq ($$(findstring -,$1),-)
15 $$(call CATASTROPHIC_ERROR,Invalid test name,Test names can't contain '-', but '$1' does.)
16 else
17 $$(eval $$(call VALIDATE_TEST_LIST,$$(firstword $2),$$(wordlist 2,9999,$2)))
18 endif
19 endif
20endef
21
22
23$(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST))))