1 # Determine what keyboard we are building and setup the build environment.
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.
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
)
23 # For split boards we need to set a master half.
29 ifeq ($(MASTER
),right
)
30 OPT_DEFS
+= -DMASTER_IS_ON_RIGHT
32 ifneq ($(MASTER
),left
)
33 $(error MASTER does not have a valid value
(left
/right
))
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
))
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
)
55 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
56 KEYBOARD_PATHS
+= $(KEYBOARD_PATH_5
)
58 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
59 KEYBOARD_PATHS
+= $(KEYBOARD_PATH_4
)
61 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
62 KEYBOARD_PATHS
+= $(KEYBOARD_PATH_3
)
64 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
65 KEYBOARD_PATHS
+= $(KEYBOARD_PATH_2
)
67 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
68 KEYBOARD_PATHS
+= $(KEYBOARD_PATH_1
)
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
75 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
76 include $(KEYBOARD_PATH_4
)/rules.mk
78 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
79 include $(KEYBOARD_PATH_3
)/rules.mk
81 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
82 include $(KEYBOARD_PATH_2
)/rules.mk
84 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
85 include $(KEYBOARD_PATH_1
)/rules.mk
88 # Find all the C source files to be compiled in subfolders.
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
97 ifneq ("$(wildcard $(KEYBOARD_C_5))","")
98 KEYBOARD_SRC
+= $(KEYBOARD_C_5
)
100 ifneq ("$(wildcard $(KEYBOARD_C_4))","")
101 KEYBOARD_SRC
+= $(KEYBOARD_C_4
)
103 ifneq ("$(wildcard $(KEYBOARD_C_3))","")
104 KEYBOARD_SRC
+= $(KEYBOARD_C_3
)
106 ifneq ("$(wildcard $(KEYBOARD_C_2))","")
107 KEYBOARD_SRC
+= $(KEYBOARD_C_2
)
109 ifneq ("$(wildcard $(KEYBOARD_C_1))","")
110 KEYBOARD_SRC
+= $(KEYBOARD_C_1
)
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
)))
120 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
121 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE_5
)
123 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
124 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE_4
)
126 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
127 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE_3
)
129 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
130 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE_2
)
132 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
133 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE_1
)
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.
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,
143 # https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
145 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
146 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_1
).h
148 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
149 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_2
).h
151 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
152 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_3
).h
154 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
155 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_4
).h
157 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
158 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_5
).h
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
175 ifeq ($(PLATFORM
),CHIBIOS
)
176 include $(TMK_PATH
)/chibios.mk
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
203 # Find all of the config.h files and add them to our CONFIG_H define.
205 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
206 CONFIG_H
+= $(KEYBOARD_PATH_5
)/config.h
208 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
209 CONFIG_H
+= $(KEYBOARD_PATH_4
)/config.h
211 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
212 CONFIG_H
+= $(KEYBOARD_PATH_3
)/config.h
214 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
215 CONFIG_H
+= $(KEYBOARD_PATH_2
)/config.h
217 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
218 CONFIG_H
+= $(KEYBOARD_PATH_1
)/config.h
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
)
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
)
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
255 $(error Could not find keymap
)
256 # this state should never be reached
259 # Userspace setup and definitions
260 ifeq ("$(USER_NAME)","")
261 USER_NAME
:= $(KEYMAP
)
263 USER_PATH
:= users
/$(USER_NAME
)
265 -include $(USER_PATH
)/rules.mk
266 ifneq ("$(wildcard $(USER_PATH)/config.h)","")
267 CONFIG_H
+= $(USER_PATH
)/config.h
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
)
276 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
277 CONFIG_H
+= $(KEYMAP_PATH
)/config.h
280 # # project specific files
281 SRC
+= $(KEYBOARD_SRC
) \
285 # Optimize size but this may cause error "relocation truncated to fit"
286 #EXTRALDFLAGS = -Wl,--relax
289 VPATH
+= $(KEYMAP_PATH
)
290 VPATH
+= $(KEYBOARD_PATHS
)
291 VPATH
+= $(COMMON_VPATH
)
292 VPATH
+= $(USER_PATH
)
294 include common_features.mk
295 include $(TMK_PATH
)/protocol.mk
296 include $(TMK_PATH
)/common.mk
297 include bootloader.mk
299 SRC
+= $(TMK_COMMON_SRC
)
300 OPT_DEFS
+= $(TMK_COMMON_DEFS
)
301 EXTRALDFLAGS
+= $(TMK_COMMON_LDFLAGS
)
303 ifeq ($(PLATFORM
),AVR
)
304 ifeq ($(strip $(PROTOCOL
)), VUSB
)
305 include $(TMK_PATH
)/protocol
/vusb.mk
307 include $(TMK_PATH
)/protocol
/lufa.mk
309 include $(TMK_PATH
)/avr.mk
312 ifeq ($(PLATFORM
),ARM_ATSAM
)
313 include $(TMK_PATH
)/arm_atsam.mk
314 include $(TMK_PATH
)/protocol
/arm_atsam.mk
317 ifeq ($(PLATFORM
),CHIBIOS
)
318 include $(TMK_PATH
)/protocol
/chibios.mk
321 ifeq ($(strip $(VISUALIZER_ENABLE
)), yes
)
322 VISUALIZER_DIR
= $(QUANTUM_DIR
)/visualizer
323 VISUALIZER_PATH
= $(QUANTUM_PATH
)/visualizer
324 include $(VISUALIZER_PATH
)/visualizer.mk
327 ALL_CONFIGS
:= $(PROJECT_CONFIG
) $(CONFIG_H
)
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
)
343 all: build check-size
344 build
: elf cpfirmware
346 include $(TMK_PATH
)/rules.mk