build_keyboard.mk 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  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. ifndef VERBOSE
  7. .SILENT:
  8. endif
  9. .DEFAULT_GOAL := all
  10. include paths.mk
  11. include $(BUILDDEFS_PATH)/message.mk
  12. # Helper to add defines with a 'QMK_' prefix
  13. define add_qmk_prefix_defs
  14. ifdef $1
  15. # Need to cater for 'STM32L4xx+'
  16. OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
  17. endif
  18. endef
  19. # Set the qmk cli to use
  20. QMK_BIN ?= qmk
  21. # Set the filename for the final firmware binary
  22. KEYBOARD_FILESAFE := $(subst /,_,$(KEYBOARD))
  23. TARGET ?= $(KEYBOARD_FILESAFE)_$(KEYMAP)
  24. ifeq ($(strip $(DUMP_CI_METADATA)),yes)
  25. $(info CI Metadata: KEYBOARD=$(KEYBOARD))
  26. $(info CI Metadata: KEYMAP=$(KEYMAP))
  27. endif
  28. # Force expansion
  29. TARGET := $(TARGET)
  30. ifneq ($(FORCE_LAYOUT),)
  31. TARGET := $(TARGET)_$(FORCE_LAYOUT)
  32. endif
  33. # Object files and generated keymap directory
  34. # To put object files in current directory, use a dot (.), do NOT make
  35. # this an empty or blank macro!
  36. INTERMEDIATE_OUTPUT := $(BUILD_DIR)/obj_$(TARGET)
  37. ifdef SKIP_VERSION
  38. OPT_DEFS += -DSKIP_VERSION
  39. endif
  40. # Generate the version.h file
  41. VERSION_H_FLAGS :=
  42. ifdef SKIP_VERSION
  43. VERSION_H_FLAGS += --skip-all
  44. endif
  45. ifdef SKIP_GIT
  46. VERSION_H_FLAGS += --skip-git
  47. endif
  48. # Generate the board's version.h file.
  49. $(shell $(QMK_BIN) generate-version-h $(VERSION_H_FLAGS) -q -o $(INTERMEDIATE_OUTPUT)/src/version.h)
  50. # Determine which subfolders exist.
  51. KEYBOARD_FOLDER_PATH_1 := $(KEYBOARD)
  52. KEYBOARD_FOLDER_PATH_2 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_1)))
  53. KEYBOARD_FOLDER_PATH_3 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_2)))
  54. KEYBOARD_FOLDER_PATH_4 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_3)))
  55. KEYBOARD_FOLDER_PATH_5 := $(patsubst %/,%,$(dir $(KEYBOARD_FOLDER_PATH_4)))
  56. KEYBOARD_FOLDER_1 := $(notdir $(KEYBOARD_FOLDER_PATH_1))
  57. KEYBOARD_FOLDER_2 := $(notdir $(KEYBOARD_FOLDER_PATH_2))
  58. KEYBOARD_FOLDER_3 := $(notdir $(KEYBOARD_FOLDER_PATH_3))
  59. KEYBOARD_FOLDER_4 := $(notdir $(KEYBOARD_FOLDER_PATH_4))
  60. KEYBOARD_FOLDER_5 := $(notdir $(KEYBOARD_FOLDER_PATH_5))
  61. KEYBOARD_PATHS :=
  62. KEYBOARD_PATH_1 := keyboards/$(KEYBOARD_FOLDER_PATH_1)
  63. KEYBOARD_PATH_2 := keyboards/$(KEYBOARD_FOLDER_PATH_2)
  64. KEYBOARD_PATH_3 := keyboards/$(KEYBOARD_FOLDER_PATH_3)
  65. KEYBOARD_PATH_4 := keyboards/$(KEYBOARD_FOLDER_PATH_4)
  66. KEYBOARD_PATH_5 := keyboards/$(KEYBOARD_FOLDER_PATH_5)
  67. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
  68. KEYBOARD_PATHS += $(KEYBOARD_PATH_5)
  69. endif
  70. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
  71. KEYBOARD_PATHS += $(KEYBOARD_PATH_4)
  72. endif
  73. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
  74. KEYBOARD_PATHS += $(KEYBOARD_PATH_3)
  75. endif
  76. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
  77. KEYBOARD_PATHS += $(KEYBOARD_PATH_2)
  78. endif
  79. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
  80. KEYBOARD_PATHS += $(KEYBOARD_PATH_1)
  81. endif
  82. # Pull in rules.mk files from all our subfolders
  83. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
  84. include $(KEYBOARD_PATH_5)/rules.mk
  85. endif
  86. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
  87. include $(KEYBOARD_PATH_4)/rules.mk
  88. endif
  89. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
  90. include $(KEYBOARD_PATH_3)/rules.mk
  91. endif
  92. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
  93. include $(KEYBOARD_PATH_2)/rules.mk
  94. endif
  95. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
  96. include $(KEYBOARD_PATH_1)/rules.mk
  97. endif
  98. MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
  99. MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
  100. MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
  101. MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
  102. MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
  103. # Pull in rules from DD keyboard config
  104. INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk)
  105. include $(INFO_RULES_MK)
  106. # Check for keymap.json first, so we can regenerate keymap.c
  107. include $(BUILDDEFS_PATH)/build_json.mk
  108. # Pull in keymap level rules.mk
  109. ifeq ("$(wildcard $(KEYMAP_PATH))", "")
  110. # Look through the possible keymap folders until we find a matching keymap.c
  111. ifneq ($(QMK_USERSPACE),)
  112. ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c)","")
  113. -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/rules.mk
  114. KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)/keymap.c
  115. KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_1)
  116. else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c)","")
  117. -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/rules.mk
  118. KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)/keymap.c
  119. KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_2)
  120. else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c)","")
  121. -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/rules.mk
  122. KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)/keymap.c
  123. KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_3)
  124. else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c)","")
  125. -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/rules.mk
  126. KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)/keymap.c
  127. KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_4)
  128. else ifneq ("$(wildcard $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c)","")
  129. -include $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/rules.mk
  130. KEYMAP_C := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)/keymap.c
  131. KEYMAP_PATH := $(QMK_USERSPACE)/$(MAIN_KEYMAP_PATH_5)
  132. endif
  133. endif
  134. ifeq ($(KEYMAP_PATH),)
  135. ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.c)","")
  136. -include $(MAIN_KEYMAP_PATH_1)/rules.mk
  137. KEYMAP_C := $(MAIN_KEYMAP_PATH_1)/keymap.c
  138. KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
  139. else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_2)/keymap.c)","")
  140. -include $(MAIN_KEYMAP_PATH_2)/rules.mk
  141. KEYMAP_C := $(MAIN_KEYMAP_PATH_2)/keymap.c
  142. KEYMAP_PATH := $(MAIN_KEYMAP_PATH_2)
  143. else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_3)/keymap.c)","")
  144. -include $(MAIN_KEYMAP_PATH_3)/rules.mk
  145. KEYMAP_C := $(MAIN_KEYMAP_PATH_3)/keymap.c
  146. KEYMAP_PATH := $(MAIN_KEYMAP_PATH_3)
  147. else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_4)/keymap.c)","")
  148. -include $(MAIN_KEYMAP_PATH_4)/rules.mk
  149. KEYMAP_C := $(MAIN_KEYMAP_PATH_4)/keymap.c
  150. KEYMAP_PATH := $(MAIN_KEYMAP_PATH_4)
  151. else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_5)/keymap.c)","")
  152. -include $(MAIN_KEYMAP_PATH_5)/rules.mk
  153. KEYMAP_C := $(MAIN_KEYMAP_PATH_5)/keymap.c
  154. KEYMAP_PATH := $(MAIN_KEYMAP_PATH_5)
  155. else ifneq ($(LAYOUTS),)
  156. # If we haven't found a keymap yet fall back to community layouts
  157. include $(BUILDDEFS_PATH)/build_layout.mk
  158. else ifeq ("$(wildcard $(KEYMAP_JSON_PATH))", "") # Not finding keymap.c is fine if we found a keymap.json
  159. $(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
  160. # this state should never be reached
  161. endif
  162. endif
  163. endif
  164. # Have we found a keymap.json?
  165. ifneq ("$(wildcard $(KEYMAP_JSON))", "")
  166. ifneq ("$(wildcard $(KEYMAP_C))", "")
  167. $(call WARNING_MESSAGE,Keymap is specified as both keymap.json and keymap.c -- keymap.json file wins.)
  168. endif
  169. KEYMAP_PATH := $(KEYMAP_JSON_PATH)
  170. KEYMAP_C := $(INTERMEDIATE_OUTPUT)/src/keymap.c
  171. KEYMAP_H := $(INTERMEDIATE_OUTPUT)/src/config.h
  172. # Load the keymap-level rules.mk if exists
  173. -include $(KEYMAP_PATH)/rules.mk
  174. # Load any rules.mk content from keymap.json
  175. INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/rules.mk $(KEYMAP_JSON))
  176. include $(INFO_RULES_MK)
  177. # Add rules to generate the keymap files - indentation here is important
  178. $(INTERMEDIATE_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
  179. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  180. $(eval CMD=$(QMK_BIN) json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON))
  181. @$(BUILD_CMD)
  182. $(INTERMEDIATE_OUTPUT)/src/config.h: $(KEYMAP_JSON)
  183. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  184. $(eval CMD=$(QMK_BIN) generate-config-h --quiet --output $(KEYMAP_H) $(KEYMAP_JSON))
  185. @$(BUILD_CMD)
  186. generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/keymap.c
  187. endif
  188. include $(BUILDDEFS_PATH)/converters.mk
  189. MCU_ORIG := $(MCU)
  190. include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk)
  191. # PLATFORM_KEY should be detected in DD keyboard config via key 'processor' (or rules.mk 'MCU')
  192. ifeq ($(PLATFORM_KEY),)
  193. $(call CATASTROPHIC_ERROR,Platform not defined)
  194. endif
  195. PLATFORM=$(shell echo $(PLATFORM_KEY) | tr '[:lower:]' '[:upper:]')
  196. # Find all the C source files to be compiled in subfolders.
  197. KEYBOARD_SRC :=
  198. KEYBOARD_C_1 := $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).c
  199. KEYBOARD_C_2 := $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).c
  200. KEYBOARD_C_3 := $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).c
  201. KEYBOARD_C_4 := $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).c
  202. KEYBOARD_C_5 := $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).c
  203. ifneq ("$(wildcard $(KEYBOARD_C_5))","")
  204. KEYBOARD_SRC += $(KEYBOARD_C_5)
  205. endif
  206. ifneq ("$(wildcard $(KEYBOARD_C_4))","")
  207. KEYBOARD_SRC += $(KEYBOARD_C_4)
  208. endif
  209. ifneq ("$(wildcard $(KEYBOARD_C_3))","")
  210. KEYBOARD_SRC += $(KEYBOARD_C_3)
  211. endif
  212. ifneq ("$(wildcard $(KEYBOARD_C_2))","")
  213. KEYBOARD_SRC += $(KEYBOARD_C_2)
  214. endif
  215. ifneq ("$(wildcard $(KEYBOARD_C_1))","")
  216. KEYBOARD_SRC += $(KEYBOARD_C_1)
  217. endif
  218. # Generate KEYBOARD_name_subname for all levels of the keyboard folder
  219. KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1)))
  220. KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2)))
  221. KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3)))
  222. KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4)))
  223. KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5)))
  224. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","")
  225. OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5)
  226. endif
  227. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","")
  228. OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4)
  229. endif
  230. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","")
  231. OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3)
  232. endif
  233. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","")
  234. OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2)
  235. endif
  236. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","")
  237. OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1)
  238. endif
  239. # Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so
  240. # that the same keymap may be used on multiple keyboards.
  241. #
  242. # We grab the most top-level include file that we can. That file should
  243. # use #ifdef statements to include all the necessary subfolder includes,
  244. # as described here:
  245. #
  246. # https://docs.qmk.fm/#/feature_layouts?id=tips-for-making-layouts-keyboard-agnostic
  247. #
  248. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/$(KEYBOARD_FOLDER_1).h)","")
  249. FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_1).h
  250. endif
  251. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/$(KEYBOARD_FOLDER_2).h)","")
  252. FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_2).h
  253. endif
  254. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/$(KEYBOARD_FOLDER_3).h)","")
  255. FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_3).h
  256. endif
  257. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/$(KEYBOARD_FOLDER_4).h)","")
  258. FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_4).h
  259. endif
  260. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/$(KEYBOARD_FOLDER_5).h)","")
  261. FOUND_KEYBOARD_H = $(KEYBOARD_FOLDER_5).h
  262. endif
  263. # Find all of the config.h files and add them to our CONFIG_H define.
  264. CONFIG_H :=
  265. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/config.h)","")
  266. CONFIG_H += $(KEYBOARD_PATH_5)/config.h
  267. endif
  268. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/config.h)","")
  269. CONFIG_H += $(KEYBOARD_PATH_4)/config.h
  270. endif
  271. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/config.h)","")
  272. CONFIG_H += $(KEYBOARD_PATH_3)/config.h
  273. endif
  274. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/config.h)","")
  275. CONFIG_H += $(KEYBOARD_PATH_2)/config.h
  276. endif
  277. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/config.h)","")
  278. CONFIG_H += $(KEYBOARD_PATH_1)/config.h
  279. endif
  280. POST_CONFIG_H :=
  281. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_config.h)","")
  282. POST_CONFIG_H += $(KEYBOARD_PATH_1)/post_config.h
  283. endif
  284. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_config.h)","")
  285. POST_CONFIG_H += $(KEYBOARD_PATH_2)/post_config.h
  286. endif
  287. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_config.h)","")
  288. POST_CONFIG_H += $(KEYBOARD_PATH_3)/post_config.h
  289. endif
  290. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_config.h)","")
  291. POST_CONFIG_H += $(KEYBOARD_PATH_4)/post_config.h
  292. endif
  293. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
  294. POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
  295. endif
  296. # Create dependencies on DD keyboard config - structure validated elsewhere
  297. DD_CONFIG_FILES :=
  298. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
  299. DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
  300. endif
  301. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
  302. DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
  303. endif
  304. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
  305. DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
  306. endif
  307. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
  308. DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
  309. endif
  310. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
  311. DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
  312. endif
  313. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
  314. DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
  315. endif
  316. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
  317. DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
  318. endif
  319. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
  320. DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
  321. endif
  322. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
  323. DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
  324. endif
  325. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
  326. DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
  327. endif
  328. CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
  329. KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
  330. $(INTERMEDIATE_OUTPUT)/src/info_config.h: $(DD_CONFIG_FILES)
  331. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  332. $(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_config.h)
  333. @$(BUILD_CMD)
  334. $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c: $(DD_CONFIG_FILES)
  335. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  336. $(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c)
  337. @$(BUILD_CMD)
  338. $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h: $(DD_CONFIG_FILES)
  339. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  340. $(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h)
  341. @$(BUILD_CMD)
  342. generated-files: $(INTERMEDIATE_OUTPUT)/src/info_config.h $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h
  343. generated-files: $(INTERMEDIATE_OUTPUT)/src/info_deps.d
  344. $(INTERMEDIATE_OUTPUT)/src/info_deps.d:
  345. @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
  346. $(eval CMD=$(QMK_BIN) generate-make-dependencies -kb $(KEYBOARD) -km $(KEYMAP) -o $(INTERMEDIATE_OUTPUT)/src/info_deps.d)
  347. @$(BUILD_CMD)
  348. -include $(INTERMEDIATE_OUTPUT)/src/info_deps.d
  349. .INTERMEDIATE : generated-files
  350. # Userspace setup and definitions
  351. ifeq ("$(USER_NAME)","")
  352. USER_NAME := $(KEYMAP)
  353. endif
  354. USER_PATH := users/$(USER_NAME)
  355. # If we have userspace, then add it to the lookup VPATH
  356. ifneq ($(wildcard $(QMK_USERSPACE)),)
  357. VPATH += $(QMK_USERSPACE)
  358. endif
  359. # If the equivalent users directory exists in userspace, use that in preference to anything currently in the main repo
  360. ifneq ($(wildcard $(QMK_USERSPACE)/$(USER_PATH)),)
  361. USER_PATH := $(QMK_USERSPACE)/$(USER_PATH)
  362. endif
  363. # Pull in user level rules.mk
  364. -include $(USER_PATH)/rules.mk
  365. ifneq ("$(wildcard $(USER_PATH)/config.h)","")
  366. CONFIG_H += $(USER_PATH)/config.h
  367. endif
  368. ifneq ("$(wildcard $(USER_PATH)/post_config.h)","")
  369. POST_CONFIG_H += $(USER_PATH)/post_config.h
  370. endif
  371. # Disable features that a keyboard doesn't support
  372. -include $(BUILDDEFS_PATH)/disable_features.mk
  373. ifneq ("$(CONVERTER)","")
  374. -include $(CONVERTER)/post_converter.mk
  375. endif
  376. # Pull in post_rules.mk files from all our subfolders
  377. ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","")
  378. include $(KEYBOARD_PATH_1)/post_rules.mk
  379. endif
  380. ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","")
  381. include $(KEYBOARD_PATH_2)/post_rules.mk
  382. endif
  383. ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
  384. include $(KEYBOARD_PATH_3)/post_rules.mk
  385. endif
  386. ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","")
  387. include $(KEYBOARD_PATH_4)/post_rules.mk
  388. endif
  389. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","")
  390. include $(KEYBOARD_PATH_5)/post_rules.mk
  391. endif
  392. ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
  393. CONFIG_H += $(KEYMAP_PATH)/config.h
  394. endif
  395. ifneq ("$(KEYMAP_H)","")
  396. CONFIG_H += $(KEYMAP_H)
  397. endif
  398. ifeq ($(KEYMAP_C),)
  399. $(call CATASTROPHIC_ERROR,Invalid keymap,Could not find keymap)
  400. endif
  401. OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
  402. # If a keymap or userspace places their keymap array in another file instead, allow for it to be included
  403. # !!NOTE!! -- For this to work, the source file cannot be part of $(SRC), so users should not add it via `SRC += <file>`
  404. ifneq ($(strip $(INTROSPECTION_KEYMAP_C)),)
  405. OPT_DEFS += -DINTROSPECTION_KEYMAP_C=\"$(strip $(INTROSPECTION_KEYMAP_C))\"
  406. endif
  407. # project specific files
  408. SRC += \
  409. $(KEYBOARD_SRC) \
  410. $(QUANTUM_DIR)/keymap_introspection.c \
  411. $(QUANTUM_SRC) \
  412. $(QUANTUM_DIR)/main.c \
  413. # Optimize size but this may cause error "relocation truncated to fit"
  414. #EXTRALDFLAGS = -Wl,--relax
  415. # Search Path
  416. VPATH += $(KEYMAP_PATH)
  417. VPATH += $(USER_PATH)
  418. VPATH += $(KEYBOARD_PATHS)
  419. VPATH += $(COMMON_VPATH)
  420. VPATH += $(INTERMEDIATE_OUTPUT)/src
  421. include $(BUILDDEFS_PATH)/common_features.mk
  422. include $(BUILDDEFS_PATH)/generic_features.mk
  423. include $(TMK_PATH)/protocol.mk
  424. include $(PLATFORM_PATH)/common.mk
  425. SRC += $(patsubst %.c,%.clib,$(LIB_SRC))
  426. SRC += $(patsubst %.c,%.clib,$(QUANTUM_LIB_SRC))
  427. -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/bootloader.mk
  428. include $(PLATFORM_PATH)/$(PLATFORM_KEY)/platform.mk
  429. -include $(PLATFORM_PATH)/$(PLATFORM_KEY)/flash.mk
  430. ifneq ($(strip $(PROTOCOL)),)
  431. PROTOCOL_KEY = $(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]'))
  432. else
  433. PROTOCOL_KEY = $(PLATFORM_KEY)
  434. endif
  435. include $(TMK_PATH)/protocol/$(PROTOCOL_KEY)/$(PROTOCOL_KEY).mk
  436. # Setup definitions based on the selected MCU
  437. $(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
  438. $(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
  439. $(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
  440. $(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
  441. $(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
  442. $(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
  443. $(eval $(call add_qmk_prefix_defs,OPT,OPT))
  444. # Control whether intermediate file listings are generated
  445. # e.g.:
  446. # make handwired/onekey/blackpill_f411:default KEEP_INTERMEDIATES=yes
  447. # cat .build/obj_handwired_onekey_blackpill_f411_default/quantum/quantum.i | sed -e 's@^#.*@@g' -e 's@^\s*//.*@@g' -e '/^\s*$/d' | clang-format
  448. ifeq ($(strip $(KEEP_INTERMEDIATES)), yes)
  449. OPT_DEFS += -save-temps=obj
  450. endif
  451. OUTPUTS := $(INTERMEDIATE_OUTPUT)
  452. $(INTERMEDIATE_OUTPUT)_SRC := $(SRC) $(PLATFORM_SRC)
  453. $(INTERMEDIATE_OUTPUT)_DEFS := \
  454. -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYBOARD_H=\"$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h\" \
  455. -DQMK_KEYMAP=\"$(KEYMAP)\" -DQMK_KEYMAP_H=\"$(KEYMAP).h\" -DQMK_KEYMAP_CONFIG_H=\"$(KEYMAP_PATH)/config.h\" \
  456. $(OPT_DEFS)
  457. $(INTERMEDIATE_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
  458. $(INTERMEDIATE_OUTPUT)_CONFIG := $(CONFIG_H) $(POST_CONFIG_H)
  459. # Default target.
  460. all: build check-size
  461. build: elf cpfirmware
  462. check-size: build
  463. check-md5: build
  464. objs-size: build
  465. ifneq ($(strip $(TOP_SYMBOLS)),)
  466. ifeq ($(strip $(TOP_SYMBOLS)),yes)
  467. NUM_TOP_SYMBOLS := 10
  468. else
  469. NUM_TOP_SYMBOLS := $(strip $(TOP_SYMBOLS))
  470. endif
  471. all: top-symbols
  472. check-size: top-symbols
  473. top-symbols: build
  474. echo "###########################################"
  475. echo "# Highest flash usage:"
  476. $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [RrTt] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
  477. echo "###########################################"
  478. echo "# Highest RAM usage:"
  479. $(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep ' [BbCDdGgSs] ' | head -n$(NUM_TOP_SYMBOLS) | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
  480. echo "###########################################"
  481. endif
  482. include $(BUILDDEFS_PATH)/show_options.mk
  483. include $(BUILDDEFS_PATH)/common_rules.mk
  484. # Ensure we have generated files available for each of the objects
  485. define GEN_FILES
  486. $1: generated-files
  487. endef
  488. $(foreach O,$(OBJ),$(eval $(call GEN_FILES,$(patsubst %.a,%.o,$(O)))))