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 OPT_DEFS
+= -DKEYBOARD_
$(KEYBOARD_FILESAFE
)
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.
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,
123 # https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
125 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
126 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_1
).h
128 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
129 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_2
).h
131 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
132 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_3
).h
134 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
135 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_4
).h
137 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
138 QMK_KEYBOARD_H
= $(KEYBOARD_FOLDER_5
).h
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
152 ifeq ($(PLATFORM
),CHIBIOS
)
153 include $(TMK_PATH
)/chibios.mk
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
180 # Find all of the config.h files and add them to our CONFIG_H define.
182 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
183 CONFIG_H
+= $(KEYBOARD_PATH_5
)/config.h
185 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
186 CONFIG_H
+= $(KEYBOARD_PATH_4
)/config.h
188 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
189 CONFIG_H
+= $(KEYBOARD_PATH_3
)/config.h
191 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
192 CONFIG_H
+= $(KEYBOARD_PATH_2
)/config.h
194 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
195 CONFIG_H
+= $(KEYBOARD_PATH_1
)/config.h
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
)
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
)
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
232 $(error Could not find keymap
)
233 # this state should never be reached
236 # Userspace setup and definitions
237 ifeq ("$(USER_NAME)","")
238 USER_NAME
:= $(KEYMAP
)
240 USER_PATH
:= users
/$(USER_NAME
)
242 -include $(USER_PATH
)/rules.mk
243 ifneq ("$(wildcard $(USER_PATH)/config.h)","")
244 CONFIG_H
+= $(USER_PATH
)/config.h
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
)
253 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
254 CONFIG_H
+= $(KEYMAP_PATH
)/config.h
257 # # project specific files
258 SRC
+= $(KEYBOARD_SRC
) \
262 # Optimize size but this may cause error "relocation truncated to fit"
263 #EXTRALDFLAGS = -Wl,--relax
266 VPATH
+= $(KEYMAP_PATH
)
267 VPATH
+= $(KEYBOARD_PATHS
)
268 VPATH
+= $(COMMON_VPATH
)
269 VPATH
+= $(USER_PATH
)
271 include common_features.mk
272 include $(TMK_PATH
)/protocol.mk
273 include $(TMK_PATH
)/common.mk
274 include bootloader.mk
276 SRC
+= $(TMK_COMMON_SRC
)
277 OPT_DEFS
+= $(TMK_COMMON_DEFS
)
278 EXTRALDFLAGS
+= $(TMK_COMMON_LDFLAGS
)
280 ifeq ($(PLATFORM
),AVR
)
281 ifeq ($(strip $(PROTOCOL
)), VUSB
)
282 include $(TMK_PATH
)/protocol
/vusb.mk
284 include $(TMK_PATH
)/protocol
/lufa.mk
286 include $(TMK_PATH
)/avr.mk
289 ifeq ($(PLATFORM
),CHIBIOS
)
290 include $(TMK_PATH
)/protocol
/chibios.mk
293 ifeq ($(strip $(VISUALIZER_ENABLE
)), yes
)
294 VISUALIZER_DIR
= $(QUANTUM_DIR
)/visualizer
295 VISUALIZER_PATH
= $(QUANTUM_PATH
)/visualizer
296 include $(VISUALIZER_PATH
)/visualizer.mk
299 ALL_CONFIGS
:= $(PROJECT_CONFIG
) $(CONFIG_H
)
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
)
315 all: build check-size
316 build
: elf cpfirmware
318 include $(TMK_PATH
)/rules.mk