]> git.donarmstrong.com Git - qmk_firmware.git/blob - Makefile
Merge pull request #646 from nclundsten/master
[qmk_firmware.git] / Makefile
1 ifndef VERBOSE
2 .SILENT:
3 endif
4
5 .DEFAULT_GOAL := all
6
7 space := $(subst ,, )
8 ESCAPED_ABS_PATH = $(subst $(space),_SPACE_,$(abspath $1))
9 starting_makefile := $(call ESCAPED_ABS_PATH,$(firstword $(MAKEFILE_LIST)))
10 mkfile_path := $(call ESCAPED_ABS_PATH,$(lastword $(MAKEFILE_LIST))))
11 abs_tmk_root := $(patsubst %/,%,$(dir $(mkfile_path)))
12
13 ifneq (,$(findstring /keyboards/,$(starting_makefile)))
14         possible_keyboard:=$(patsubst %/,%,$(dir $(patsubst $(abs_tmk_root)/keyboards/%,%,$(starting_makefile))))
15         ifneq (,$(findstring /keymaps/,$(possible_keyboard)))
16                 KEYMAP_DIR:=$(lastword $(subst /keymaps/, ,$(possible_keyboard)))
17                 KEYBOARD_DIR:=$(firstword $(subst /keymaps/, ,$(possible_keyboard)))
18                 ifneq (,$(findstring /,$(KEYBOARD_DIR)))
19                         # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR)))
20                         # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR)))
21                         tmk_root = ../../..
22                 else
23                         tmk_root = ../../../..
24                 endif
25         else
26                 KEYMAP_DIR:=default
27                 KEYBOARD_DIR:=$(possible_keyboard)
28                 ifneq (,$(findstring /,$(KEYBOARD_DIR)))
29                         # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR)))
30                         # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR)))
31                         tmk_root = ../../..
32                 else
33                         tmk_root = ../..
34                 endif
35         endif
36 else
37         tmk_root = .
38 endif
39 # $(info $(KEYBOARD_DIR))
40 # $(info $(KEYMAP_DIR))
41 # $(info $(SUBPROJECT_DIR))
42
43 # Directory common source filess exist
44 TOP_DIR = $(tmk_root)
45 TMK_DIR = tmk_core
46 TMK_PATH = $(TOP_DIR)/$(TMK_DIR)
47 LIB_PATH = $(TOP_DIR)/lib
48
49 QUANTUM_DIR = quantum
50 QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR)
51
52
53 ifdef keyboard
54         KEYBOARD ?= $(keyboard)
55 endif
56 ifdef KEYBOARD_DIR
57         KEYBOARD ?= $(KEYBOARD_DIR)
58 endif
59 ifndef KEYBOARD
60         KEYBOARD=planck
61 endif
62
63 MASTER ?= left
64 ifdef master
65         MASTER = $(master)
66 endif
67
68
69 # converts things to keyboards/subproject
70 ifneq (,$(findstring /,$(KEYBOARD)))
71         TEMP:=$(KEYBOARD)
72         KEYBOARD:=$(firstword $(subst /, ,$(TEMP)))
73         SUBPROJECT:=$(lastword $(subst /, ,$(TEMP)))
74 endif
75
76 KEYBOARD_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD)
77
78 ifdef sub
79         SUBPROJECT=$(sub)
80 endif
81 ifdef subproject
82         SUBPROJECT=$(subproject)
83 endif
84
85 ifneq ("$(wildcard $(KEYBOARD_PATH)/$(KEYBOARD).c)","")
86         KEYBOARD_FILE = keyboards/$(KEYBOARD)/$(KEYBOARD).c
87         ifneq ($(call ESCAPED_ABS_PATH,$(KEYBOARD_PATH)/Makefile),$(starting_makefile))
88                 -include $(KEYBOARD_PATH)/Makefile
89         endif
90 else 
91 $(error "$(KEYBOARD_PATH)/$(KEYBOARD).c" does not exist)
92 endif
93
94 ifdef SUBPROJECT_DEFAULT
95         SUBPROJECT?=$(SUBPROJECT_DEFAULT)
96 endif
97
98 ifdef SUBPROJECT
99         SUBPROJECT_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)
100         ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","")
101                 OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT)
102                 SUBPROJECT_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/$(SUBPROJECT).c
103                 ifneq ($(call ESCAPED_ABS_PATH,$(SUBPROJECT_PATH)/Makefile),$(starting_makefile))
104                         -include $(SUBPROJECT_PATH)/Makefile
105                 endif
106         else 
107 $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist)
108         endif
109 endif
110
111 ifdef keymap
112         KEYMAP ?= $(keymap)
113 endif
114 ifdef KEYMAP_DIR
115         KEYMAP ?= $(KEYMAP_DIR)
116 endif
117 ifndef KEYMAP
118         KEYMAP = default
119 endif
120 KEYMAP_PATH = $(KEYBOARD_PATH)/keymaps/$(KEYMAP)
121 ifneq ("$(wildcard $(KEYMAP_PATH)/keymap.c)","")
122         KEYMAP_FILE = keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/keymap.c
123         ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile))
124                 -include $(KEYMAP_PATH)/Makefile
125         endif
126 else 
127         ifeq ("$(wildcard $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)/keymap.c)","")
128 $(error "$(KEYMAP_PATH)/keymap.c" does not exist)
129         else
130                 KEYMAP_PATH = $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)
131                 KEYMAP_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/$(KEYMAP)/keymap.c
132                 ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile))
133                         -include $(KEYMAP_PATH)/Makefile
134                 endif
135         endif
136 endif
137
138 ifdef SUBPROJECT
139         TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP)
140 else
141         TARGET ?= $(KEYBOARD)_$(KEYMAP)
142 endif
143
144 BUILD_DIR = $(TOP_DIR)/.build
145
146 # Object files directory
147 #     To put object files in current directory, use a dot (.), do NOT make
148 #     this an empty or blank macro!
149 OBJDIR = $(BUILD_DIR)/obj_$(TARGET)
150
151
152
153 ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
154         CONFIG_H = $(KEYMAP_PATH)/config.h
155 else
156         CONFIG_H = $(KEYBOARD_PATH)/config.h
157         ifdef SUBPROJECT
158                 ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","")
159                         CONFIG_H = $(SUBPROJECT_PATH)/config.h
160                 endif
161         endif
162 endif
163
164 # # project specific files
165 SRC += $(KEYBOARD_FILE) \
166         $(KEYMAP_FILE) \
167         $(QUANTUM_DIR)/quantum.c \
168         $(QUANTUM_DIR)/keymap_common.c \
169         $(QUANTUM_DIR)/keycode_config.c \
170         $(QUANTUM_DIR)/process_keycode/process_leader.c
171
172 ifdef SUBPROJECT
173         SRC += $(SUBPROJECT_FILE)
174 endif
175
176 ifdef SUBPROJECT
177         SRC += $(SUBPROJECT_FILE)
178 endif
179
180 ifdef SUBPROJECT
181         SRC += $(SUBPROJECT_FILE)
182 endif
183
184 ifndef CUSTOM_MATRIX
185         SRC += $(QUANTUM_DIR)/matrix.c
186 endif
187
188 ifeq ($(strip $(MIDI_ENABLE)), yes)
189     OPT_DEFS += -DMIDI_ENABLE
190         SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
191 endif
192
193 ifeq ($(strip $(VIRTSER_ENABLE)), yes)
194     OPT_DEFS += -DVIRTSER_ENABLE
195 endif
196
197 ifeq ($(strip $(AUDIO_ENABLE)), yes)
198     OPT_DEFS += -DAUDIO_ENABLE
199         SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
200         SRC += $(QUANTUM_DIR)/audio/audio.c
201         SRC += $(QUANTUM_DIR)/audio/voices.c
202         SRC += $(QUANTUM_DIR)/audio/luts.c
203 endif
204
205 ifeq ($(strip $(UCIS_ENABLE)), yes)
206         OPT_DEFS += -DUCIS_ENABLE
207         UNICODE_ENABLE = yes
208 endif
209
210 ifeq ($(strip $(UNICODE_ENABLE)), yes)
211     OPT_DEFS += -DUNICODE_ENABLE
212         SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
213 endif
214
215 ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
216         OPT_DEFS += -DRGBLIGHT_ENABLE
217         SRC += $(QUANTUM_DIR)/light_ws2812.c
218         SRC += $(QUANTUM_DIR)/rgblight.c
219 endif
220
221 ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
222         OPT_DEFS += -DTAP_DANCE_ENABLE
223         SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
224 endif
225
226 ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
227         SERIAL_DIR = $(QUANTUM_DIR)/serial_link
228         SERIAL_PATH = $(QUANTUM_PATH)/serial_link
229         SERIAL_SRC = $(wildcard $(SERIAL_PATH)/protocol/*.c)
230         SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
231         SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
232         OPT_DEFS += -DSERIAL_LINK_ENABLE
233         VAPTH += $(SERIAL_PATH)
234 endif
235
236 # Optimize size but this may cause error "relocation truncated to fit"
237 #EXTRALDFLAGS = -Wl,--relax
238
239 # Search Path
240 VPATH += $(KEYMAP_PATH)
241 ifdef SUBPROJECT
242         VPATH += $(SUBPROJECT_PATH)
243 endif
244 VPATH += $(KEYBOARD_PATH)
245 VPATH += $(TOP_DIR)
246 VPATH += $(TMK_PATH)
247 VPATH += $(QUANTUM_PATH)
248 VPATH += $(QUANTUM_PATH)/keymap_extras
249 VPATH += $(QUANTUM_PATH)/audio
250 VPATH += $(QUANTUM_PATH)/process_keycode
251
252
253 # We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA
254 ifdef MCU_FAMILY
255         PLATFORM=CHIBIOS
256 else
257         PLATFORM=AVR
258 endif
259
260 include $(TMK_PATH)/common.mk
261 ifeq ($(PLATFORM),AVR)
262         include $(TMK_PATH)/protocol/lufa.mk
263         include $(TMK_PATH)/avr.mk
264 else ifeq ($(PLATFORM),CHIBIOS)
265         include $(TMK_PATH)/protocol/chibios.mk
266         include $(TMK_PATH)/chibios.mk
267         OPT_OS = chibios
268 else
269         $(error Unknown platform)
270 endif
271
272 ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
273         VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
274         VISUALIZER_PATH = $(QUANTUM_PATH)/visualizer
275         include $(VISUALIZER_PATH)/visualizer.mk
276 endif
277
278 include $(TMK_PATH)/rules.mk
279
280 GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
281 BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
282 OPT_DEFS += -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\"
283
284 $(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(QUANTUM_PATH)/version.h)
285 $(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(QUANTUM_PATH)/version.h)