]> git.donarmstrong.com Git - qmk_firmware.git/blob - build_keyboard.mk
Refactor quantum/split_common/i2c.c, quantum/split_common/serial.c (#4522)
[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