]> git.donarmstrong.com Git - qmk_firmware.git/blob - build_keyboard.mk
0debc49259680981ae0836826d375d43055bf3d6
[qmk_firmware.git] / build_keyboard.mk
1 ifndef VERBOSE
2 .SILENT:
3 endif
4
5 .DEFAULT_GOAL := all
6
7 include message.mk
8
9
10 # Directory common source filess exist
11 TOP_DIR = .
12 TMK_DIR = tmk_core
13 TMK_PATH = $(TOP_DIR)/$(TMK_DIR)
14 LIB_PATH = $(TOP_DIR)/lib
15
16 QUANTUM_DIR = quantum
17 QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR)
18
19
20 MASTER ?= left
21 ifdef master
22         MASTER = $(master)
23 endif
24
25 KEYBOARD_PATH := keyboards/$(KEYBOARD)
26 KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c
27
28 ifneq ("$(wildcard $(KEYBOARD_C))","")
29     include $(KEYBOARD_PATH)/rules.mk
30 else 
31     $(error "$(KEYBOARD_C)" does not exist)
32 endif
33
34
35 ifneq ($(SUBPROJECT),)
36     SUBPROJECT_PATH := keyboards/$(KEYBOARD)/$(SUBPROJECT)
37     SUBPROJECT_C := $(SUBPROJECT_PATH)/$(SUBPROJECT).c
38     ifneq ("$(wildcard $(SUBPROJECT_C))","")
39         OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT)
40         include $(SUBPROJECT_PATH)/rules.mk
41     else 
42         $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist)
43     endif
44 endif
45
46 # We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA
47 ifdef MCU_FAMILY
48         PLATFORM=CHIBIOS
49 else
50         PLATFORM=AVR
51 endif
52
53 ifeq ($(PLATFORM),CHIBIOS)
54         include $(TMK_PATH)/protocol/chibios.mk
55         include $(TMK_PATH)/chibios.mk
56         OPT_OS = chibios
57 endif
58
59 # Save the defines and includes here, so we don't include any keymap specific ones 
60 PROJECT_DEFS := $(OPT_DEFS)
61 PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(SUBPROJECT_PATH) $(KEYBOARD_PATH)
62
63 MAIN_KEYMAP_PATH := $(KEYBOARD_PATH)/keymaps/$(KEYMAP)
64 MAIN_KEYMAP_C := $(MAIN_KEYMAP_PATH)/keymap.c
65 SUBPROJ_KEYMAP_PATH := $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)
66 SUBPROJ_KEYMAP_C := $(SUBPROJ_KEYMAP_PATH)/keymap.c
67 ifneq ("$(wildcard $(SUBPROJ_KEYMAP_C))","")
68     -include $(SUBPROJ_KEYMAP_PATH)/Makefile
69     KEYMAP_C := $(SUBPROJ_KEYMAP_C)
70     KEYMAP_PATH := $(SUBPROJ_KEYMAP_PATH)
71 else ifneq ("$(wildcard $(MAIN_KEYMAP_C))","")
72     -include $(MAIN_KEYMAP_PATH)/Makefile
73     KEYMAP_C := $(MAIN_KEYMAP_C)
74     KEYMAP_PATH := $(MAIN_KEYMAP_PATH)
75 else
76     $(error "$(MAIN_KEYMAP_C)/keymap.c" does not exist)
77 endif
78
79 BUILD_DIR = $(TOP_DIR)/.build
80
81 ifneq ($(SUBPROJECT),)
82         TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP)
83         KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)_$(SUBPROJECT)
84 else
85         TARGET ?= $(KEYBOARD)_$(KEYMAP)
86         KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)
87 endif
88
89 # Object files directory
90 #     To put object files in current directory, use a dot (.), do NOT make
91 #     this an empty or blank macro!
92 KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
93
94
95 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
96         CONFIG_H = $(KEYMAP_PATH)/config.h
97 else
98         CONFIG_H = $(KEYBOARD_PATH)/config.h
99         ifneq ($(SUBPROJECT),)
100                 ifneq ("$(wildcard $(SUBPROJECT_C))","")
101                         CONFIG_H = $(SUBPROJECT_PATH)/config.h
102                 endif
103         endif
104 endif
105
106 # # project specific files
107 SRC += $(KEYBOARD_C) \
108         $(KEYMAP_C) \
109         $(QUANTUM_DIR)/quantum.c \
110         $(QUANTUM_DIR)/keymap_common.c \
111         $(QUANTUM_DIR)/keycode_config.c \
112         $(QUANTUM_DIR)/process_keycode/process_leader.c
113
114 ifneq ($(SUBPROJECT),)
115         SRC += $(SUBPROJECT_C)
116 endif
117
118 ifndef CUSTOM_MATRIX
119         SRC += $(QUANTUM_DIR)/matrix.c
120 endif
121
122 ifeq ($(strip $(MIDI_ENABLE)), yes)
123     OPT_DEFS += -DMIDI_ENABLE
124         SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
125 endif
126
127 ifeq ($(strip $(AUDIO_ENABLE)), yes)
128     OPT_DEFS += -DAUDIO_ENABLE
129         SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
130         SRC += $(QUANTUM_DIR)/audio/audio.c
131         SRC += $(QUANTUM_DIR)/audio/voices.c
132         SRC += $(QUANTUM_DIR)/audio/luts.c
133 endif
134
135 ifeq ($(strip $(UNICODE_ENABLE)), yes)
136     OPT_DEFS += -DUNICODE_ENABLE
137         SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
138 endif
139
140 ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
141         OPT_DEFS += -DRGBLIGHT_ENABLE
142         SRC += $(QUANTUM_DIR)/light_ws2812.c
143         SRC += $(QUANTUM_DIR)/rgblight.c
144 endif
145
146 ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
147         OPT_DEFS += -DTAP_DANCE_ENABLE
148         SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
149 endif
150
151 ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
152         SERIAL_DIR = $(QUANTUM_DIR)/serial_link
153         SERIAL_PATH = $(QUANTUM_PATH)/serial_link
154         SERIAL_SRC = $(wildcard $(SERIAL_PATH)/protocol/*.c)
155         SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
156         SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
157         OPT_DEFS += -DSERIAL_LINK_ENABLE
158         VAPTH += $(SERIAL_PATH)
159 endif
160
161 # Optimize size but this may cause error "relocation truncated to fit"
162 #EXTRALDFLAGS = -Wl,--relax
163
164 # Search Path
165 VPATH += $(KEYMAP_PATH)
166 ifneq ($(SUBPROJECT),)
167         VPATH += $(SUBPROJECT_PATH)
168 endif
169 VPATH += $(KEYBOARD_PATH)
170 VPATH += $(TOP_DIR)
171 VPATH += $(TMK_PATH)
172 VPATH += $(QUANTUM_PATH)
173 VPATH += $(QUANTUM_PATH)/keymap_extras
174 VPATH += $(QUANTUM_PATH)/audio
175 VPATH += $(QUANTUM_PATH)/process_keycode
176
177
178 include $(TMK_PATH)/common.mk
179 ifeq ($(PLATFORM),AVR)
180         include $(TMK_PATH)/protocol/lufa.mk
181         include $(TMK_PATH)/avr.mk
182 endif
183
184 ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
185         VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
186         VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
187         include $(VISUALIZER_PATH)/visualizer.mk
188 endif
189
190
191 OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT)
192 $(KEYMAP_OUTPUT)_SRC := $(SRC)
193 $(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" 
194 $(KEYMAP_OUTPUT)_INC := $(EXTRAINCDIRS) $(VPATH)
195 $(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC)
196 $(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS)
197 $(KEYBOARD_OUTPUT)_INC := $(PROJECT_INC)
198
199
200 include $(TMK_PATH)/rules.mk
201