qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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)))))