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