|
|
@ -38,7 +38,7 @@ ERROR_FILE := $(BUILD_DIR)/error_occured
|
|
|
|
|
|
|
|
|
|
|
|
MAKEFILE_INCLUDED=yes
|
|
|
|
MAKEFILE_INCLUDED=yes
|
|
|
|
|
|
|
|
|
|
|
|
# Helper function to process the newt element of a space separated path
|
|
|
|
# Helper function to process the newt element of a space separated path
|
|
|
|
# It works a bit like the traditional functional head tail
|
|
|
|
# It works a bit like the traditional functional head tail
|
|
|
|
# so the CURRENT_PATH_ELEMENT will beome the new head
|
|
|
|
# so the CURRENT_PATH_ELEMENT will beome the new head
|
|
|
|
# and the PATH_ELEMENTS are the rest that are still unprocessed
|
|
|
|
# and the PATH_ELEMENTS are the rest that are still unprocessed
|
|
|
@ -47,16 +47,16 @@ define NEXT_PATH_ELEMENT
|
|
|
|
$$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS)))
|
|
|
|
$$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS)))
|
|
|
|
endef
|
|
|
|
endef
|
|
|
|
|
|
|
|
|
|
|
|
# We change the / to spaces so that we more easily can work with the elements
|
|
|
|
# We change the / to spaces so that we more easily can work with the elements
|
|
|
|
# separately
|
|
|
|
# separately
|
|
|
|
PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
|
|
|
|
PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR))
|
|
|
|
# Initialize the path elements list for further processing
|
|
|
|
# Initialize the path elements list for further processing
|
|
|
|
$(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
$(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
|
|
|
|
|
|
|
|
# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct
|
|
|
|
# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct
|
|
|
|
# variables depending on which directory you stand in.
|
|
|
|
# variables depending on which directory you stand in.
|
|
|
|
# It's really a very simple if else chain, if you squint enough,
|
|
|
|
# It's really a very simple if else chain, if you squint enough,
|
|
|
|
# but the makefile syntax makes it very verbose.
|
|
|
|
# but the makefile syntax makes it very verbose.
|
|
|
|
# If we are in a subfolder of keyboards
|
|
|
|
# If we are in a subfolder of keyboards
|
|
|
|
ifeq ($(CURRENT_PATH_ELEMENT),keyboards)
|
|
|
|
ifeq ($(CURRENT_PATH_ELEMENT),keyboards)
|
|
|
|
$(eval $(call NEXT_PATH_ELEMENT))
|
|
|
|
$(eval $(call NEXT_PATH_ELEMENT))
|
|
|
@ -111,7 +111,7 @@ endif
|
|
|
|
.DEFAULT_GOAL := all
|
|
|
|
.DEFAULT_GOAL := all
|
|
|
|
ifneq ($(KEYMAP),)
|
|
|
|
ifneq ($(KEYMAP),)
|
|
|
|
ifeq ($(SUBPROJECT),)
|
|
|
|
ifeq ($(SUBPROJECT),)
|
|
|
|
# Inside a keymap folder, just build the keymap, with the
|
|
|
|
# Inside a keymap folder, just build the keymap, with the
|
|
|
|
# default subproject
|
|
|
|
# default subproject
|
|
|
|
.DEFAULT_GOAL := $(KEYBOARD)-$(KEYMAP)
|
|
|
|
.DEFAULT_GOAL := $(KEYBOARD)-$(KEYMAP)
|
|
|
|
else
|
|
|
|
else
|
|
|
@ -163,7 +163,7 @@ define TRY_TO_MATCH_RULE_FROM_LIST_HELPER3
|
|
|
|
ifneq ($1,)
|
|
|
|
ifneq ($1,)
|
|
|
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
|
|
|
ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,$$(firstword $1)),true)
|
|
|
|
MATCHED_ITEM := $$(firstword $1)
|
|
|
|
MATCHED_ITEM := $$(firstword $1)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$$(wordlist 2,9999,$1)))
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endif
|
|
|
@ -171,10 +171,10 @@ endef
|
|
|
|
|
|
|
|
|
|
|
|
# A recursive helper function for finding the longest match
|
|
|
|
# A recursive helper function for finding the longest match
|
|
|
|
# $1 The list to be checed
|
|
|
|
# $1 The list to be checed
|
|
|
|
# It works by always removing the currently matched item from the list
|
|
|
|
# It works by always removing the currently matched item from the list
|
|
|
|
# and call itself recursively, until a match is found
|
|
|
|
# and call itself recursively, until a match is found
|
|
|
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
|
|
|
define TRY_TO_MATCH_RULE_FROM_LIST_HELPER2
|
|
|
|
# Stop the recursion when the list is empty
|
|
|
|
# Stop the recursion when the list is empty
|
|
|
|
ifneq ($1,)
|
|
|
|
ifneq ($1,)
|
|
|
|
RULE_BEFORE := $$(RULE)
|
|
|
|
RULE_BEFORE := $$(RULE)
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
|
|
|
$$(eval $$(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER3,$1))
|
|
|
@ -270,7 +270,7 @@ define PARSE_KEYBOARD
|
|
|
|
$$(eval $$(call PARSE_SUBPROJECT,$$(SUBPROJECT)))
|
|
|
|
$$(eval $$(call PARSE_SUBPROJECT,$$(SUBPROJECT)))
|
|
|
|
# If there's no matching subproject, we assume it's the default
|
|
|
|
# If there's no matching subproject, we assume it's the default
|
|
|
|
# This will allow you to leave the subproject part of the target out
|
|
|
|
# This will allow you to leave the subproject part of the target out
|
|
|
|
else
|
|
|
|
else
|
|
|
|
$$(eval $$(call PARSE_SUBPROJECT,))
|
|
|
|
$$(eval $$(call PARSE_SUBPROJECT,))
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endef
|
|
|
|
endef
|
|
|
@ -285,7 +285,7 @@ endef
|
|
|
|
# When entering this, the keyboard and subproject are known, so now we need
|
|
|
|
# When entering this, the keyboard and subproject are known, so now we need
|
|
|
|
# to determine which keymaps are going to get compiled
|
|
|
|
# to determine which keymaps are going to get compiled
|
|
|
|
define PARSE_SUBPROJECT
|
|
|
|
define PARSE_SUBPROJECT
|
|
|
|
# If we want to compile the default subproject, then we need to
|
|
|
|
# If we want to compile the default subproject, then we need to
|
|
|
|
# include the correct makefile to determine the actual name of it
|
|
|
|
# include the correct makefile to determine the actual name of it
|
|
|
|
CURRENT_SP := $1
|
|
|
|
CURRENT_SP := $1
|
|
|
|
ifeq ($$(CURRENT_SP),)
|
|
|
|
ifeq ($$(CURRENT_SP),)
|
|
|
@ -304,7 +304,7 @@ define PARSE_SUBPROJECT
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
# The special allsp is handled later
|
|
|
|
# The special allsp is handled later
|
|
|
|
ifneq ($$(CURRENT_SP),allsp)
|
|
|
|
ifneq ($$(CURRENT_SP),allsp)
|
|
|
|
# get a list of all keymaps
|
|
|
|
# get a list of all keymaps
|
|
|
|
KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/keymaps/*/.)))
|
|
|
|
KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/keymaps/*/.)))
|
|
|
|
ifneq ($$(CURRENT_SP),)
|
|
|
|
ifneq ($$(CURRENT_SP),)
|
|
|
@ -343,7 +343,7 @@ define PARSE_SUBPROJECT
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endef
|
|
|
|
endef
|
|
|
|
|
|
|
|
|
|
|
|
# If we want to parse all subprojects, but the keyboard doesn't have any,
|
|
|
|
# If we want to parse all subprojects, but the keyboard doesn't have any,
|
|
|
|
# then use defaultsp instead
|
|
|
|
# then use defaultsp instead
|
|
|
|
define PARSE_ALL_SUBPROJECTS
|
|
|
|
define PARSE_ALL_SUBPROJECTS
|
|
|
|
ifeq ($$(SUBPROJECTS),)
|
|
|
|
ifeq ($$(SUBPROJECTS),)
|
|
|
@ -448,7 +448,7 @@ endef
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set the silent mode depending on if we are trying to compile multiple keyboards or not
|
|
|
|
# Set the silent mode depending on if we are trying to compile multiple keyboards or not
|
|
|
|
# By default it's on in that case, but it can be overriden by specifying silent=false
|
|
|
|
# By default it's on in that case, but it can be overriden by specifying silent=false
|
|
|
|
# from the command line
|
|
|
|
# from the command line
|
|
|
|
define SET_SILENT_MODE
|
|
|
|
define SET_SILENT_MODE
|
|
|
|
ifdef SUB_IS_SILENT
|
|
|
|
ifdef SUB_IS_SILENT
|
|
|
@ -481,11 +481,12 @@ endef
|
|
|
|
# Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps
|
|
|
|
# Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps
|
|
|
|
SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile)))
|
|
|
|
SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile)))
|
|
|
|
.PHONY: $(SUBPROJECTS)
|
|
|
|
.PHONY: $(SUBPROJECTS)
|
|
|
|
$(SUBPROJECTS): %: %-allkm
|
|
|
|
$(SUBPROJECTS): %: %-allkm
|
|
|
|
|
|
|
|
|
|
|
|
# Let's match everything, we handle all the rule parsing ourselves
|
|
|
|
# Let's match everything, we handle all the rule parsing ourselves
|
|
|
|
.PHONY: %
|
|
|
|
.PHONY: %
|
|
|
|
%:
|
|
|
|
ifndef SKIP_GIT
|
|
|
|
|
|
|
|
%:
|
|
|
|
# Check if we have the CMP tool installed
|
|
|
|
# Check if we have the CMP tool installed
|
|
|
|
cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
|
|
|
cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
|
|
|
# Check if the submodules are dirty, and display a warning if they are
|
|
|
|
# Check if the submodules are dirty, and display a warning if they are
|
|
|
@ -505,8 +506,24 @@ $(SUBPROJECTS): %: %-allkm
|
|
|
|
# But we return the error code at the end, to trigger travis failures
|
|
|
|
# But we return the error code at the end, to trigger travis failures
|
|
|
|
$(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND))
|
|
|
|
$(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND))
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
$(foreach TEST,$(TESTS),$(RUN_TEST))
|
|
|
|
$(foreach TEST,$(TESTS),$(RUN_TEST))
|
|
|
|
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
%:
|
|
|
|
|
|
|
|
# Check if we have the CMP tool installed
|
|
|
|
|
|
|
|
cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
|
|
|
|
|
|
|
|
rm -f $(ERROR_FILE) > /dev/null 2>&1
|
|
|
|
|
|
|
|
$(eval $(call PARSE_RULE,$@))
|
|
|
|
|
|
|
|
$(eval $(call SET_SILENT_MODE))
|
|
|
|
|
|
|
|
# Run all the commands in the same shell, notice the + at the first line
|
|
|
|
|
|
|
|
# it has to be there to allow parallel execution of the submake
|
|
|
|
|
|
|
|
# This always tries to compile everything, even if error occurs in the middle
|
|
|
|
|
|
|
|
# But we return the error code at the end, to trigger travis failures
|
|
|
|
|
|
|
|
$(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND))
|
|
|
|
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
|
|
|
|
$(foreach TEST,$(TESTS),$(RUN_TEST))
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
if [ -f $(ERROR_FILE) ]; then printf "$(MSG_ERRORS)" & exit 1; fi;
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
# All should compile everything
|
|
|
|
# All should compile everything
|
|
|
|
.PHONY: all
|
|
|
|
.PHONY: all
|
|
|
@ -526,7 +543,11 @@ test: test-all
|
|
|
|
test-clean: test-all-clean
|
|
|
|
test-clean: test-all-clean
|
|
|
|
|
|
|
|
|
|
|
|
# Generate the version.h file
|
|
|
|
# Generate the version.h file
|
|
|
|
GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
|
|
|
|
ifndef SKIP_GIT
|
|
|
|
|
|
|
|
GIT_VERSION := $(shell git describe --abbrev=6 --dirty --always --tags 2>/dev/null || date +"%Y-%m-%d-%H:%M:%S")
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
GIT_VERSION := NA
|
|
|
|
|
|
|
|
endif
|
|
|
|
BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
|
|
|
|
BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S")
|
|
|
|
$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h)
|
|
|
|
$(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h)
|
|
|
|
$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
|
|
|
|
$(shell echo '#define QMK_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
|
|
|
|