Align some ChibiOS build logic (#8461)
[jackhill/qmk/firmware.git] / build_keyboard.mk
CommitLineData
98b16b32 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
86706de0
FS
7ifndef VERBOSE
8.SILENT:
9endif
10
11.DEFAULT_GOAL := all
12
27a673f5 13include common.mk
8f164031 14
98b16b32 15# Set the filename for the final firmware binary
800ec55d 16KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
800ec55d
JH
17TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
18KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD_FILESAFE)
3cf179be 19STM32_PATH := quantum/stm32
8f164031
FS
20
21# Force expansion
22TARGET := $(TARGET)
23
98b16b32 24# For split boards we need to set a master half.
86706de0
FS
25MASTER ?= left
26ifdef master
1d5567a3 27 MASTER = $(master)
86706de0
FS
28endif
29
b911e196 30ifeq ($(MASTER),right)
1d5567a3 31 OPT_DEFS += -DMASTER_IS_ON_RIGHT
b911e196 32else
1d5567a3 33 ifneq ($(MASTER),left)
c692fd1d 34$(error MASTER does not have a valid value(left/right))
1d5567a3 35 endif
c692fd1d
FS
36endif
37
8f790948
TI
38ifdef SKIP_VERSION
39 OPT_DEFS += -DSKIP_VERSION
40endif
41
98b16b32 42# Determine which subfolders exist.
43KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
44KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
45KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2)))
46KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3)))
47KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4)))
48KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1))
49KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2))
50KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3))
51KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4))
52KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5))
800ec55d 53KEYBOARD_PATHS :=
800ec55d
JH
54KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1)
55KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2)
56KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3)
57KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4)
58KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5)
59
98b16b32 60ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
800ec55d 61 KEYBOARD_PATHS += $(KEYBOARD_PATH_5)
98b16b32 62endif
63ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
64 KEYBOARD_PATHS += $(KEYBOARD_PATH_4)
65endif
66ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
67 KEYBOARD_PATHS += $(KEYBOARD_PATH_3)
68endif
69ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
70 KEYBOARD_PATHS += $(KEYBOARD_PATH_2)
71endif
72ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
73 KEYBOARD_PATHS += $(KEYBOARD_PATH_1)
74endif
75
3cf179be 76
98b16b32 77# Pull in rules.mk files from all our subfolders
78ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
800ec55d
JH
79 include $(KEYBOARD_PATH_5)/rules.mk
80endif
81ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
800ec55d
JH
82 include $(KEYBOARD_PATH_4)/rules.mk
83endif
84ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
800ec55d 85 include $(KEYBOARD_PATH_3)/rules.mk
67b294ca 86endif
800ec55d 87ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
800ec55d
JH
88 include $(KEYBOARD_PATH_2)/rules.mk
89endif
90ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
800ec55d
JH
91 include $(KEYBOARD_PATH_1)/rules.mk
92endif
93
3cf179be
JH
94
95MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
96MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
97MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
98MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
99MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
100
a25dd58b 101# Check for keymap.json first, so we can regenerate keymap.c
102include build_json.mk
103
104ifeq ("$(wildcard $(KEYMAP_PATH))", "")
105 # Look through the possible keymap folders until we find a matching keymap.c
106 ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
107 -include $(MAIN_KEYMAP_PATH_5)/rules.mk
108 KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
109 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
110 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
111 -include $(MAIN_KEYMAP_PATH_4)/rules.mk
112 KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
113 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
114 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
115 -include $(MAIN_KEYMAP_PATH_3)/rules.mk
116 KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
117 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
118 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
119 -include $(MAIN_KEYMAP_PATH_2)/rules.mk
120 KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
121 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
122 else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
123 -include $(MAIN_KEYMAP_PATH_1)/rules.mk
124 KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
125 KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
126 else ifneq ($(LAYOUTS),)
127 # If we haven't found a keymap yet fall back to community layouts
128 include build_layout.mk
129 else
130 $(error Could not find keymap)
131 # this state should never be reached
132 endif
3cf179be
JH
133endif
134
135ifeq ($(strip $(CTPC)), yes)
136 CONVERT_TO_PROTON_C=yes
137endif
138
139ifeq ($(strip $(CONVERT_TO_PROTON_C)), yes)
140 TARGET := $(TARGET)_proton_c
141 include $(STM32_PATH)/proton_c.mk
142 OPT_DEFS += -DCONVERT_TO_PROTON_C
143endif
144
40e67a30 145ifneq ($(FORCE_LAYOUT),)
146 TARGET := $(TARGET)_$(FORCE_LAYOUT)
147endif
148
3cf179be
JH
149include quantum/mcu_selection.mk
150
151ifdef MCU_FAMILY
152 OPT_DEFS += -DQMK_STM32
153 KEYBOARD_PATHS += $(STM32_PATH)
154endif
155
156
98b16b32 157# Find all the C source files to be compiled in subfolders.
800ec55d
JH
158KEYBOARD_SRC :=
159
160KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c
161KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c
162KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c
163KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c
164KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c
67b294ca 165
800ec55d
JH
166ifneq ("$(wildcard $(KEYBOARD_C_5))","")
167 KEYBOARD_SRC += $(KEYBOARD_C_5)
168endif
169ifneq ("$(wildcard $(KEYBOARD_C_4))","")
170 KEYBOARD_SRC += $(KEYBOARD_C_4)
171endif
172ifneq ("$(wildcard $(KEYBOARD_C_3))","")
173 KEYBOARD_SRC += $(KEYBOARD_C_3)
174endif
175ifneq ("$(wildcard $(KEYBOARD_C_2))","")
176 KEYBOARD_SRC += $(KEYBOARD_C_2)
177endif
178ifneq ("$(wildcard $(KEYBOARD_C_1))","")
179 KEYBOARD_SRC += $(KEYBOARD_C_1)
180endif
181
6cf9402c
DJ
182# Generate KEYBOARD_name_subname for all levels of the keyboard folder
183KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1)))
184KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2)))
185KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3)))
186KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4)))
187KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5)))
800ec55d 188
6cf9402c
DJ
189ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
190 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
191endif
192ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
193 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
194endif
195ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
196 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
197endif
198ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
199 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
200endif
201ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
202 OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
203endif
ec3e065f 204
98b16b32 205# Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
206# that the same keymap may be used on multiple keyboards.
207#
208# We grab the most top-level include file that we can. That file should
209# use #ifdef statements to include all the neccesary subfolder includes,
210# as described here:
211#
212# https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
213#
ec3e065f
JH
214ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
215 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
216endif
217ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
218 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
219endif
220ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
221 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
222endif
223ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
224 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
225endif
226ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
227 QMK_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
228endif
229
98b16b32 230# Determine and set parameters based on the keyboard's processor family.
231# We can assume a ChibiOS target When MCU_FAMILY is defined since it's
232# not used for LUFA
33fbd3be 233ifdef MCU_FAMILY
1d5567a3 234 PLATFORM=CHIBIOS
d96380e6
JC
235 PLATFORM_KEY=chibios
236 FIRMWARE_FORMAT?=bin
30680c6e 237else ifdef ARM_ATSAM
238 PLATFORM=ARM_ATSAM
d96380e6 239 PLATFORM_KEY=arm_atsam
30680c6e 240 FIRMWARE_FORMAT=bin
33fbd3be 241else
1d5567a3 242 PLATFORM=AVR
d96380e6 243 PLATFORM_KEY=avr
98b16b32 244 FIRMWARE_FORMAT?=hex
33fbd3be
FS
245endif
246
98b16b32 247# Find all of the config.h files and add them to our CONFIG_H define.
800ec55d
JH
248CONFIG_H :=
249ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
250 CONFIG_H += $(KEYBOARD_PATH_5)/config.h
251endif
252ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
253 CONFIG_H += $(KEYBOARD_PATH_4)/config.h
254endif
255ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
256 CONFIG_H += $(KEYBOARD_PATH_3)/config.h
257endif
258ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
259 CONFIG_H += $(KEYBOARD_PATH_2)/config.h
260endif
261ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
262 CONFIG_H += $(KEYBOARD_PATH_1)/config.h
9028a412
FS
263endif
264
7e67bd79
TI
265POST_CONFIG_H :=
266ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
267 POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
268endif
269ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","")
270 POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h
271endif
272ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","")
273 POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h
274endif
275ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","")
276 POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h
277endif
278ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
279 POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
280endif
281
98b16b32 282# Userspace setup and definitions
5ca9aecf
JW
283ifeq ("$(USER_NAME)","")
284 USER_NAME := $(KEYMAP)
285endif
286USER_PATH := users/$(USER_NAME)
287
06f196c5 288-include $(USER_PATH)/rules.mk
508801c9
W
289ifneq ("$(wildcard $(USER_PATH)/config.h)","")
290 CONFIG_H += $(USER_PATH)/config.h
162a67cb
DJ
291endif
292
86706de0
FS
293# Object files directory
294# To put object files in current directory, use a dot (.), do NOT make
295# this an empty or blank macro!
3aac4e95 296KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
86706de0 297
86706de0 298ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
800ec55d 299 CONFIG_H += $(KEYMAP_PATH)/config.h
86706de0
FS
300endif
301
a25dd58b 302# project specific files
800ec55d 303SRC += $(KEYBOARD_SRC) \
1d5567a3 304 $(KEYMAP_C) \
1c0fe956 305 $(QUANTUM_SRC)
86706de0 306
86706de0
FS
307# Optimize size but this may cause error "relocation truncated to fit"
308#EXTRALDFLAGS = -Wl,--relax
309
310# Search Path
311VPATH += $(KEYMAP_PATH)
27b0f892 312VPATH += $(USER_PATH)
800ec55d 313VPATH += $(KEYBOARD_PATHS)
c692fd1d 314VPATH += $(COMMON_VPATH)
86706de0 315
1c0fe956 316include common_features.mk
3be13d1f 317include $(TMK_PATH)/protocol.mk
86706de0 318include $(TMK_PATH)/common.mk
9fdc2762 319include bootloader.mk
1c0fe956 320
29f68459 321SRC += $(patsubst %.c,%.clib,$(LIB_SRC))
8f790948 322SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC))
c692fd1d
FS
323SRC += $(TMK_COMMON_SRC)
324OPT_DEFS += $(TMK_COMMON_DEFS)
325EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
326
d8f3c28a
JC
327include $(TMK_PATH)/$(PLATFORM_KEY).mk
328ifneq ($(strip $(PROTOCOL)),)
329 include $(TMK_PATH)/protocol/$(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')).mk
f7462aaa 330else
d8f3c28a 331 include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
30680c6e 332endif
333
d8f3c28a
JC
334# TODO: remove this bodge?
335PROJECT_DEFS := $(OPT_DEFS)
336PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
337PROJECT_CONFIG := $(CONFIG_H)
53ff8a31 338
86706de0 339ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
1d5567a3
FS
340 VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
341 VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
342 include $(VISUALIZER_PATH)/visualizer.mk
86706de0
FS
343endif
344
7e67bd79 345CONFIG_H += $(POST_CONFIG_H)
ec3e065f
JH
346ALL_CONFIGS := $(PROJECT_CONFIG) $(CONFIG_H)
347
3aac4e95
FS
348OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
349$(KEYMAP_OUTPUT)_SRC := $(SRC)
d2ff66a9 350$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) $(GFXDEFS) \
ec3e065f 351-DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(QMK_KEYBOARD_H)\" -DQMK_KEYBOARD_CONFIG_H=\"$(KEYBOARD_PATH_1)/config.h\" \
d2ff66a9 352-DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
800ec55d 353-DQMK_SUBPROJECT -DQMK_SUBPROJECT_H -DQMK_SUBPROJECT_CONFIG_H
c692fd1d 354$(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS)
9028a412 355$(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H)
f5c89416
FS
356$(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) $(GFXSRC)
357$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) $(GFXDEFS)
358$(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC) $(GFXINC)
800ec55d 359$(KEYBOARD_OUTPUT)_CONFIG := $(PROJECT_CONFIG)
3aac4e95 360
8a9aac6e 361# Default target.
9fdc2762 362all: build check-size
9bfaf667 363build: elf cpfirmware
4082d880 364check-size: build
0f95c086 365objs-size: build
3aac4e95 366
d5bc7fc1 367include show_options.mk
86706de0 368include $(TMK_PATH)/rules.mk