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