]> git.donarmstrong.com Git - qmk_firmware.git/blob - build_keyboard.mk
Second try at configuring i18n for docsify and gitbook (#4531)
[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 # 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)))
119
120 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
121     OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
122 endif
123 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
124     OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
125 endif
126 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
127     OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
128 endif
129 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
130     OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
131 endif
132 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
133     OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
134 endif
135
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.
138 #
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,
141 # as described here:
142 #
143 #    https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
144 #
145 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
146     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
147 endif
148 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
149     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
150 endif
151 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
152     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
153 endif
154 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
155     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
156 endif
157 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
158     QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
159 endif
160
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
163 # not used for LUFA
164 ifdef MCU_FAMILY
165     FIRMWARE_FORMAT?=bin
166     PLATFORM=CHIBIOS
167 else ifdef ARM_ATSAM
168     PLATFORM=ARM_ATSAM
169     FIRMWARE_FORMAT=bin
170 else
171     PLATFORM=AVR
172     FIRMWARE_FORMAT?=hex
173 endif
174
175 ifeq ($(PLATFORM),CHIBIOS)
176     include $(TMK_PATH)/chibios.mk
177     OPT_OS = chibios
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
200     endif
201 endif
202
203 # Find all of the config.h files and add them to our CONFIG_H define.
204 CONFIG_H :=
205 ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
206     CONFIG_H += $(KEYBOARD_PATH_5)/config.h
207 endif
208 ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
209     CONFIG_H += $(KEYBOARD_PATH_4)/config.h
210 endif
211 ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
212     CONFIG_H += $(KEYBOARD_PATH_3)/config.h
213 endif
214 ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
215     CONFIG_H += $(KEYBOARD_PATH_2)/config.h
216 endif
217 ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
218     CONFIG_H += $(KEYBOARD_PATH_1)/config.h
219 endif
220
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)
225
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)
231
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
254 else
255     $(error Could not find keymap)
256     # this state should never be reached
257 endif
258
259 # Userspace setup and definitions
260 ifeq ("$(USER_NAME)","")
261     USER_NAME := $(KEYMAP)
262 endif
263 USER_PATH := users/$(USER_NAME)
264
265 -include $(USER_PATH)/rules.mk
266 ifneq ("$(wildcard $(USER_PATH)/config.h)","")
267     CONFIG_H += $(USER_PATH)/config.h
268 endif
269
270
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)
275
276 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
277     CONFIG_H += $(KEYMAP_PATH)/config.h
278 endif
279
280 # # project specific files
281 SRC += $(KEYBOARD_SRC) \
282     $(KEYMAP_C) \
283     $(QUANTUM_SRC)
284
285 # Optimize size but this may cause error "relocation truncated to fit"
286 #EXTRALDFLAGS = -Wl,--relax
287
288 # Search Path
289 VPATH += $(KEYMAP_PATH)
290 VPATH += $(KEYBOARD_PATHS)
291 VPATH += $(COMMON_VPATH)
292 VPATH += $(USER_PATH)
293
294 include common_features.mk
295 include $(TMK_PATH)/protocol.mk
296 include $(TMK_PATH)/common.mk
297 include bootloader.mk
298
299 SRC += $(TMK_COMMON_SRC)
300 OPT_DEFS += $(TMK_COMMON_DEFS)
301 EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
302
303 ifeq ($(PLATFORM),AVR)
304 ifeq ($(strip $(PROTOCOL)), VUSB)
305     include $(TMK_PATH)/protocol/vusb.mk
306 else
307     include $(TMK_PATH)/protocol/lufa.mk
308 endif
309     include $(TMK_PATH)/avr.mk
310 endif
311
312 ifeq ($(PLATFORM),ARM_ATSAM)
313     include $(TMK_PATH)/arm_atsam.mk
314     include $(TMK_PATH)/protocol/arm_atsam.mk
315 endif
316
317 ifeq ($(PLATFORM),CHIBIOS)
318     include $(TMK_PATH)/protocol/chibios.mk
319 endif
320
321 ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
322     VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
323     VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
324     include $(VISUALIZER_PATH)/visualizer.mk
325 endif
326
327 ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
328
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)
341
342 # Default target.
343 all: build check-size
344 build: elf cpfirmware
345
346 include $(TMK_PATH)/rules.mk