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