2016-08-08 01:16:06 +03:00
|
|
|
ifndef VERBOSE
|
|
|
|
.SILENT:
|
|
|
|
endif
|
|
|
|
|
2016-08-27 18:13:01 +03:00
|
|
|
# Never run this makefile in parallel, as it could screw things up
|
|
|
|
# It won't affect the submakes, so you still get the speedup from specifying -jx
|
|
|
|
.NOTPARALLEL:
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# Allow the silent with lower caps to work the same way as upper caps
|
2016-08-09 09:52:01 +03:00
|
|
|
ifdef silent
|
|
|
|
SILENT = $(silent)
|
|
|
|
endif
|
|
|
|
|
|
|
|
ifdef SILENT
|
2016-08-20 14:53:29 +03:00
|
|
|
SUB_IS_SILENT := $(SILENT)
|
2016-08-09 09:52:01 +03:00
|
|
|
endif
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# We need to make sure that silent is always turned off at the top level
|
2017-02-02 23:15:08 +09:00
|
|
|
# Otherwise the [OK], [ERROR] and [WARN] messages won't be displayed correctly
|
2016-08-20 14:53:29 +03:00
|
|
|
override SILENT := false
|
2016-08-09 09:52:01 +03:00
|
|
|
|
2017-08-10 18:54:14 -04:00
|
|
|
QMK_VERSION := $(shell git describe --abbrev=0 --tags 2>/dev/null)
|
|
|
|
ifneq ($(QMK_VERSION),)
|
2017-10-14 11:32:19 -10:00
|
|
|
$(info QMK Firmware $(QMK_VERSION))
|
2017-08-10 18:54:14 -04:00
|
|
|
endif
|
|
|
|
|
2017-02-02 23:15:08 +09:00
|
|
|
ON_ERROR := error_occurred=1
|
2016-08-16 08:42:08 +03:00
|
|
|
|
2017-04-09 20:04:12 +03:00
|
|
|
BREAK_ON_ERRORS = no
|
|
|
|
|
2016-08-01 09:23:37 +03:00
|
|
|
STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST))
|
|
|
|
ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST))
|
2016-08-07 18:30:58 +03:00
|
|
|
ROOT_DIR := $(dir $(ROOT_MAKEFILE))
|
2016-08-03 09:28:47 +03:00
|
|
|
ifeq ($(ROOT_DIR),)
|
|
|
|
ROOT_DIR := .
|
|
|
|
endif
|
2016-08-01 09:23:37 +03:00
|
|
|
ABS_STARTING_MAKEFILE := $(abspath $(STARTING_MAKEFILE))
|
|
|
|
ABS_ROOT_MAKEFILE := $(abspath $(ROOT_MAKEFILE))
|
|
|
|
ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE))
|
|
|
|
ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE))
|
|
|
|
STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR))
|
2016-10-30 17:03:01 +02:00
|
|
|
BUILD_DIR := $(ROOT_DIR)/.build
|
|
|
|
TEST_DIR := $(BUILD_DIR)/test
|
2017-02-02 23:15:08 +09:00
|
|
|
ERROR_FILE := $(BUILD_DIR)/error_occurred
|
2016-08-01 09:23:37 +03:00
|
|
|
|
2016-08-07 17:04:39 +03:00
|
|
|
MAKEFILE_INCLUDED=yes
|
2016-08-07 16:45:33 +03:00
|
|
|
|
2016-11-01 11:52:58 -05:00
|
|
|
# Helper function to process the newt element of a space separated path
|
2016-08-20 14:53:29 +03:00
|
|
|
# It works a bit like the traditional functional head tail
|
2017-02-02 23:15:08 +09:00
|
|
|
# so the CURRENT_PATH_ELEMENT will become the new head
|
2016-08-20 14:53:29 +03:00
|
|
|
# and the PATH_ELEMENTS are the rest that are still unprocessed
|
2016-08-01 09:23:37 +03:00
|
|
|
define NEXT_PATH_ELEMENT
|
|
|
|
$$(eval CURRENT_PATH_ELEMENT := $$(firstword $$(PATH_ELEMENTS)))
|
|
|
|
$$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS)))
|
|
|
|
endef
|
|
|
|
|
2016-11-01 11:52:58 -05:00
|
|
|
# We change the / to spaces so that we more easily can work with the elements
|
2016-08-20 14:53:29 +03:00
|
|
|
# separately
|
|
|
|
PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
|
|
|
|
# Initialize the path elements list for further processing
|
2016-08-01 09:23:37 +03:00
|
|
|
$(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
|
2016-11-01 11:52:58 -05:00
|
|
|
# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct
|
2016-08-20 14:53:29 +03:00
|
|
|
# variables depending on which directory you stand in.
|
2016-11-01 11:52:58 -05:00
|
|
|
# It's really a very simple if else chain, if you squint enough,
|
|
|
|
# but the makefile syntax makes it very verbose.
|
2016-08-20 14:53:29 +03:00
|
|
|
# If we are in a subfolder of keyboards
|
2017-10-14 11:32:19 -10:00
|
|
|
#
|
|
|
|
# *** No longer needed **
|
|
|
|
#
|
|
|
|
# ifeq ($(CURRENT_PATH_ELEMENT),keyboards)
|
|
|
|
# $(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
# KEYBOARD := $(CURRENT_PATH_ELEMENT)
|
|
|
|
# $(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
# # If we are in a subfolder of keymaps, or in other words in a keymap
|
|
|
|
# # folder
|
|
|
|
# ifeq ($(CURRENT_PATH_ELEMENT),keymaps)
|
|
|
|
# $(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
# KEYMAP := $(CURRENT_PATH_ELEMENT)
|
|
|
|
# # else if we are not in the keyboard folder itself
|
|
|
|
# else ifneq ($(CURRENT_PATH_ELEMENT),)
|
|
|
|
# # the we can assume it's a subproject, as no other folders
|
|
|
|
# # should have make files in them
|
|
|
|
# SUBPROJECT := $(CURRENT_PATH_ELEMENT)
|
|
|
|
# $(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
# # if we are inside a keymap folder of a subproject
|
|
|
|
# ifeq ($(CURRENT_PATH_ELEMENT),keymaps)
|
|
|
|
# $(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
# KEYMAP := $(CURRENT_PATH_ELEMENT)
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
# endif
|
|
|
|
|
|
|
|
define GET_KEYBOARDS
|
|
|
|
All_RULES_MK := $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/rules.mk))
|
|
|
|
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/rules.mk))
|
|
|
|
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/rules.mk))
|
|
|
|
All_RULES_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/*/rules.mk))
|
|
|
|
|
|
|
|
KEYMAPS_MK := $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/keymaps/*/rules.mk))
|
|
|
|
KEYMAPS_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/keymaps/*/rules.mk))
|
|
|
|
KEYMAPS_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/keymaps/*/rules.mk))
|
|
|
|
KEYMAPS_MK += $$(patsubst $(ROOT_DIR)/keyboards/%/rules.mk,%,$$(wildcard $(ROOT_DIR)/keyboards/*/*/*/*/keymaps/*/rules.mk))
|
|
|
|
|
|
|
|
KEYBOARDS := $$(sort $$(filter-out $$(KEYMAPS_MK), $$(All_RULES_MK)))
|
|
|
|
endef
|
|
|
|
|
|
|
|
$(eval $(call GET_KEYBOARDS))
|
2016-08-01 09:23:37 +03:00
|
|
|
|
2016-08-07 18:12:45 +03:00
|
|
|
# Only consider folders with makefiles, to prevent errors in case there are extra folders
|
2017-10-14 11:32:19 -10:00
|
|
|
#KEYBOARDS += $(patsubst $(ROOD_DIR)/keyboards/%/rules.mk,%,$(wildcard $(ROOT_DIR)/keyboards/*/*/rules.mk))
|
|
|
|
|
|
|
|
list-keyboards:
|
|
|
|
echo $(KEYBOARDS)
|
|
|
|
exit 0
|
2016-08-03 09:28:47 +03:00
|
|
|
|
2017-02-02 23:15:08 +09:00
|
|
|
#Compatibility with the old make variables, anything you specify directly on the command line
|
2016-08-20 14:53:29 +03:00
|
|
|
# always overrides the detected folders
|
2016-08-07 18:54:12 +03:00
|
|
|
ifdef keyboard
|
|
|
|
KEYBOARD := $(keyboard)
|
|
|
|
endif
|
|
|
|
ifdef keymap
|
|
|
|
KEYMAP := $(keymap)
|
|
|
|
endif
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# Uncomment these for debugging
|
2017-10-14 11:32:19 -10:00
|
|
|
# $(info Keyboard: $(KEYBOARD))
|
|
|
|
# $(info Keymap: $(KEYMAP))
|
|
|
|
# $(info Subproject: $(SUBPROJECT))
|
|
|
|
# $(info Keyboards: $(KEYBOARDS))
|
2016-08-03 09:28:47 +03:00
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
|
2017-02-02 23:15:08 +09:00
|
|
|
# Set the default goal depending on where we are running make from
|
2016-08-20 14:53:29 +03:00
|
|
|
# this handles the case where you run make without any arguments
|
2017-10-14 11:32:19 -10:00
|
|
|
.DEFAULT_GOAL := all:all
|
2016-08-07 19:16:44 +03:00
|
|
|
ifneq ($(KEYMAP),)
|
2017-10-14 11:32:19 -10:00
|
|
|
.DEFAULT_GOAL := $(KEYBOARD):$(KEYMAP)
|
2016-08-07 19:16:44 +03:00
|
|
|
else ifneq ($(KEYBOARD),)
|
2016-08-20 14:53:29 +03:00
|
|
|
# Inside a keyboard folder, build all keymaps for all subprojects
|
|
|
|
# Note that this is different from the old behaviour, which would
|
|
|
|
# build only the default keymap of the default keyboard
|
2017-10-14 11:32:19 -10:00
|
|
|
.DEFAULT_GOAL := $(KEYBOARD):all
|
2016-08-07 19:16:44 +03:00
|
|
|
endif
|
|
|
|
|
2016-08-01 09:23:37 +03:00
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# Compare the start of the RULE variable with the first argument($1)
|
2017-10-14 11:32:19 -10:00
|
|
|
# If the rules equals $1 or starts with $1:, RULE_FOUND is set to true
|
2016-08-03 08:44:11 +03:00
|
|
|
# and $1 is removed from the RULE variable
|
2016-08-20 14:53:29 +03:00
|
|
|
# Otherwise the RULE_FOUND variable is set to false, and RULE left as it was
|
2016-08-03 08:44:11 +03:00
|
|
|
# The function is a bit tricky, since there's no built in $(startswith) function
|
2016-08-07 15:56:41 +03:00
|
|
|
define COMPARE_AND_REMOVE_FROM_RULE_HELPER
|
2016-08-03 08:44:11 +03:00
|
|
|
ifeq ($1,$$(RULE))
|
|
|
|
RULE:=
|
|
|
|
RULE_FOUND := true
|
|
|
|
else
|
2017-10-14 11:32:19 -10:00
|
|
|
STARTCOLON_REMOVED=$$(subst START$1:,,START$$(RULE))
|
|
|
|
ifneq ($$(STARTCOLON_REMOVED),START$$(RULE))
|
2016-08-03 08:44:11 +03:00
|
|
|
RULE_FOUND := true
|
2017-10-14 11:32:19 -10:00
|
|
|
RULE := $$(STARTCOLON_REMOVED)
|
2016-08-03 08:44:11 +03:00
|
|
|
else
|
|
|
|
RULE_FOUND := false
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endef
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# This makes it easier to call COMPARE_AND_REMOVE_FROM_RULE, since it makes it behave like
|
|
|
|
# a function that returns the value
|
2016-08-07 15:56:41 +03:00
|
|
|
COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND)
|
|
|
|
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# Recursively try to find a match for the start of the rule to be checked
|
2016-08-04 09:17:02 +03:00
|
|
|
# $1 The list to be checked
|
|
|
|
# If a match is found, then RULE_FOUND is set to true
|
|
|
|
# and MATCHED_ITEM to the item that was matched
|
2016-08-21 13:10:34 +03:00
|
|
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
|
2016-08-07 14:33:49 +03:00
|
|
|
ifneq ($1,)
|
2016-08-07 15:56:41 +03:00
|
|
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
2016-08-07 14:33:49 +03:00
|
|
|
MATCHED_ITEM := $$(firstword $1)
|
2016-11-01 11:52:58 -05:00
|
|
|
else
|
2016-08-21 13:10:34 +03:00
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endef
|
|
|
|
|
|
|
|
# A recursive helper function for finding the longest match
|
2017-02-02 23:15:08 +09:00
|
|
|
# $1 The list to be checked
|
2016-11-01 11:52:58 -05:00
|
|
|
# It works by always removing the currently matched item from the list
|
2016-08-21 13:10:34 +03:00
|
|
|
# and call itself recursively, until a match is found
|
|
|
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
2016-11-01 11:52:58 -05:00
|
|
|
# Stop the recursion when the list is empty
|
2016-08-21 13:10:34 +03:00
|
|
|
ifneq ($1,)
|
|
|
|
RULE_BEFORE := $$(RULE)
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
|
|
|
# If a match is found in the current list, otherwise just return what we had before
|
|
|
|
ifeq ($$(RULE_FOUND),true)
|
2017-02-02 23:15:08 +09:00
|
|
|
# Save the best match so far and call itself recursively
|
2016-08-21 13:10:34 +03:00
|
|
|
BEST_MATCH := $$(MATCHED_ITEM)
|
|
|
|
BEST_MATCH_RULE := $$(RULE)
|
|
|
|
RULE_FOUND := false
|
|
|
|
RULE := $$(RULE_BEFORE)
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$$(filter-out $$(MATCHED_ITEM),$1)))
|
2016-08-07 14:33:49 +03:00
|
|
|
endif
|
2016-08-21 13:10:34 +03:00
|
|
|
endif
|
|
|
|
endef
|
|
|
|
|
|
|
|
|
|
|
|
# Recursively try to find the longest match for the start of the rule to be checked
|
|
|
|
# $1 The list to be checked
|
|
|
|
# If a match is found, then RULE_FOUND is set to true
|
|
|
|
# and MATCHED_ITEM to the item that was matched
|
|
|
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER
|
|
|
|
BEST_MATCH :=
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER2,$1))
|
|
|
|
ifneq ($$(BEST_MATCH),)
|
|
|
|
RULE_FOUND := true
|
|
|
|
RULE := $$(BEST_MATCH_RULE)
|
|
|
|
MATCHED_ITEM := $$(BEST_MATCH)
|
|
|
|
else
|
|
|
|
RULE_FOUND := false
|
|
|
|
MATCHED_ITEM :=
|
2016-08-04 09:17:02 +03:00
|
|
|
endif
|
|
|
|
endef
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST
|
2016-08-07 15:56:41 +03:00
|
|
|
TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND)
|
|
|
|
|
2016-08-04 09:56:03 +03:00
|
|
|
define ALL_IN_LIST_LOOP
|
|
|
|
OLD_RULE$1 := $$(RULE)
|
|
|
|
$$(eval $$(call $1,$$(ITEM$1)))
|
|
|
|
RULE := $$(OLD_RULE$1)
|
|
|
|
endef
|
|
|
|
|
|
|
|
define PARSE_ALL_IN_LIST
|
|
|
|
$$(foreach ITEM$1,$2,$$(eval $$(call ALL_IN_LIST_LOOP,$1)))
|
|
|
|
endef
|
2016-08-04 09:17:02 +03:00
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# The entry point for rule parsing
|
2017-10-14 11:32:19 -10:00
|
|
|
# parses a rule in the format <keyboard>:<keymap>:<target>
|
2016-08-20 14:53:29 +03:00
|
|
|
# but this particular function only deals with the first <keyboard> part
|
2016-08-07 16:02:14 +03:00
|
|
|
define PARSE_RULE
|
|
|
|
RULE := $1
|
|
|
|
COMMANDS :=
|
2017-10-14 11:32:19 -10:00
|
|
|
# If the rule starts with all, then continue the parsing from
|
2016-08-20 14:53:29 +03:00
|
|
|
# PARSE_ALL_KEYBOARDS
|
2017-10-14 11:32:19 -10:00
|
|
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
2016-08-07 16:02:14 +03:00
|
|
|
$$(eval $$(call PARSE_ALL_KEYBOARDS))
|
2016-08-21 16:29:54 +03:00
|
|
|
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,test),true)
|
|
|
|
$$(eval $$(call PARSE_TEST))
|
2016-08-20 14:53:29 +03:00
|
|
|
# If the rule starts with the name of a known keyboard, then continue
|
|
|
|
# the parsing from PARSE_KEYBOARD
|
2016-08-07 16:02:14 +03:00
|
|
|
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYBOARDS)),true)
|
|
|
|
$$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM)))
|
2016-08-20 14:53:29 +03:00
|
|
|
# Otherwise use the KEYBOARD variable, which is determined either by
|
|
|
|
# the current directory you run make from, or passed in as an argument
|
2016-08-07 18:30:58 +03:00
|
|
|
else ifneq ($$(KEYBOARD),)
|
|
|
|
$$(eval $$(call PARSE_KEYBOARD,$$(KEYBOARD)))
|
2016-08-07 18:15:45 +03:00
|
|
|
else
|
|
|
|
$$(info make: *** No rule to make target '$1'. Stop.)
|
2017-10-14 11:32:19 -10:00
|
|
|
$$(info |)
|
|
|
|
$$(info | QMK's make format recently changed to use folder locations and colons:)
|
|
|
|
$$(info | make project_folder:keymap[:target])
|
|
|
|
$$(info | Examples:)
|
|
|
|
$$(info | make planck/rev4:default:dfu)
|
|
|
|
$$(info | make planck:default)
|
|
|
|
$$(info |)
|
2016-08-07 16:02:14 +03:00
|
|
|
endif
|
2016-08-04 09:56:03 +03:00
|
|
|
endef
|
|
|
|
|
2016-08-07 16:02:14 +03:00
|
|
|
# $1 = Keyboard
|
2017-10-14 11:32:19 -10:00
|
|
|
# Parses a rule in the format <keymap>:<target>
|
2016-08-20 14:53:29 +03:00
|
|
|
# the keyboard is already known when entering this function
|
2016-08-07 16:02:14 +03:00
|
|
|
define PARSE_KEYBOARD
|
2017-10-14 11:32:19 -10:00
|
|
|
# If we want to compile the default subproject, then we need to
|
|
|
|
# include the correct makefile to determine the actual name of it
|
2016-08-07 16:02:14 +03:00
|
|
|
CURRENT_KB := $1
|
2017-10-14 11:32:19 -10:00
|
|
|
|
|
|
|
# KEYBOARD_FOLDERS := $$(subst /, , $(CURRENT_KB))
|
|
|
|
|
|
|
|
DEFAULT_FOLDER := $$(CURRENT_KB)
|
|
|
|
|
|
|
|
# We assume that every rules.mk will contain the full default value
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/rules.mk)
|
|
|
|
ifneq ($$(DEFAULT_FOLDER),$$(CURRENT_KB))
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(DEFAULT_FOLDER)/rules.mk)
|
|
|
|
endif
|
|
|
|
CURRENT_KB := $$(DEFAULT_FOLDER)
|
|
|
|
|
|
|
|
# 5/4/3/2/1
|
|
|
|
KEYBOARD_FOLDER_PATH_1 := $$(CURRENT_KB)
|
|
|
|
KEYBOARD_FOLDER_PATH_2 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_1)))
|
|
|
|
KEYBOARD_FOLDER_PATH_3 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_2)))
|
|
|
|
KEYBOARD_FOLDER_PATH_4 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_3)))
|
|
|
|
KEYBOARD_FOLDER_PATH_5 := $$(patsubst %/,%,$$(dir $$(KEYBOARD_FOLDER_PATH_4)))
|
|
|
|
KEYBOARD_FOLDER_1 := $$(notdir $$(KEYBOARD_FOLDER_PATH_1))
|
|
|
|
KEYBOARD_FOLDER_2 := $$(notdir $$(KEYBOARD_FOLDER_PATH_2))
|
|
|
|
KEYBOARD_FOLDER_3 := $$(notdir $$(KEYBOARD_FOLDER_PATH_3))
|
|
|
|
KEYBOARD_FOLDER_4 := $$(notdir $$(KEYBOARD_FOLDER_PATH_4))
|
|
|
|
KEYBOARD_FOLDER_5 := $$(notdir $$(KEYBOARD_FOLDER_PATH_5))
|
|
|
|
|
|
|
|
KEYMAPS :=
|
|
|
|
# get a list of all keymaps
|
|
|
|
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_1)/keymaps/*/.)))
|
|
|
|
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_2)/keymaps/*/.)))
|
|
|
|
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_3)/keymaps/*/.)))
|
|
|
|
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_4)/keymaps/*/.)))
|
|
|
|
KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_PATH_5)/keymaps/*/.)))
|
2017-10-15 16:54:06 -04:00
|
|
|
# this might be needed, but in a different form
|
2017-10-15 16:44:31 -04:00
|
|
|
#KEYMAPS := $$(sort $$(filter-out $$(KEYBOARD_FOLDER_1) $$(KEYBOARD_FOLDER_2) \
|
2017-10-14 11:32:19 -10:00
|
|
|
$$(KEYBOARD_FOLDER_3) $$(KEYBOARD_FOLDER_4) $$(KEYBOARD_FOLDER_5), $$(KEYMAPS)))
|
|
|
|
|
|
|
|
KEYBOARD_LAYOUTS :=
|
|
|
|
ifneq ("$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_5)/rules.mk)","")
|
|
|
|
LAYOUTS :=
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_5)/rules.mk)
|
|
|
|
KEYBOARD_LAYOUTS := $$(sort $$(LAYOUTS) $$(KEYBOARD_LAYOUTS))
|
|
|
|
endif
|
|
|
|
ifneq ("$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_4)/rules.mk)","")
|
|
|
|
LAYOUTS :=
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_4)/rules.mk)
|
|
|
|
KEYBOARD_LAYOUTS := $$(sort $$(LAYOUTS) $$(KEYBOARD_LAYOUTS))
|
|
|
|
endif
|
|
|
|
ifneq ("$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_3)/rules.mk)","")
|
|
|
|
LAYOUTS :=
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_3)/rules.mk)
|
|
|
|
KEYBOARD_LAYOUTS := $$(sort $$(LAYOUTS) $$(KEYBOARD_LAYOUTS))
|
|
|
|
endif
|
|
|
|
ifneq ("$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_2)/rules.mk)","")
|
|
|
|
LAYOUTS :=
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_2)/rules.mk)
|
|
|
|
KEYBOARD_LAYOUTS := $$(sort $$(LAYOUTS) $$(KEYBOARD_LAYOUTS))
|
|
|
|
endif
|
|
|
|
ifneq ("$$(wildcard $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_1)/rules.mk)","")
|
|
|
|
LAYOUTS :=
|
|
|
|
$$(eval include $(ROOT_DIR)/keyboards/$$(KEYBOARD_FOLDER_1)/rules.mk)
|
|
|
|
KEYBOARD_LAYOUTS := $$(sort $$(LAYOUTS) $$(KEYBOARD_LAYOUTS))
|
|
|
|
endif
|
|
|
|
|
|
|
|
LAYOUT_KEYMAPS :=
|
|
|
|
$$(foreach LAYOUT,$$(KEYBOARD_LAYOUTS),$$(eval LAYOUT_KEYMAPS += $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/layouts/*/$$(LAYOUT)/*/.)))))
|
|
|
|
|
|
|
|
KEYMAPS := $$(sort $$(KEYMAPS) $$(LAYOUT_KEYMAPS))
|
|
|
|
|
|
|
|
# if the rule after removing the start of it is empty (we haven't specified a kemap or target)
|
|
|
|
# compile all the keymaps
|
|
|
|
ifeq ($$(RULE),)
|
|
|
|
$$(eval $$(call PARSE_ALL_KEYMAPS))
|
|
|
|
# The same if all was specified
|
|
|
|
else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,all),true)
|
|
|
|
$$(eval $$(call PARSE_ALL_KEYMAPS))
|
|
|
|
# Try to match the specified keyamp with the list of known keymaps
|
|
|
|
else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYMAPS)),true)
|
|
|
|
$$(eval $$(call PARSE_KEYMAP,$$(MATCHED_ITEM)))
|
|
|
|
# Otherwise try to match the keymap from the current folder, or arguments to the make command
|
|
|
|
else ifneq ($$(KEYMAP),)
|
|
|
|
$$(eval $$(call PARSE_KEYMAP,$$(KEYMAP)))
|
|
|
|
# Otherwise, make all keymaps, again this is consistent with how it works without
|
|
|
|
# any arguments
|
2016-11-01 11:52:58 -05:00
|
|
|
else
|
2017-10-14 11:32:19 -10:00
|
|
|
$$(eval $$(call PARSE_ALL_KEYMAPS))
|
2016-08-07 16:02:14 +03:00
|
|
|
endif
|
2016-08-03 08:44:11 +03:00
|
|
|
endef
|
|
|
|
|
2016-08-20 14:53:29 +03:00
|
|
|
# if we are going to compile all keyboards, match the rest of the rule
|
|
|
|
# for each of them
|
2016-08-07 16:02:14 +03:00
|
|
|
define PARSE_ALL_KEYBOARDS
|
|
|
|
$$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(KEYBOARDS)))
|
2016-08-07 14:33:49 +03:00
|
|
|
endef
|
|
|
|
|
|
|
|
# $1 Subproject
|
2016-08-20 14:53:29 +03:00
|
|
|
# When entering this, the keyboard and subproject are known, so now we need
|
|
|
|
# to determine which keymaps are going to get compiled
|
2017-10-14 11:32:19 -10:00
|
|
|
# define PARSE_SUBPROJECT
|
2017-08-23 22:29:07 -04:00
|
|
|
|
2017-10-14 11:32:19 -10:00
|
|
|
# endef
|
2016-08-04 08:49:44 +03:00
|
|
|
|
2016-11-01 11:52:58 -05:00
|
|
|
# If we want to parse all subprojects, but the keyboard doesn't have any,
|
2016-08-20 14:53:29 +03:00
|
|
|
# then use defaultsp instead
|
2017-10-14 11:32:19 -10:00
|
|
|
# define PARSE_ALL_SUBPROJECTS
|
|
|
|
# ifeq ($$(SUBPROJECTS),)
|
|
|
|
# $$(eval $$(call PARSE_SUBPROJECT,defaultsp))
|
|
|
|
# else
|
|
|
|
# $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_SUBPROJECT,$$(SUBPROJECTS)))
|
|
|
|
# endif
|
|
|
|
# endef
|
2016-08-07 14:33:49 +03:00
|
|