Added macros to Dynamic Keymaps, Zeal60 RGB backlight improvements (#4520)
[jackhill/qmk/firmware.git] / build_keyboard.mk
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 common.mk
14
15 # Set the filename for the final firmware binary
16 KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
17 TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
18 KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD_FILESAFE)
19
20 # Force expansion
21 TARGET := $(TARGET)
22
23 # For split boards we need to set a master half.
24 MASTER ?= left
25 ifdef master
26 MASTER = $(master)
27 endif
28
29 ifeq ($(MASTER),right)
30 OPT_DEFS += -DMASTER_IS_ON_RIGHT
31 else
32 ifneq ($(MASTER),left)
33 $(error MASTER does not have a valid value(left/right))
34 endif
35 endif
36
37 # Determine which subfolders exist.
38 KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
39 KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
40 KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2)))
41 KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3)))
42 KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4)))
43 KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1))
44 KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2))
45 KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3))
46 KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4))
47 KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5))
48 KEYBOARD_PATHS :=
49 KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1)
50 KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2)
51 KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3)
52 KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4)
53 KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5)
54
55 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
56 KEYBOARD_PATHS += $(KEYBOARD_PATH_5)
57 endif
58 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
59 KEYBOARD_PATHS += $(KEYBOARD_PATH_4)
60 endif
61 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
62 KEYBOARD_PATHS += $(KEYBOARD_PATH_3)
63 endif
64 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
65 KEYBOARD_PATHS += $(KEYBOARD_PATH_2)
66 endif
67 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
68 KEYBOARD_PATHS += $(KEYBOARD_PATH_1)
69 endif
70
71 # Pull in rules.mk files from all our subfolders
72 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
73 include $(KEYBOARD_PATH_5)/rules.mk
74 endif
75 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
76 include $(KEYBOARD_PATH_4)/rules.mk
77 endif
78 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
79 include $(KEYBOARD_PATH_3)/rules.mk
80 endif
81 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
82 include $(KEYBOARD_PATH_2)/rules.mk
83 endif
84 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
85 include $(KEYBOARD_PATH_1)/rules.mk
86 endif
87
88 # Find all the C source files to be compiled in subfolders.
89 KEYBOARD_SRC :=
90
91 KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c
92 KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c
93 KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c
94 KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c
95 KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c
96
97 ifneq ("$(wildcard $(KEYBOARD_C_5))","")
98 KEYBOARD_SRC += $(KEYBOARD_C_5)
99 endif
100 ifneq ("$(wildcard $(KEYBOARD_C_4))","")
101 KEYBOARD_SRC += $(KEYBOARD_C_4)
102 endif
103 ifneq ("$(wildcard $(KEYBOARD_C_3))","")
104 KEYBOARD_SRC += $(KEYBOARD_C_3)
105 endif
106 ifneq ("$(wildcard $(KEYBOARD_C_2))","")
107 KEYBOARD_SRC += $(KEYBOARD_C_2)
108 endif
109 ifneq ("$(wildcard $(KEYBOARD_C_1))","")
110 KEYBOARD_SRC += $(KEYBOARD_C_1)
111 endif
112
113 # Generate KEYBOARD_name_subname for all levels of the keyboard folder
114 KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1)))
115 KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2)))
116 KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3)))
117 KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4)))
118 KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5)))
119
120 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
121 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
122 endif
123 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
124 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
125 endif
126 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
127 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
128 endif
129 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
130 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
131 endif
132 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
133 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
134 endif
135
136 # Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
137 # that the same keymap may be used on multiple keyboards.
138 #
139 # We grab the most top-level include file that we can. That file should
140 # use #ifdef statements to include all the neccesary subfolder includes,
141 # as described here:
142 #
143 # https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
144 #
145 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
146 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
147 endif
148 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
149 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
150 endif
151 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
152 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
153 endif
154 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
155 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
156 endif
157 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
158 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
159 endif
160
161 # Determine and set parameters based on the keyboard's processor family.
162 # We can assume a ChibiOS target When MCU_FAMILY is defined since it's
163 # not used for LUFA
164 ifdef MCU_FAMILY
165 FIRMWARE_FORMAT?=bin
166 PLATFORM=CHIBIOS
167 else ifdef ARM_ATSAM
168 PLATFORM=ARM_ATSAM
169 FIRMWARE_FORMAT=bin
170 else
171 PLATFORM=AVR
172 FIRMWARE_FORMAT?=hex
173 endif
174
175 ifeq ($(PLATFORM),CHIBIOS)
176 include $(TMK_PATH)/chibios.mk
177 OPT_OS = chibios
178 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
179 OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
180 else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
181 OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
182 else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
183 OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
184 else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
185 OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
186 else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
187 OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
188 else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
189 OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
190 else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
191 OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
192 else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
193 OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
194 else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
195 OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
196 else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
197 OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
198 else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
199 OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
200 endif
201 endif
202
203 # Find all of the config.h files and add them to our CONFIG_H define.
204 CONFIG_H :=
205 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
206 CONFIG_H += $(KEYBOARD_PATH_5)/config.h
207 endif
208 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
209 CONFIG_H += $(KEYBOARD_PATH_4)/config.h
210 endif
211 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
212 CONFIG_H += $(KEYBOARD_PATH_3)/config.h
213 endif
214 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
215 CONFIG_H += $(KEYBOARD_PATH_2)/config.h
216 endif
217 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
218 CONFIG_H += $(KEYBOARD_PATH_1)/config.h
219 endif
220
221 # Save the defines and includes here, so we don't include any keymap specific ones
222 PROJECT_DEFS := $(OPT_DEFS)
223 PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
224 PROJECT_CONFIG := $(CONFIG_H)
225
226 MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
227 MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
228 MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
229 MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
230 MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
231
232 ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
233 -include $(MAIN_KEYMAP_PATH_5)/rules.mk
234 KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
235 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
236 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
237 -include $(MAIN_KEYMAP_PATH_4)/rules.mk
238 KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
239 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
240 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
241 -include $(MAIN_KEYMAP_PATH_3)/rules.mk
242 KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
243 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
244 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
245 -include $(MAIN_KEYMAP_PATH_2)/rules.mk
246 KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
247 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
248 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
249 -include $(MAIN_KEYMAP_PATH_1)/rules.mk
250 KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
251 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
252 else ifneq ($(LAYOUTS),)
253 include build_layout.mk
254 else
255 $(error Could not find keymap)
256 # this state should never be reached
257 endif
258
259 # Userspace setup and definitions
260 ifeq ("$(USER_NAME)","")
261 USER_NAME := $(KEYMAP)
262 endif
263 USER_PATH := users/$(USER_NAME)
264
265 -include $(USER_PATH)/rules.mk
266 ifneq ("$(wildcard $(USER_PATH)/config.h)","")
267 CONFIG_H += $(USER_PATH)/config.h
268 endif
269
270
271 # Object files directory
272 # To put object files in current directory, use a dot (.), do NOT make
273 # this an empty or blank macro!
274 KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
275
276 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
277 CONFIG_H += $(KEYMAP_PATH)/config.h
278 endif
279
280 # # project specific files
281 SRC += $(KEYBOARD_SRC) \
282 $(KEYMAP_C) \
283 $(QUANTUM_SRC)
284
285 # Optimize size but this may cause error "relocation truncated to fit"
286 #EXTRALDFLAGS = -Wl,--relax
287
288 # Search Path
289 VPATH += $(KEYMAP_PATH)
290 VPATH += $(KEYBOARD_PATHS)
291 VPATH += $(COMMON_VPATH)
292 VPATH += $(USER_PATH)
293
294 include common_features.mk
295 include $(TMK_PATH)/protocol.mk
296 include $(TMK_PATH)/common.mk
297 include bootloader.mk
298
299 SRC += $(TMK_COMMON_SRC)
300 OPT_DEFS += $(TMK_COMMON_DEFS)
301 EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
302
303 ifeq ($(PLATFORM),AVR)
304 ifeq ($(strip $(PROTOCOL)), VUSB)
305 include $(TMK_PATH)/protocol/vusb.mk
306 else
307 include $(TMK_PATH)/protocol/lufa.mk
308 endif
309 include $(TMK_PATH)/avr.mk
310 endif
311
312 ifeq ($(PLATFORM),ARM_ATSAM)
313 include $(TMK_PATH)/arm_atsam.mk
314 include $(TMK_PATH)/protocol/arm_atsam.mk
315 endif
316
317 ifeq ($(PLATFORM),CHIBIOS)
318 include $(TMK_PATH)/protocol/chibios.mk
319 endif
320
321 ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
322 VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
323 VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
324 include $(VISUALIZER_PATH)/visualizer.mk
325 endif
326
327 ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
328
329 OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
330 $(KEYMAP_OUTPUT)_SRC := $(SRC)
331 $(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) $(GFXDEFS) \
332 -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" -DQMK_KEYBOARD_CONFIG_H=\"$(KEYBOARD_PATH_1)/config.h\" \
333 -DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
334 -DQMK_SUBPROJECT -DQMK_SUBPROJECT_H -DQMK_SUBPROJECT_CONFIG_H
335 $(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)
336 $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
337 $(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) $(GFXSRC)
338 $(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) $(GFXDEFS)
339 $(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) $(GFXINC)
340 $(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG)
341
342 # Default target.
343 all: build check-size
344 build: elf cpfirmware
345
346 include $(TMK_PATH)/rules.mk