diff options
Diffstat (limited to 'builddefs')
| -rw-r--r-- | builddefs/build_full_test.mk | 37 | ||||
| -rw-r--r-- | builddefs/build_json.mk | 36 | ||||
| -rw-r--r-- | builddefs/build_keyboard.mk | 627 | ||||
| -rw-r--r-- | builddefs/build_layout.mk | 36 | ||||
| -rw-r--r-- | builddefs/build_test.mk | 95 | ||||
| -rw-r--r-- | builddefs/common_features.mk | 1034 | ||||
| -rw-r--r-- | builddefs/common_rules.mk | 408 | ||||
| -rw-r--r-- | builddefs/converters.mk | 34 | ||||
| -rw-r--r-- | builddefs/disable_features.mk | 27 | ||||
| -rw-r--r-- | builddefs/docsgen/.gitignore | 5 | ||||
| -rw-r--r-- | builddefs/docsgen/.vitepress/config.mts | 58 | ||||
| -rw-r--r-- | builddefs/docsgen/.vitepress/theme/QMKLayout.vue | 29 | ||||
| -rw-r--r-- | builddefs/docsgen/.vitepress/theme/custom.css | 19 | ||||
| -rw-r--r-- | builddefs/docsgen/.vitepress/theme/index.ts | 13 | ||||
| -rwxr-xr-x | builddefs/docsgen/build-docs.sh | 6 | ||||
| -rw-r--r-- | builddefs/docsgen/package.json | 14 | ||||
| -rwxr-xr-x | builddefs/docsgen/start-docs.sh | 5 | ||||
| -rw-r--r-- | builddefs/docsgen/yarn.lock | 820 | ||||
| -rw-r--r-- | builddefs/generic_features.mk | 75 | ||||
| -rw-r--r-- | builddefs/message.mk | 113 | ||||
| -rw-r--r-- | builddefs/show_options.mk | 151 | ||||
| -rw-r--r-- | builddefs/support.mk | 11 | ||||
| -rw-r--r-- | builddefs/testlist.mk | 23 |
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 | |||
| 37 | VPATH += $(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 | ||
| 2 | ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.json)","") | ||
| 3 | KEYMAP_JSON := $(MAIN_KEYMAP_PATH_5)/keymap.json | ||
| 4 | KEYMAP_JSON_PATH := $(MAIN_KEYMAP_PATH_5) | ||
| 5 | else 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) | ||
| 8 | else 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) | ||
| 11 | else 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) | ||
| 14 | else 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) | ||
| 17 | endif | ||
| 18 | |||
| 19 | ifneq ($(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 | ||
| 36 | endif | ||
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 | |||
| 7 | ifndef VERBOSE | ||
| 8 | .SILENT: | ||
| 9 | endif | ||
| 10 | |||
| 11 | .DEFAULT_GOAL := all | ||
| 12 | |||
| 13 | include paths.mk | ||
| 14 | include $(BUILDDEFS_PATH)/support.mk | ||
| 15 | include $(BUILDDEFS_PATH)/message.mk | ||
| 16 | |||
| 17 | # Helper to add defines with a 'QMK_' prefix | ||
| 18 | define 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 | ||
| 23 | endef | ||
| 24 | |||
| 25 | # Set the qmk cli to use | ||
| 26 | QMK_BIN ?= qmk | ||
| 27 | |||
| 28 | # Set the filename for the final firmware binary | ||
| 29 | KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD)) | ||
| 30 | TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP) | ||
| 31 | |||
| 32 | ifeq ($(strip $(DUMP_CI_METADATA)),yes) | ||
| 33 | $(info CI Metadata: KEYBOARD=$(KEYBOARD)) | ||
| 34 | $(info CI Metadata: KEYMAP=$(KEYMAP)) | ||
| 35 | endif | ||
| 36 | |||
| 37 | # Force expansion | ||
| 38 | override TARGET := $(TARGET) | ||
| 39 | |||
| 40 | ifneq ($(FORCE_LAYOUT),) | ||
| 41 | override TARGET := $(TARGET)_$(FORCE_LAYOUT) | ||
| 42 | endif | ||
| 43 | ifneq ($(CONVERT_TO),) | ||
| 44 | override TARGET := $(TARGET)_$(CONVERT_TO) | ||
| 45 | endif | ||
| 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! | ||
| 50 | INTERMEDIATE_OUTPUT := $(BUILD_DIR)/obj_$(TARGET) | ||
| 51 | |||
| 52 | ifdef SKIP_VERSION | ||
| 53 | OPT_DEFS += -DSKIP_VERSION | ||
| 54 | endif | ||
| 55 | |||
| 56 | # Generate the version.h file | ||
| 57 | VERSION_H_FLAGS := | ||
| 58 | ifdef SKIP_VERSION | ||
| 59 | VERSION_H_FLAGS += --skip-all | ||
| 60 | endif | ||
| 61 | ifdef SKIP_GIT | ||
| 62 | VERSION_H_FLAGS += --skip-git | ||
| 63 | endif | ||
| 64 | |||
| 65 | # Determine which subfolders exist. | ||
| 66 | KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD) | ||
| 67 | KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1))) | ||
| 68 | KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2))) | ||
| 69 | KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3))) | ||
| 70 | KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4))) | ||
| 71 | KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1)) | ||
| 72 | KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2)) | ||
| 73 | KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3)) | ||
| 74 | KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4)) | ||
| 75 | KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5)) | ||
| 76 | KEYBOARD_PATHS := | ||
| 77 | KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1) | ||
| 78 | KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2) | ||
| 79 | KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3) | ||
| 80 | KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4) | ||
| 81 | KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5) | ||
| 82 | |||
| 83 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | ||
| 84 | KEYBOARD_PATHS += $(KEYBOARD_PATH_5) | ||
| 85 | endif | ||
| 86 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | ||
| 87 | KEYBOARD_PATHS += $(KEYBOARD_PATH_4) | ||
| 88 | endif | ||
| 89 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | ||
| 90 | KEYBOARD_PATHS += $(KEYBOARD_PATH_3) | ||
| 91 | endif | ||
| 92 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | ||
| 93 | KEYBOARD_PATHS += $(KEYBOARD_PATH_2) | ||
| 94 | endif | ||
| 95 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | ||
| 96 | KEYBOARD_PATHS += $(KEYBOARD_PATH_1) | ||
| 97 | endif | ||
| 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 | ||
| 108 | DD_CONFIG_FILES := | ||
| 109 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") | ||
| 110 | DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json | ||
| 111 | endif | ||
| 112 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","") | ||
| 113 | DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json | ||
| 114 | endif | ||
| 115 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","") | ||
| 116 | DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json | ||
| 117 | endif | ||
| 118 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","") | ||
| 119 | DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json | ||
| 120 | endif | ||
| 121 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","") | ||
| 122 | DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json | ||
| 123 | endif | ||
| 124 | |||
| 125 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","") | ||
| 126 | DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json | ||
| 127 | endif | ||
| 128 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","") | ||
| 129 | DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json | ||
| 130 | endif | ||
| 131 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","") | ||
| 132 | DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json | ||
| 133 | endif | ||
| 134 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","") | ||
| 135 | DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json | ||
| 136 | endif | ||
| 137 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","") | ||
| 138 | DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json | ||
| 139 | endif | ||
| 140 | |||
| 141 | MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP) | ||
| 142 | MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP) | ||
| 143 | MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP) | ||
| 144 | MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP) | ||
| 145 | MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP) | ||
| 146 | |||
| 147 | # Pull in rules from DD keyboard config | ||
| 148 | INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk) | ||
| 149 | include $(INFO_RULES_MK) | ||
| 150 | |||
| 151 | # Check for keymap.json first, so we can regenerate keymap.c | ||
| 152 | include $(BUILDDEFS_PATH)/build_json.mk | ||
| 153 | |||
| 154 | # Pull in keymap level rules.mk | ||
| 155 | ifeq ("$(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 | ||
| 209 | endif | ||
| 210 | |||
| 211 | # Have we found a keymap.json? | ||
| 212 | ifneq ("$(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 | |||
| 250 | generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c $(INTERMEDIATE_OUTPUT)/src/keymap.h | ||
| 251 | |||
| 252 | endif | ||
| 253 | |||
| 254 | # Community modules | ||
| 255 | COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON)) | ||
| 256 | include $(COMMUNITY_RULES_MK) | ||
| 257 | |||
| 258 | ifneq ($(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 | |||
| 290 | SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c | ||
| 291 | |||
| 292 | generated-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 | |||
| 294 | endif | ||
| 295 | |||
| 296 | include $(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 | |||
| 301 | MCU_ORIG := $(MCU) | ||
| 302 | include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk) | ||
| 303 | |||
| 304 | # PLATFORM_KEY should be detected in DD keyboard config via key 'processor' (or rules.mk 'MCU') | ||
| 305 | ifeq ($(PLATFORM_KEY),) | ||
| 306 | $(call CATASTROPHIC_ERROR,Platform not defined) | ||
| 307 | endif | ||
| 308 | PLATFORM=$(shell echo $(PLATFORM_KEY) | tr '[:lower:]' '[:upper:]') | ||
| 309 | |||
| 310 | # Find all the C source files to be compiled in subfolders. | ||
| 311 | KEYBOARD_SRC := | ||
| 312 | |||
| 313 | KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c | ||
| 314 | KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c | ||
| 315 | KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c | ||
| 316 | KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c | ||
| 317 | KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c | ||
| 318 | |||
| 319 | ifneq ("$(wildcard $(KEYBOARD_C_5))","") | ||
| 320 | KEYBOARD_SRC += $(KEYBOARD_C_5) | ||
| 321 | endif | ||
| 322 | ifneq ("$(wildcard $(KEYBOARD_C_4))","") | ||
| 323 | KEYBOARD_SRC += $(KEYBOARD_C_4) | ||
| 324 | endif | ||
| 325 | ifneq ("$(wildcard $(KEYBOARD_C_3))","") | ||
| 326 | KEYBOARD_SRC += $(KEYBOARD_C_3) | ||
| 327 | endif | ||
| 328 | ifneq ("$(wildcard $(KEYBOARD_C_2))","") | ||
| 329 | KEYBOARD_SRC += $(KEYBOARD_C_2) | ||
| 330 | endif | ||
| 331 | ifneq ("$(wildcard $(KEYBOARD_C_1))","") | ||
| 332 | KEYBOARD_SRC += $(KEYBOARD_C_1) | ||
| 333 | endif | ||
| 334 | |||
| 335 | # Generate KEYBOARD_name_subname for all levels of the keyboard folder | ||
| 336 | KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1))) | ||
| 337 | KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2))) | ||
| 338 | KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3))) | ||
| 339 | KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4))) | ||
| 340 | KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5))) | ||
| 341 | |||
| 342 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") | ||
| 343 | OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5) | ||
| 344 | endif | ||
| 345 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") | ||
| 346 | OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4) | ||
| 347 | endif | ||
| 348 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") | ||
| 349 | OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3) | ||
| 350 | endif | ||
| 351 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") | ||
| 352 | OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2) | ||
| 353 | endif | ||
| 354 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") | ||
| 355 | OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1) | ||
| 356 | endif | ||
| 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 | # | ||
| 367 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","") | ||
| 368 | FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h | ||
| 369 | endif | ||
| 370 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","") | ||
| 371 | FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h | ||
| 372 | endif | ||
| 373 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","") | ||
| 374 | FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h | ||
| 375 | endif | ||
| 376 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","") | ||
| 377 | FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h | ||
| 378 | endif | ||
| 379 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","") | ||
| 380 | FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h | ||
| 381 | endif | ||
| 382 | |||
| 383 | # Find all of the config.h files and add them to our CONFIG_H define. | ||
| 384 | CONFIG_H := | ||
| 385 | |||
| 386 | define config_h_community_module_appender | ||
| 387 | ifneq ("$(wildcard $(1)/config.h)","") | ||
| 388 | CONFIG_H += $(1)/config.h | ||
| 389 | endif | ||
| 390 | endef | ||
| 391 | $(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call config_h_community_module_appender,$(module)))) | ||
| 392 | |||
| 393 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","") | ||
| 394 | CONFIG_H += $(KEYBOARD_PATH_5)/config.h | ||
| 395 | endif | ||
| 396 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","") | ||
| 397 | CONFIG_H += $(KEYBOARD_PATH_4)/config.h | ||
| 398 | endif | ||
| 399 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","") | ||
| 400 | CONFIG_H += $(KEYBOARD_PATH_3)/config.h | ||
| 401 | endif | ||
| 402 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","") | ||
| 403 | CONFIG_H += $(KEYBOARD_PATH_2)/config.h | ||
| 404 | endif | ||
| 405 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","") | ||
| 406 | CONFIG_H += $(KEYBOARD_PATH_1)/config.h | ||
| 407 | endif | ||
| 408 | |||
| 409 | POST_CONFIG_H := | ||
| 410 | |||
| 411 | define post_config_h_community_module_appender | ||
| 412 | ifneq ("$(wildcard $(1)/post_config.h)","") | ||
| 413 | POST_CONFIG_H += $(1)/post_config.h | ||
| 414 | endif | ||
| 415 | endef | ||
| 416 | $(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_config_h_community_module_appender,$(module)))) | ||
| 417 | |||
| 418 | ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","") | ||
| 419 | POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h | ||
| 420 | endif | ||
| 421 | ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","") | ||
| 422 | POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h | ||
| 423 | endif | ||
| 424 | ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","") | ||
| 425 | POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h | ||
| 426 | endif | ||
| 427 | ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","") | ||
| 428 | POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h | ||
| 429 | endif | ||
| 430 | ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","") | ||
| 431 | POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h | ||
| 432 | endif | ||
| 433 | |||
| 434 | CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h | ||
| 435 | KEYBOARD_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 | |||
| 452 | generated-files: $(INTERMEDIATE_OUTPUT)/src/info_config.h $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h | ||
| 453 | |||
| 454 | generated-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 | ||
| 466 | ifeq ("$(USER_NAME)","") | ||
| 467 | USER_NAME := $(KEYMAP) | ||
| 468 | endif | ||
| 469 | USER_PATH := users/$(USER_NAME) | ||
| 470 | |||
| 471 | # If we have userspace, then add it to the lookup VPATH | ||
| 472 | ifneq ($(wildcard $(QMK_USERSPACE)),) | ||
| 473 | VPATH += $(QMK_USERSPACE) | ||
| 474 | endif | ||
| 475 | |||
| 476 | # If the equivalent users directory exists in userspace, use that in preference to anything currently in the main repo | ||
| 477 | ifneq ($(QMK_USERSPACE),) | ||
| 478 | ifneq ($(wildcard $(QMK_USERSPACE)/$(USER_PATH)),) | ||
| 479 | USER_PATH := $(QMK_USERSPACE)/$(USER_PATH) | ||
| 480 | endif | ||
| 481 | endif | ||
| 482 | |||
| 483 | # Pull in user level rules.mk | ||
| 484 | -include $(USER_PATH)/rules.mk | ||
| 485 | ifneq ("$(wildcard $(USER_PATH)/config.h)","") | ||
| 486 | CONFIG_H += $(USER_PATH)/config.h | ||
| 487 | endif | ||
| 488 | ifneq ("$(wildcard $(USER_PATH)/post_config.h)","") | ||
| 489 | POST_CONFIG_H += $(USER_PATH)/post_config.h | ||
| 490 | endif | ||
| 491 | |||
| 492 | # Disable features that a keyboard doesn't support | ||
| 493 | -include $(BUILDDEFS_PATH)/disable_features.mk | ||
| 494 | |||
| 495 | ifneq ("$(CONVERTER)","") | ||
| 496 | -include $(CONVERTER)/post_converter.mk | ||
| 497 | endif | ||
| 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 | |||
| 506 | define post_rules_mk_community_module_includer | ||
| 507 | ifneq ("$(wildcard $(1)/post_rules.mk)","") | ||
| 508 | include $(1)/post_rules.mk | ||
| 509 | endif | ||
| 510 | endef | ||
| 511 | $(foreach module,$(COMMUNITY_MODULE_PATHS),$(eval $(call post_rules_mk_community_module_includer,$(module)))) | ||
| 512 | |||
| 513 | ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") | ||
| 514 | CONFIG_H += $(KEYMAP_PATH)/config.h | ||
| 515 | endif | ||
| 516 | ifneq ("$(KEYMAP_H)","") | ||
| 517 | CONFIG_H += $(KEYMAP_H) | ||
| 518 | endif | ||
| 519 | |||
| 520 | ifeq ($(KEYMAP_C),) | ||
| 521 | $(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap) | ||
| 522 | endif | ||
| 523 | |||
| 524 | OPT_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>` | ||
| 528 | ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),) | ||
| 529 | OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\" | ||
| 530 | endif | ||
| 531 | |||
| 532 | # project specific files | ||
| 533 | SRC += \ | ||
| 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 | ||
| 543 | VPATH += $(KEYMAP_PATH) | ||
| 544 | VPATH += $(USER_PATH) | ||
| 545 | VPATH += $(KEYBOARD_PATHS) | ||
| 546 | VPATH += $(COMMON_VPATH) | ||
| 547 | VPATH += $(INTERMEDIATE_OUTPUT)/src | ||
| 548 | |||
| 549 | include $(BUILDDEFS_PATH)/common_features.mk | ||
| 550 | include $(BUILDDEFS_PATH)/generic_features.mk | ||
| 551 | include $(TMK_PATH)/protocol.mk | ||
| 552 | include $(PLATFORM_PATH)/common.mk | ||
| 553 | |||
| 554 | SRC += $(patsubst %.c,%.clib,$(LIB_SRC)) | ||
| 555 | SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC)) | ||
| 556 | |||
| 557 | -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk | ||
| 558 | include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | ||
| 559 | -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk | ||
| 560 | |||
| 561 | ifneq ($(strip $(PROTOCOL)),) | ||
| 562 | PROTOCOL_KEY = $(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')) | ||
| 563 | else | ||
| 564 | PROTOCOL_KEY = $(PLATFORM_KEY) | ||
| 565 | endif | ||
| 566 | include $(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 | ||
| 581 | ifeq ($(strip $(KEEP_INTERMEDIATES)), yes) | ||
| 582 | OPT_DEFS += -save-temps=obj | ||
| 583 | endif | ||
| 584 | |||
| 585 | OUTPUTS := $(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. | ||
| 595 | all: build check-size | ||
| 596 | |||
| 597 | build: elf cpfirmware | ||
| 598 | check-size: build | ||
| 599 | check-md5: build | ||
| 600 | objs-size: build | ||
| 601 | |||
| 602 | ifneq ($(strip $(TOP_SYMBOLS)),) | ||
| 603 | ifeq ($(strip $(TOP_SYMBOLS)),yes) | ||
| 604 | NUM_TOP_SYMBOLS := 10 | ||
| 605 | else | ||
| 606 | NUM_TOP_SYMBOLS := $(strip $(TOP_SYMBOLS)) | ||
| 607 | endif | ||
| 608 | all: top-symbols | ||
| 609 | check-size: top-symbols | ||
| 610 | top-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 "###########################################" | ||
| 618 | endif | ||
| 619 | |||
| 620 | include $(BUILDDEFS_PATH)/show_options.mk | ||
| 621 | include $(BUILDDEFS_PATH)/common_rules.mk | ||
| 622 | |||
| 623 | # Ensure we have generated files available for each of the objects | ||
| 624 | define GEN_FILES | ||
| 625 | $1: generated-files | ||
| 626 | endef | ||
| 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 @@ | |||
| 1 | LAYOUTS_PATH := layouts | ||
| 2 | LAYOUTS_REPOS := $(patsubst %/,%,$(sort $(dir $(wildcard $(LAYOUTS_PATH)/*/)))) | ||
| 3 | |||
| 4 | ifneq ($(QMK_USERSPACE),) | ||
| 5 | LAYOUTS_REPOS += $(patsubst %/,%,$(QMK_USERSPACE)/$(LAYOUTS_PATH)) | ||
| 6 | endif | ||
| 7 | |||
| 8 | define 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 | ||
| 21 | endef | ||
| 22 | |||
| 23 | define SEARCH_LAYOUTS | ||
| 24 | $$(foreach LAYOUTS_REPO,$$(LAYOUTS_REPOS),$$(eval $$(call SEARCH_LAYOUTS_REPO))) | ||
| 25 | endef | ||
| 26 | |||
| 27 | ifneq ($(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 | ||
| 34 | endif | ||
| 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 @@ | |||
| 1 | ifndef VERBOSE | ||
| 2 | .SILENT: | ||
| 3 | endif | ||
| 4 | |||
| 5 | .DEFAULT_GOAL := all | ||
| 6 | |||
| 7 | OPT = g | ||
| 8 | |||
| 9 | include paths.mk | ||
| 10 | include $(BUILDDEFS_PATH)/support.mk | ||
| 11 | include $(BUILDDEFS_PATH)/message.mk | ||
| 12 | |||
| 13 | TARGET=test/$(TEST_OUTPUT) | ||
| 14 | |||
| 15 | GTEST_OUTPUT = $(BUILD_DIR)/gtest | ||
| 16 | |||
| 17 | TEST_OBJ = $(BUILD_DIR)/test_obj | ||
| 18 | |||
| 19 | OUTPUTS := $(TEST_OBJ)/$(TEST_OUTPUT) $(GTEST_OUTPUT) | ||
| 20 | |||
| 21 | GTEST_INC := \ | ||
| 22 | $(LIB_PATH)/googletest/googletest/include \ | ||
| 23 | $(LIB_PATH)/googletest/googlemock/include | ||
| 24 | |||
| 25 | GTEST_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 | |||
| 36 | LDFLAGS += -lstdc++ -lpthread -shared-libgcc | ||
| 37 | CREATE_MAP := no | ||
| 38 | |||
| 39 | VPATH += \ | ||
| 40 | $(LIB_PATH)/googletest \ | ||
| 41 | $(LIB_PATH)/googlemock \ | ||
| 42 | $(COMMON_VPATH) \ | ||
| 43 | $(TEST_PATH) | ||
| 44 | |||
| 45 | all: elf | ||
| 46 | |||
| 47 | PLATFORM:=TEST | ||
| 48 | PLATFORM_KEY:=test | ||
| 49 | BOOTLOADER_TYPE:=none | ||
| 50 | |||
| 51 | DEBUG ?= 0 | ||
| 52 | ifneq ($(strip $(DEBUG)), 0) | ||
| 53 | CONSOLE_ENABLE = yes | ||
| 54 | endif | ||
| 55 | |||
| 56 | ifneq ($(filter $(FULL_TESTS),$(TEST)),) | ||
| 57 | include tests/test_common/build.mk | ||
| 58 | include $(TEST_PATH)/test.mk | ||
| 59 | endif | ||
| 60 | |||
| 61 | include $(BUILDDEFS_PATH)/common_features.mk | ||
| 62 | include $(BUILDDEFS_PATH)/generic_features.mk | ||
| 63 | include $(PLATFORM_PATH)/common.mk | ||
| 64 | include $(TMK_PATH)/protocol.mk | ||
| 65 | include $(QUANTUM_PATH)/battery/tests/rules.mk | ||
| 66 | include $(QUANTUM_PATH)/debounce/tests/rules.mk | ||
| 67 | include $(QUANTUM_PATH)/encoder/tests/rules.mk | ||
| 68 | include $(QUANTUM_PATH)/os_detection/tests/rules.mk | ||
| 69 | include $(QUANTUM_PATH)/sequencer/tests/rules.mk | ||
| 70 | include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk | ||
| 71 | include $(QUANTUM_PATH)/logging/print.mk | ||
| 72 | include $(PLATFORM_PATH)/test/rules.mk | ||
| 73 | ifneq ($(filter $(FULL_TESTS),$(TEST)),) | ||
| 74 | include $(BUILDDEFS_PATH)/build_full_test.mk | ||
| 75 | endif | ||
| 76 | |||
| 77 | $(TEST_OUTPUT)_SRC += \ | ||
| 78 | tests/test_common/main.cpp \ | ||
| 79 | $(QUANTUM_PATH)/logging/print.c | ||
| 80 | |||
| 81 | ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),) | ||
| 82 | $(TEST_OUTPUT)_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\" | ||
| 83 | endif | ||
| 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 | |||
| 90 | include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk | ||
| 91 | include $(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 | |||
| 16 | QUANTUM_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 | |||
| 35 | include $(QUANTUM_DIR)/nvm/rules.mk | ||
| 36 | |||
| 37 | VPATH += $(QUANTUM_DIR)/logging | ||
| 38 | # Fall back to lib/printf if there is no platform provided print | ||
| 39 | ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","") | ||
| 40 | include $(QUANTUM_PATH)/logging/print.mk | ||
| 41 | else | ||
| 42 | include $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk | ||
| 43 | endif | ||
| 44 | |||
| 45 | ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), yes) | ||
| 46 | OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | ||
| 47 | CONSOLE_ENABLE = yes | ||
| 48 | else ifeq ($(strip $(DEBUG_MATRIX_SCAN_RATE_ENABLE)), api) | ||
| 49 | OPT_DEFS += -DDEBUG_MATRIX_SCAN_RATE | ||
| 50 | endif | ||
| 51 | |||
| 52 | AUDIO_ENABLE ?= no | ||
| 53 | ifeq ($(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 | ||
| 80 | endif | ||
| 81 | |||
| 82 | ifeq ($(strip $(SEQUENCER_ENABLE)), yes) | ||
| 83 | MUSIC_ENABLE = yes | ||
| 84 | endif | ||
| 85 | |||
| 86 | ifeq ($(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 | ||
| 97 | endif | ||
| 98 | |||
| 99 | VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all | ||
| 100 | STENO_PROTOCOL ?= all | ||
| 101 | ifeq ($(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 | ||
| 122 | endif | ||
| 123 | |||
| 124 | ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) | ||
| 125 | MOUSE_ENABLE := yes | ||
| 126 | endif | ||
| 127 | |||
| 128 | VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick azoteq_iqs5xx cirque_pinnacle_i2c cirque_pinnacle_spi paw3204 paw3222 pmw3320 pmw3360 pmw3389 pimoroni_trackball custom | ||
| 129 | ifeq ($(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 | ||
| 169 | endif | ||
| 170 | |||
| 171 | QUANTUM_PAINTER_ENABLE ?= no | ||
| 172 | ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes) | ||
| 173 | include $(QUANTUM_DIR)/painter/rules.mk | ||
| 174 | endif | ||
| 175 | |||
| 176 | VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash | ||
| 177 | EEPROM_DRIVER ?= vendor | ||
| 178 | ifneq ($(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 | ||
| 256 | endif | ||
| 257 | |||
| 258 | VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash rp2040_flash legacy | ||
| 259 | WEAR_LEVELING_DRIVER ?= none | ||
| 260 | ifneq ($(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 | ||
| 284 | endif | ||
| 285 | |||
| 286 | VALID_FLASH_DRIVER_TYPES := spi custom | ||
| 287 | FLASH_DRIVER ?= none | ||
| 288 | ifneq ($(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 | ||
| 299 | endif | ||
| 300 | |||
| 301 | RGBLIGHT_ENABLE ?= no | ||
| 302 | VALID_RGBLIGHT_TYPES := ws2812 apa102 custom | ||
| 303 | |||
| 304 | ifeq ($(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 | ||
| 332 | endif | ||
| 333 | |||
| 334 | # Deprecated driver names - do not use | ||
| 335 | ifeq ($(strip $(LED_MATRIX_DRIVER)), aw20216) | ||
| 336 | LED_MATRIX_DRIVER := aw20216s | ||
| 337 | endif | ||
| 338 | ifeq ($(strip $(LED_MATRIX_DRIVER)), ckled2001) | ||
| 339 | LED_MATRIX_DRIVER := snled27351 | ||
| 340 | endif | ||
| 341 | |||
| 342 | LED_MATRIX_ENABLE ?= no | ||
| 343 | VALID_LED_MATRIX_TYPES := is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 custom | ||
| 344 | |||
| 345 | ifeq ($(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 | ||
| 447 | endif | ||
| 448 | |||
| 449 | # Deprecated driver names - do not use | ||
| 450 | ifeq ($(strip $(RGB_MATRIX_DRIVER)), aw20216) | ||
| 451 | RGB_MATRIX_DRIVER := aw20216s | ||
| 452 | endif | ||
| 453 | ifeq ($(strip $(RGB_MATRIX_DRIVER)), ckled2001) | ||
| 454 | RGB_MATRIX_DRIVER := snled27351 | ||
| 455 | endif | ||
| 456 | |||
| 457 | RGB_MATRIX_ENABLE ?= no | ||
| 458 | |||
| 459 | VALID_RGB_MATRIX_TYPES := aw20216s is31fl3218 is31fl3236 is31fl3729 is31fl3731 is31fl3733 is31fl3736 is31fl3737 is31fl3741 is31fl3742a is31fl3743a is31fl3745 is31fl3746a snled27351 ws2812 custom | ||
| 460 | ifeq ($(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 | ||
| 581 | endif | ||
| 582 | |||
| 583 | VARIABLE_TRACE ?= no | ||
| 584 | ifneq ($(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 | ||
| 590 | endif | ||
| 591 | |||
| 592 | ifeq ($(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 | ||
| 597 | endif | ||
| 598 | |||
| 599 | VALID_BACKLIGHT_TYPES := pwm timer software custom | ||
| 600 | |||
| 601 | BACKLIGHT_ENABLE ?= no | ||
| 602 | BACKLIGHT_DRIVER ?= pwm | ||
| 603 | ifeq ($(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 | ||
| 624 | endif | ||
| 625 | |||
| 626 | ifeq ($(strip $(CIE1931_CURVE)), yes) | ||
| 627 | OPT_DEFS += -DUSE_CIE1931_CURVE | ||
| 628 | LED_TABLES := yes | ||
| 629 | endif | ||
| 630 | |||
| 631 | ifeq ($(strip $(LED_TABLES)), yes) | ||
| 632 | SRC += $(QUANTUM_DIR)/led_tables.c | ||
| 633 | endif | ||
| 634 | |||
| 635 | ifeq ($(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 | ||
| 643 | endif | ||
| 644 | |||
| 645 | ifeq ($(strip $(RAW_ENABLE)), yes) | ||
| 646 | OPT_DEFS += -DRAW_ENABLE | ||
| 647 | SRC += raw_hid.c | ||
| 648 | endif | ||
| 649 | |||
| 650 | ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) | ||
| 651 | SEND_STRING_ENABLE := yes | ||
| 652 | endif | ||
| 653 | |||
| 654 | VALID_CUSTOM_MATRIX_TYPES:= yes lite no | ||
| 655 | |||
| 656 | CUSTOM_MATRIX ?= no | ||
| 657 | ifneq ($(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 | ||
| 670 | endif | ||
| 671 | |||
| 672 | # Debounce Modules. Set DEBOUNCE_TYPE=custom if including one manually. | ||
| 673 | DEBOUNCE_TYPE ?= sym_defer_g | ||
| 674 | ifneq ($(strip $(DEBOUNCE_TYPE)), custom) | ||
| 675 | QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c | ||
| 676 | endif | ||
| 677 | |||
| 678 | |||
| 679 | VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor | ||
| 680 | |||
| 681 | SERIAL_DRIVER ?= bitbang | ||
| 682 | ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),) | ||
| 683 | $(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver) | ||
| 684 | endif | ||
| 685 | |||
| 686 | ifeq ($(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 | ||
| 719 | endif | ||
| 720 | |||
| 721 | ifeq ($(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 | ||
| 725 | endif | ||
| 726 | |||
| 727 | ifeq ($(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 | ||
| 734 | endif | ||
| 735 | |||
| 736 | VALID_HAPTIC_DRIVER_TYPES := drv2605l solenoid | ||
| 737 | ifeq ($(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 | ||
| 753 | endif | ||
| 754 | |||
| 755 | ifeq ($(strip $(HD44780_ENABLE)), yes) | ||
| 756 | OPT_DEFS += -DHD44780_ENABLE | ||
| 757 | COMMON_VPATH += $(DRIVER_PATH)/lcd | ||
| 758 | SRC += hd44780.c | ||
| 759 | endif | ||
| 760 | |||
| 761 | VALID_OLED_DRIVER_TYPES := custom ssd1306 | ||
| 762 | OLED_DRIVER ?= ssd1306 | ||
| 763 | VALID_OLED_TRANSPORT_TYPES := i2c spi custom | ||
| 764 | OLED_TRANSPORT ?= i2c | ||
| 765 | ifeq ($(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 | ||
| 788 | endif | ||
| 789 | |||
| 790 | ifeq ($(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 | ||
| 796 | endif | ||
| 797 | |||
| 798 | ifeq ($(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 | ||
| 803 | endif | ||
| 804 | |||
| 805 | ifeq ($(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 | ||
| 810 | endif | ||
| 811 | |||
| 812 | ifeq ($(strip $(UNICODE_ENABLE)), yes) | ||
| 813 | OPT_DEFS += -DUNICODE_ENABLE | ||
| 814 | UNICODE_COMMON := yes | ||
| 815 | SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c | ||
| 816 | endif | ||
| 817 | |||
| 818 | ifeq ($(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 | ||
| 824 | endif | ||
| 825 | |||
| 826 | ifeq ($(strip $(PS2_MOUSE_ENABLE)), yes) | ||
| 827 | PS2_ENABLE := yes | ||
| 828 | MOUSE_ENABLE := yes | ||
| 829 | SRC += ps2_mouse.c | ||
| 830 | OPT_DEFS += -DPS2_MOUSE_ENABLE | ||
| 831 | endif | ||
| 832 | |||
| 833 | VALID_PS2_DRIVER_TYPES := busywait interrupt usart vendor | ||
| 834 | |||
| 835 | PS2_DRIVER ?= busywait | ||
| 836 | ifeq ($(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 | ||
| 852 | endif | ||
| 853 | |||
| 854 | JOYSTICK_ENABLE ?= no | ||
| 855 | VALID_JOYSTICK_TYPES := analog digital | ||
| 856 | JOYSTICK_DRIVER ?= analog | ||
| 857 | ifeq ($(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 | ||
| 869 | endif | ||
| 870 | |||
| 871 | USBPD_ENABLE ?= no | ||
| 872 | VALID_USBPD_DRIVER_TYPES = custom vendor | ||
| 873 | USBPD_DRIVER ?= vendor | ||
| 874 | ifeq ($(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 | ||
| 893 | endif | ||
| 894 | |||
| 895 | BLUETOOTH_ENABLE ?= no | ||
| 896 | VALID_BLUETOOTH_DRIVER_TYPES := bluefruit_le custom rn42 | ||
| 897 | ifeq ($(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 | ||
| 919 | endif | ||
| 920 | |||
| 921 | ENCODER_ENABLE ?= no | ||
| 922 | ENCODER_DRIVER ?= quadrature | ||
| 923 | VALID_ENCODER_DRIVER_TYPES := quadrature custom | ||
| 924 | ifeq ($(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 | ||
| 942 | endif | ||
| 943 | |||
| 944 | ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes) | ||
| 945 | ifeq ($(strip $(DIP_SWITCH_MAP_ENABLE)), yes) | ||
| 946 | OPT_DEFS += -DDIP_SWITCH_MAP_ENABLE | ||
| 947 | endif | ||
| 948 | endif | ||
| 949 | |||
| 950 | ifeq ($(strip $(BATTERY_ENABLE)), yes) | ||
| 951 | BATTERY_DRIVER_REQUIRED := yes | ||
| 952 | endif | ||
| 953 | |||
| 954 | VALID_BATTERY_DRIVER_TYPES := adc custom vendor | ||
| 955 | |||
| 956 | BATTERY_DRIVER ?= none | ||
| 957 | ifeq ($(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 | ||
| 974 | endif | ||
| 975 | |||
| 976 | VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor | ||
| 977 | |||
| 978 | WS2812_DRIVER ?= bitbang | ||
| 979 | ifeq ($(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 | ||
| 1000 | endif | ||
| 1001 | |||
| 1002 | ifeq ($(strip $(APA102_DRIVER_REQUIRED)), yes) | ||
| 1003 | COMMON_VPATH += $(DRIVER_PATH)/led | ||
| 1004 | SRC += apa102.c | ||
| 1005 | endif | ||
| 1006 | |||
| 1007 | ifeq ($(strip $(ANALOG_DRIVER_REQUIRED)), yes) | ||
| 1008 | OPT_DEFS += -DHAL_USE_ADC=TRUE | ||
| 1009 | QUANTUM_LIB_SRC += analog.c | ||
| 1010 | endif | ||
| 1011 | |||
| 1012 | ifeq ($(strip $(I2C_DRIVER_REQUIRED)), yes) | ||
| 1013 | OPT_DEFS += -DHAL_USE_I2C=TRUE | ||
| 1014 | QUANTUM_LIB_SRC += i2c_master.c | ||
| 1015 | endif | ||
| 1016 | |||
| 1017 | ifeq ($(strip $(SPI_DRIVER_REQUIRED)), yes) | ||
| 1018 | OPT_DEFS += -DHAL_USE_SPI=TRUE | ||
| 1019 | QUANTUM_LIB_SRC += spi_master.c | ||
| 1020 | endif | ||
| 1021 | |||
| 1022 | ifeq ($(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 | ||
| 1034 | endif | ||
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 | ||
| 6 | VPATH_SRC := $(VPATH) | ||
| 7 | vpath %.c $(VPATH_SRC) | ||
| 8 | vpath %.h $(VPATH_SRC) | ||
| 9 | vpath %.cpp $(VPATH_SRC) | ||
| 10 | vpath %.cc $(VPATH_SRC) | ||
| 11 | vpath %.hpp $(VPATH_SRC) | ||
| 12 | vpath %.S $(VPATH_SRC) | ||
| 13 | VPATH := | ||
| 14 | |||
| 15 | # Helper to return the distinct elements of a list | ||
| 16 | uniq = $(if $1,$(firstword $1) $(call uniq,$(filter-out $(firstword $1),$1))) | ||
| 17 | |||
| 18 | # Convert all SRC to OBJ | ||
| 19 | define 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)))))) | ||
| 21 | endef | ||
| 22 | $(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT)))) | ||
| 23 | |||
| 24 | # Define a list of all objects | ||
| 25 | OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ)) | ||
| 26 | NO_LTO_OBJ := $(filter %.a,$(OBJ)) | ||
| 27 | |||
| 28 | MASTER_OUTPUT := $(firstword $(OUTPUTS)) | ||
| 29 | |||
| 30 | # Output format. (can be srec, ihex, binary) | ||
| 31 | FORMAT = ihex | ||
| 32 | |||
| 33 | # Optimization level, can be [0, 1, 2, 3, s]. | ||
| 34 | OPT ?= s | ||
| 35 | |||
| 36 | # Compiler flag to set the C and C++ language standard level | ||
| 37 | CSTANDARD = -std=gnu11 | ||
| 38 | CXXSTANDARD = -std=gnu++14 | ||
| 39 | |||
| 40 | # Speed up recompilations by opt-in usage of ccache | ||
| 41 | USE_CCACHE ?= no | ||
| 42 | ifneq ($(USE_CCACHE),no) | ||
| 43 | CC_PREFIX ?= ccache | ||
| 44 | endif | ||
| 45 | |||
| 46 | #---------------- Debug Options ---------------- | ||
| 47 | |||
| 48 | DEBUG_ENABLE ?= no | ||
| 49 | ifeq ($(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 | ||
| 55 | endif | ||
| 56 | |||
| 57 | |||
| 58 | #---------------- C Compiler Options ---------------- | ||
| 59 | |||
| 60 | ifeq ($(strip $(LTO_ENABLE)), yes) | ||
| 61 | CDEFS += -flto | ||
| 62 | CDEFS += -DLTO_ENABLE | ||
| 63 | endif | ||
| 64 | |||
| 65 | CFLAGS += $(CDEFS) | ||
| 66 | CFLAGS += -O$(OPT) | ||
| 67 | # add color | ||
| 68 | ifeq ($(COLOR),true) | ||
| 69 | ifeq ("$(shell echo "int main(){}" | $(CC) -fdiagnostics-color -x c - -o /dev/null 2>&1)", "") | ||
| 70 | CFLAGS+= -fdiagnostics-color | ||
| 71 | endif | ||
| 72 | endif | ||
| 73 | CFLAGS += -Wall | ||
| 74 | CFLAGS += -Wstrict-prototypes | ||
| 75 | ifneq ($(strip $(ALLOW_WARNINGS)), yes) | ||
| 76 | CFLAGS += -Werror | ||
| 77 | endif | ||
| 78 | CFLAGS += $(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. | ||
| 82 | CFLAGS += -fcommon | ||
| 83 | |||
| 84 | #---------------- C++ Compiler Options ---------------- | ||
| 85 | |||
| 86 | CXXFLAGS += $(CXXDEFS) | ||
| 87 | CXXFLAGS += -O$(OPT) | ||
| 88 | # to suppress "warning: only initialized variables can be placed into program memory area" | ||
| 89 | CXXFLAGS += -w | ||
| 90 | CXXFLAGS += -Wall | ||
| 91 | CXXFLAGS += -Wundef | ||
| 92 | |||
| 93 | ifneq ($(strip $(ALLOW_WARNINGS)), yes) | ||
| 94 | CXXFLAGS += -Werror | ||
| 95 | endif | ||
| 96 | |||
| 97 | #---------------- Assembler Options ---------------- | ||
| 98 | |||
| 99 | ASFLAGS += $(ADEFS) | ||
| 100 | ifeq ($(VERBOSE_AS_CMD),yes) | ||
| 101 | ASFLAGS += -v | ||
| 102 | endif | ||
| 103 | |||
| 104 | #---------------- Linker Options ---------------- | ||
| 105 | |||
| 106 | ifeq ($(VERBOSE_LD_CMD),yes) | ||
| 107 | LDFLAGS += -v | ||
| 108 | endif | ||
| 109 | |||
| 110 | LDFLAGS += $(EXTMEMOPTS) | ||
| 111 | LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) | ||
| 112 | LDFLAGS += -lm | ||
| 113 | # You can give EXTRALDFLAGS at 'make' command line. | ||
| 114 | LDFLAGS += $(EXTRALDFLAGS) | ||
| 115 | |||
| 116 | #---------------- Assembler Listings ---------------- | ||
| 117 | |||
| 118 | ADHLNS_ENABLE ?= no | ||
| 119 | ifeq ($(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 | ||
| 128 | endif | ||
| 129 | |||
| 130 | # Define programs and commands. | ||
| 131 | SHELL = sh | ||
| 132 | SED = sed | ||
| 133 | REMOVE = rm -f | ||
| 134 | REMOVEDIR = rmdir | ||
| 135 | COPY = cp | ||
| 136 | WINSHELL = cmd | ||
| 137 | SECHO = $(SILENT) || echo | ||
| 138 | MD5SUM ?= md5sum | ||
| 139 | ifneq ($(filter Darwin FreeBSD,$(shell uname -s)),) | ||
| 140 | MD5SUM = md5 | ||
| 141 | endif | ||
| 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 | ||
| 146 | UF2CONV = $(TOP_DIR)/util/uf2conv.py | ||
| 147 | UF2CONV_ARGS ?= | ||
| 148 | UF2_FAMILY ?= 0x0 | ||
| 149 | |||
| 150 | # Compiler flags to generate dependency files. | ||
| 151 | #GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d | ||
| 152 | GENDEPFLAGS = -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 | ||
| 158 | ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS) | ||
| 159 | ALL_CXXFLAGS = $(MCUFLAGS) -x c++ $(CXXFLAGS) $(EXTRAFLAGS) | ||
| 160 | ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS) | ||
| 161 | |||
| 162 | define NO_LTO | ||
| 163 | $(patsubst %.a,%.o,$1): NOLTO_CFLAGS += -fno-lto | ||
| 164 | endef | ||
| 165 | $(foreach LOBJ, $(NO_LTO_OBJ), $(eval $(call NO_LTO,$(LOBJ)))) | ||
| 166 | |||
| 167 | MOVE_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 | ||
| 170 | define BOARDSRC_INJECT_HOOKS | ||
| 171 | $(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h | ||
| 172 | endef | ||
| 173 | $(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ)))) | ||
| 174 | |||
| 175 | # Add QMK specific flags | ||
| 176 | DFU_SUFFIX ?= dfu-suffix | ||
| 177 | DFU_SUFFIX_ARGS ?= | ||
| 178 | |||
| 179 | |||
| 180 | elf: $(BUILD_DIR)/$(TARGET).elf | ||
| 181 | hex: $(BUILD_DIR)/$(TARGET).hex | ||
| 182 | uf2: $(BUILD_DIR)/$(TARGET).uf2 | ||
| 183 | cpfirmware_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) | ||
| 186 | eep: $(BUILD_DIR)/$(TARGET).eep | ||
| 187 | lss: $(BUILD_DIR)/$(TARGET).lss | ||
| 188 | sym: $(BUILD_DIR)/$(TARGET).sym | ||
| 189 | LIBNAME=lib$(TARGET).a | ||
| 190 | lib: $(LIBNAME) | ||
| 191 | |||
| 192 | cpfirmware: cpfirmware_qmk | ||
| 193 | |||
| 194 | ifneq ($(QMK_USERSPACE),) | ||
| 195 | cpfirmware: cpfirmware_userspace | ||
| 196 | cpfirmware_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) | ||
| 199 | endif | ||
| 200 | |||
| 201 | # Display size of file, modifying the output so people don't mistakenly grab the hex output | ||
| 202 | BINARY_SIZE = $(SIZE) --target=$(FORMAT) $(BUILD_DIR)/$(TARGET).hex | $(SED) -e 's/\.build\/.*$$/$(TARGET).$(FIRMWARE_FORMAT)/g' | ||
| 203 | |||
| 204 | sizebefore: | ||
| 205 | @if test -f $(BUILD_DIR)/$(TARGET).hex; then $(SECHO) $(MSG_SIZE_BEFORE); $(SILENT) || $(BINARY_SIZE); \ | ||
| 206 | 2>/dev/null; $(SECHO); fi | ||
| 207 | |||
| 208 | sizeafter: $(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. | ||
| 213 | gccversion : | ||
| 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 | |||
| 260 | BEGIN = 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 | |||
| 272 | define GEN_OBJRULE | ||
| 273 | $1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC)) | ||
| 274 | ifdef $1_CONFIG | ||
| 275 | $1_CONFIG_FLAGS += $$(patsubst %,-include %,$$($1_CONFIG)) | ||
| 276 | endif | ||
| 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 > $$@ | ||
| 339 | endef | ||
| 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 | ||
| 351 | DEPS = $(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. | ||
| 365 | clean: | ||
| 366 | $(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null) | ||
| 367 | $(REMOVE) $(BUILD_DIR)/$(TARGET).* | ||
| 368 | |||
| 369 | show_path: | ||
| 370 | @echo VPATH=$(VPATH) | ||
| 371 | @echo SRC=$(SRC) | ||
| 372 | @echo OBJ=$(OBJ) | ||
| 373 | |||
| 374 | dump_vars: ERROR_IF_EMPTY="" | ||
| 375 | dump_vars: ERROR_IF_NONBOOL="" | ||
| 376 | dump_vars: ERROR_IF_UNSET="" | ||
| 377 | dump_vars: CATASTROPHIC_ERROR="" | ||
| 378 | dump_vars: | ||
| 379 | @$(foreach V,$(sort $(.VARIABLES)),$(if $(filter-out environment% default automatic,$(origin $V)),$(info $V=$($V)))) | ||
| 380 | |||
| 381 | objs-size: | ||
| 382 | for i in $(OBJ); do echo $$i; done | sort | xargs $(SIZE) | ||
| 383 | |||
| 384 | |||
| 385 | # size check optionally implemented in its platform.mk | ||
| 386 | check-size: | ||
| 387 | |||
| 388 | check-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 \ | ||
| 403 | gccversion build elf hex uf2 eep lss sym coff extcoff \ | ||
| 404 | clean clean_list debug gdb-config show_path \ | ||
| 405 | program teensy dfu dfu-ee dfu-start \ | ||
| 406 | flash dfu-split-left dfu-split-right \ | ||
| 407 | avrdude-split-left avrdude-split-right \ | ||
| 408 | avrdude-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 | ||
| 3 | CONVERT_TO:=$(strip $(CONVERT_TO)) | ||
| 4 | ifneq ($(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 | ||
| 34 | endif | ||
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 | |||
| 3 | FEATURE_NAMES := | ||
| 4 | FEATURE_NAMES += AUDIO | ||
| 5 | FEATURE_NAMES += BACKLIGHT | ||
| 6 | FEATURE_NAMES += BLUETOOTH | ||
| 7 | FEATURE_NAMES += DIP_SWITCH | ||
| 8 | FEATURE_NAMES += DYNAMIC_KEYMAP | ||
| 9 | FEATURE_NAMES += ENCODER | ||
| 10 | FEATURE_NAMES += HAPTIC | ||
| 11 | FEATURE_NAMES += HD44780 | ||
| 12 | FEATURE_NAMES += IOS_DEVICE | ||
| 13 | FEATURE_NAMES += LCD_BACKLIGHT | ||
| 14 | FEATURE_NAMES += LCD | ||
| 15 | FEATURE_NAMES += OLED | ||
| 16 | FEATURE_NAMES += POINTING_DEVICE | ||
| 17 | FEATURE_NAMES += PS2_MOUSE | ||
| 18 | FEATURE_NAMES += RGBLIGHT | ||
| 19 | FEATURE_NAMES += RGB_MATRIX | ||
| 20 | FEATURE_NAMES += SLEEP_LED | ||
| 21 | FEATURE_NAMES += STENO | ||
| 22 | FEATURE_NAMES += SWAP_HANDS | ||
| 23 | FEATURE_NAMES += WATCHDOG | ||
| 24 | FEATURE_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 @@ | |||
| 1 | node_modules | ||
| 2 | .vitepress/cache | ||
| 3 | .vitepress/.temp | ||
| 4 | .vitepress/dist | ||
| 5 | docs | ||
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 @@ | |||
| 1 | import { defineConfig } from "vitepress"; | ||
| 2 | import { tabsMarkdownPlugin } from "vitepress-plugin-tabs"; | ||
| 3 | import sidebar from "../../../docs/_sidebar.json"; | ||
| 4 | |||
| 5 | // https://vitepress.dev/reference/site-config | ||
| 6 | export 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> | ||
| 2 | import DefaultTheme from 'vitepress/theme' | ||
| 3 | import { useRouter } from 'vitepress' | ||
| 4 | import { onBeforeMount } from 'vue'; | ||
| 5 | import aliases from "../../../../docs/_aliases.json"; | ||
| 6 | |||
| 7 | const router = useRouter() | ||
| 8 | onBeforeMount(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 */ | ||
| 2 | kbd { | ||
| 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 @@ | |||
| 1 | import type { Theme } from 'vitepress' | ||
| 2 | import DefaultTheme from 'vitepress/theme' | ||
| 3 | import { enhanceAppWithTabs } from 'vitepress-plugin-tabs/client' | ||
| 4 | import QMKLayout from './QMKLayout.vue' | ||
| 5 | import './custom.css' | ||
| 6 | |||
| 7 | export 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 | |||
| 3 | cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")" | ||
| 4 | yarn install | ||
| 5 | [[ -e docs ]] || ln -sf ../../docs docs | ||
| 6 | DEBUG='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 | |||
| 3 | cd "$(dirname "$(realpath "${BASH_SOURCE[0]}")")" | ||
| 4 | yarn install | ||
| 5 | DEBUG='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 | |||
| 576 | algoliasearch@^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 | |||
| 597 | csstype@^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 | |||
| 602 | entities@^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 | |||
| 607 | esbuild@^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 | |||
| 636 | estree-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 | |||
| 641 | focus-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 | |||
| 648 | fsevents@~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 | |||
| 653 | hookable@^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 | |||
| 658 | magic-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 | |||
| 665 | mark.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 | |||
| 670 | minisearch@^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 | |||
| 675 | mitt@^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 | |||
| 680 | nanoid@^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 | |||
| 685 | perfect-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 | |||
| 690 | picocolors@^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 | |||
| 695 | postcss@^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 | |||
| 704 | preact@^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 | |||
| 709 | rfdc@^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 | |||
| 714 | rollup@^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 | |||
| 742 | shiki@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 | |||
| 749 | source-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 | |||
| 754 | source-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 | |||
| 759 | speakingurl@^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 | |||
| 764 | tabbable@^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 | |||
| 769 | vite@^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 | |||
| 780 | vitepress-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 | |||
| 785 | vitepress@^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 | |||
| 806 | vue-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 | |||
| 811 | vue@^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 | |||
| 16 | GRAVE_ESC_ENABLE ?= yes | ||
| 17 | MAGIC_ENABLE ?= yes | ||
| 18 | SEND_STRING_ENABLE ?= yes | ||
| 19 | SPACE_CADET_ENABLE ?= yes | ||
| 20 | |||
| 21 | GENERIC_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 | |||
| 61 | define 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 | ||
| 69 | endef | ||
| 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 @@ | |||
| 1 | COLOR ?= true | ||
| 2 | |||
| 3 | ifeq ($(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 | ||
| 11 | endif | ||
| 12 | |||
| 13 | ifneq ($(shell echo "1 2 3" | awk '{ printf "%2s", $$3; }' 2>/dev/null)," 3") | ||
| 14 | AWK=awk | ||
| 15 | else | ||
| 16 | AWK=cat && test | ||
| 17 | endif | ||
| 18 | |||
| 19 | ON_ERROR ?= exit 1 | ||
| 20 | |||
| 21 | OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n | ||
| 22 | ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n | ||
| 23 | WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n | ||
| 24 | SKIPPED_STRING=$(SKIPPED_COLOR)[SKIPPED]$(NO_COLOR)\n | ||
| 25 | |||
| 26 | TAB_LOG = printf "\n%s\n\n" "$$LOG" | $(AWK) '{ sub(/^/," | "); print }' | ||
| 27 | TAB_LOG_PLAIN = printf "%s\n" "$$LOG" | ||
| 28 | AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' | ||
| 29 | AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' | ||
| 30 | PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR) | ||
| 31 | PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) | ||
| 32 | PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && $(ON_ERROR) | ||
| 33 | PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) | ||
| 34 | PRINT_SKIPPED_PLAIN = ($(SILENT) || printf " $(SKIPPED_STRING)" | $(AWK_STATUS)) | ||
| 35 | PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) | ||
| 36 | BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; | ||
| 37 | MAKE_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)`). | ||
| 41 | UNSYNC_OUTPUT_CMD = +true | ||
| 42 | |||
| 43 | # Define Messages | ||
| 44 | # English | ||
| 45 | MSG_ERRORS_NONE = Errors: none | ||
| 46 | MSG_ERRORS = $(ERROR_COLOR)Make finished with errors\n$(NO_COLOR) | ||
| 47 | MSG_BEGIN = -------- begin -------- | ||
| 48 | MSG_END = -------- end -------- | ||
| 49 | MSG_SIZE_BEFORE = Size before: | ||
| 50 | MSG_SIZE_AFTER = Size after: | ||
| 51 | MSG_COFF = Converting to AVR COFF: | ||
| 52 | MSG_EXTENDED_COFF = Converting to AVR Extended COFF: | ||
| 53 | MSG_FLASH = Creating load file for flashing: | ||
| 54 | MSG_UF2 = Creating UF2 file for deployment: | ||
| 55 | MSG_EEPROM = Creating load file for EEPROM: | ||
| 56 | MSG_BIN = Creating binary load file for flashing: | ||
| 57 | MSG_EXTENDED_LISTING = Creating Extended Listing: | ||
| 58 | MSG_SYMBOL_TABLE = Creating Symbol Table: | ||
| 59 | MSG_EXECUTING = Executing: | ||
| 60 | MSG_LINKING = Linking: | ||
| 61 | MSG_COMPILING = Compiling: | ||
| 62 | MSG_COMPILING_CXX = Compiling: | ||
| 63 | MSG_ASSEMBLING = Assembling: | ||
| 64 | MSG_CLEANING = Cleaning project: | ||
| 65 | MSG_CREATING_LIBRARY = Creating library: | ||
| 66 | MSG_GENERATING = Generating: | ||
| 67 | MSG_NOT_REPO = $(WARN_COLOR)WARNING:$(NO_COLOR) Target folder is not a git repo, you probably downloaded a zip file instead of cloning.\n\ | ||
| 68 | Please consider following $(BOLD)https://docs.qmk.fm/\#/newbs_getting_started$(NO_COLOR).\n\n | ||
| 69 | MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR) Some git submodules are out of date or modified.\n\ | ||
| 70 | Please consider running $(BOLD)qmk git-submodule$(NO_COLOR).\n\n | ||
| 71 | |||
| 72 | define 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 | ||
| 77 | endef | ||
| 78 | MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL) | ||
| 79 | define 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 | ||
| 84 | endef | ||
| 85 | MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) | ||
| 86 | MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR) | ||
| 87 | define GENERATE_MSG_AVAILABLE_KEYMAPS | ||
| 88 | MSG_AVAILABLE_KEYMAPS_ACTUAL := Available keymaps for $(BOLD)$$(CURRENT_KB)$(NO_COLOR): | ||
| 89 | endef | ||
| 90 | MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL) | ||
| 91 | |||
| 92 | MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n | ||
| 93 | MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT) | ||
| 94 | MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n | ||
| 95 | MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n | ||
| 96 | MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n | ||
| 97 | MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n | ||
| 98 | MSG_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 | ||
| 100 | MSG_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 | ||
| 101 | MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n | ||
| 102 | MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n | ||
| 103 | BOOTLOADER_RETRY_TIME ?= 0.5 | ||
| 104 | MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel) | ||
| 105 | |||
| 106 | define WARNING_MESSAGE | ||
| 107 | $(shell printf "\n %-99s $(WARN_STRING)\n" "$1" >&2) | ||
| 108 | endef | ||
| 109 | |||
| 110 | define CATASTROPHIC_ERROR | ||
| 111 | $(shell printf "\n * %-99s $(ERROR_STRING)\n" "$2" >&2) | ||
| 112 | $(error $1) | ||
| 113 | endef | ||
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 @@ | |||
| 1 | BUILD_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 | |||
| 15 | HARDWARE_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 | |||
| 34 | OTHER_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 | |||
| 87 | define NAME_ECHO | ||
| 88 | @printf " %-30s = %-16s # %s\\n" "$1" "$($1)" "$(origin $1)" | ||
| 89 | |||
| 90 | endef | ||
| 91 | |||
| 92 | define YAML_NAME_ECHO | ||
| 93 | @echo ' $1 : "$(strip $($1))"' | ||
| 94 | |||
| 95 | endef | ||
| 96 | |||
| 97 | .PHONY: show_build_options0 show_build_options | ||
| 98 | show_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 | |||
| 111 | show_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 | ||
| 117 | show_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 | ||
| 128 | show_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 | ||
| 139 | yaml_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 | ||
| 6 | cc-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 @@ | |||
| 1 | TEST_LIST = $(sort $(patsubst %/test.mk,%, $(shell find $(ROOT_DIR)tests -type f -name test.mk))) | ||
| 2 | FULL_TESTS := $(notdir $(TEST_LIST)) | ||
| 3 | |||
| 4 | include $(QUANTUM_PATH)/battery/tests/testlist.mk | ||
| 5 | include $(QUANTUM_PATH)/debounce/tests/testlist.mk | ||
| 6 | include $(QUANTUM_PATH)/encoder/tests/testlist.mk | ||
| 7 | include $(QUANTUM_PATH)/os_detection/tests/testlist.mk | ||
| 8 | include $(QUANTUM_PATH)/sequencer/tests/testlist.mk | ||
| 9 | include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk | ||
| 10 | include $(PLATFORM_PATH)/test/testlist.mk | ||
| 11 | |||
| 12 | define 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 | ||
| 20 | endef | ||
| 21 | |||
| 22 | |||
| 23 | $(eval $(call VALIDATE_TEST_LIST,$(firstword $(TEST_LIST)),$(wordlist 2,9999,$(TEST_LIST)))) | ||
