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