]> git.donarmstrong.com Git - qmk_firmware.git/blob - build_keyboard.mk
Document FIRMWARE_FORMAT (#3631)
[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 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE)
114
115
116 # Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
117 # that the same keymap may be used on multiple keyboards.
118 #
119 # We grab the most top-level include file that we can. That file should
120 # use #ifdef statements to include all the neccesary subfolder includes,
121 # as described here:
122 #
123 #    https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
124 #
125 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
126     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
127 endif
128 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
129     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
130 endif
131 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
132     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
133 endif
134 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
135     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
136 endif
137 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
138     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
139 endif
140
141 # Determine and set parameters based on the keyboard's processor family.
142 # We can assume a ChibiOS target When MCU_FAMILY is defined since it's
143 # not used for LUFA
144 ifdef MCU_FAMILY
145     FIRMWARE_FORMAT?=bin
146     PLATFORM=CHIBIOS
147 else
148     PLATFORM=AVR
149     FIRMWARE_FORMAT?=hex
150 endif
151
152 ifeq ($(PLATFORM),CHIBIOS)
153     include $(TMK_PATH)/chibios.mk
154     OPT_OS = chibios
155     ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
156         OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
157      else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
158         OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
159     else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
160         OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
161      else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
162         OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
163     else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
164         OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
165      else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
166         OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
167     else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
168         OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
169      else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
170         OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
171     else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
172         OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
173      else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
174         OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
175     else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
176         OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
177     endif
178 endif
179
180 # Find all of the config.h files and add them to our CONFIG_H define.
181 CONFIG_H :=
182 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
183     CONFIG_H += $(KEYBOARD_PATH_5)/config.h
184 endif
185 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
186     CONFIG_H += $(KEYBOARD_PATH_4)/config.h
187 endif
188 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
189     CONFIG_H += $(KEYBOARD_PATH_3)/config.h
190 endif
191 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
192     CONFIG_H += $(KEYBOARD_PATH_2)/config.h
193 endif
194 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
195     CONFIG_H += $(KEYBOARD_PATH_1)/config.h
196 endif
197
198 # Save the defines and includes here, so we don't include any keymap specific ones
199 PROJECT_DEFS := $(OPT_DEFS)
200 PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
201 PROJECT_CONFIG := $(CONFIG_H)
202
203 MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
204 MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
205 MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
206 MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
207 MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
208
209 ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
210     -include $(MAIN_KEYMAP_PATH_5)/rules.mk
211     KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
212     KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
213 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
214     -include $(MAIN_KEYMAP_PATH_4)/rules.mk
215     KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
216     KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
217 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
218     -include $(MAIN_KEYMAP_PATH_3)/rules.mk
219     KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
220     KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
221 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
222     -include $(MAIN_KEYMAP_PATH_2)/rules.mk
223     KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
224     KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
225 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
226     -include $(MAIN_KEYMAP_PATH_1)/rules.mk
227     KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
228     KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
229 else ifneq ($(LAYOUTS),)
230     include build_layout.mk
231 else
232     $(error Could not find keymap)
233     # this state should never be reached
234 endif
235
236 # Userspace setup and definitions
237 ifeq ("$(USER_NAME)","")
238     USER_NAME := $(KEYMAP)
239 endif
240 USER_PATH := users/$(USER_NAME)
241
242 -include $(USER_PATH)/rules.mk
243 ifneq ("$(wildcard $(USER_PATH)/config.h)","")
244     CONFIG_H += $(USER_PATH)/config.h
245 endif
246
247
248 # Object files directory
249 #     To put object files in current directory, use a dot (.), do NOT make
250 #     this an empty or blank macro!
251 KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
252
253 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
254     CONFIG_H += $(KEYMAP_PATH)/config.h
255 endif
256
257 # # project specific files
258 SRC += $(KEYBOARD_SRC) \
259     $(KEYMAP_C) \
260     $(QUANTUM_SRC)
261
262 # Optimize size but this may cause error "relocation truncated to fit"
263 #EXTRALDFLAGS = -Wl,--relax
264
265 # Search Path
266 VPATH += $(KEYMAP_PATH)
267 VPATH += $(KEYBOARD_PATHS)
268 VPATH += $(COMMON_VPATH)
269 VPATH += $(USER_PATH)
270
271 include common_features.mk
272 include $(TMK_PATH)/protocol.mk
273 include $(TMK_PATH)/common.mk
274 include bootloader.mk
275
276 SRC += $(TMK_COMMON_SRC)
277 OPT_DEFS += $(TMK_COMMON_DEFS)
278 EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
279
280 ifeq ($(PLATFORM),AVR)
281 ifeq ($(strip $(PROTOCOL)), VUSB)
282     include $(TMK_PATH)/protocol/vusb.mk
283 else
284     include $(TMK_PATH)/protocol/lufa.mk
285 endif
286     include $(TMK_PATH)/avr.mk
287 endif
288
289 ifeq ($(PLATFORM),CHIBIOS)
290     include $(TMK_PATH)/protocol/chibios.mk
291 endif
292
293 ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
294     VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
295     VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
296     include $(VISUALIZER_PATH)/visualizer.mk
297 endif
298
299 ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
300
301 OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
302 $(KEYMAP_OUTPUT)_SRC := $(SRC)
303 $(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) $(GFXDEFS) \
304 -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" -DQMK_KEYBOARD_CONFIG_H=\"$(KEYBOARD_PATH_1)/config.h\" \
305 -DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
306 -DQMK_SUBPROJECT -DQMK_SUBPROJECT_H -DQMK_SUBPROJECT_CONFIG_H
307 $(KEYMAP_OUTPUT)_INC :=  $(VPATH) $(EXTRAINCDIRS)
308 $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
309 $(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) $(GFXSRC)
310 $(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) $(GFXDEFS)
311 $(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) $(GFXINC)
312 $(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG)
313
314 # Default target.
315 all: build check-size
316 build: elf cpfirmware
317
318 include $(TMK_PATH)/rules.mk