build_keyboard.mk (24988B)
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)))))