From db5c3b74fb6541879bfad9930d2a659b1d89cd83 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 8 Aug 2016 01:16:06 +0300 Subject: Add color output --- message.mk | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 message.mk (limited to 'message.mk') diff --git a/message.mk b/message.mk new file mode 100644 index 000000000..2ebf76a58 --- /dev/null +++ b/message.mk @@ -0,0 +1,35 @@ +COLOR ?= true + +ifeq ($(COLOR),true) + NO_COLOR=\033[0m + OK_COLOR=\033[32;01m + ERROR_COLOR=\033[31;01m + WARN_COLOR=\033[33;01m + BLUE=\033[0;34m + BOLD=\033[1m +endif + +ifneq ($(shell awk --version 2>/dev/null),) + AWK=awk +else + AWK=cat && test +endif + +OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n +ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n +WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n + +ifndef $(SILENT) + SILENT = false +endif + +TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' +TAB_LOG_PLAIN = printf "$$LOG\n" +AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' +AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' +PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 +PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) +PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 +PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) +PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) +BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 67b294ca66fd9da341ab93019a380d91ac589c96 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 8 Aug 2016 10:26:23 +0300 Subject: Actual compilation --- Makefile | 26 +++++---- build_keyboard.mk | 171 ++++++++++++++---------------------------------------- message.mk | 3 +- 3 files changed, 59 insertions(+), 141 deletions(-) (limited to 'message.mk') diff --git a/Makefile b/Makefile index e5becd7ad..fc6157209 100644 --- a/Makefile +++ b/Makefile @@ -228,17 +228,19 @@ define PARSE_KEYMAP KB_SP := $(CURRENT_KB)/$$(CURRENT_SP) endif KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR) + MAKE_VARS := KEYBOARD=$$(CURRENT_KB) SUBPROJECT=$$(CURRENT_SP) KEYMAP=$$(CURRENT_KM) + MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=false COMMAND_$$(COMMAND) := \ - printf "Compiling $$(KB_SP) with $(BOLD)$$(CURRENT_KM)$(NO_COLOR)" | \ - $(AWK) '{ printf "%-118s", $$$$0;}'; \ - LOG=$$$$(echo "$$(MAKE) -c $(ROOT_DIR) -f build_keyboard.mk VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true" 2>&1) ; \ - if [ $$$$? -gt 0 ]; \ - then $$(PRINT_ERROR_PLAIN); \ - elif [ "$$$$LOG" != "" ] ; \ - then $$(PRINT_WARNING_PLAIN); \ - else \ - $$(PRINT_OK); \ - fi; + printf "Compiling $$(KB_SP) with $(BOLD)$$(CURRENT_KM)$(NO_COLOR)" | \ + $(AWK) '{ printf "%-118s", $$$$0;}'; \ + LOG=$$$$($$(MAKE) -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_VARS) 2>&1) ; \ + if [ $$$$? -gt 0 ]; \ + then $$(PRINT_ERROR_PLAIN); \ + elif [ "$$$$LOG" != "" ] ; \ + then $$(PRINT_WARNING_PLAIN); \ + else \ + $$(PRINT_OK); \ + fi; endef define PARSE_ALL_KEYMAPS @@ -258,9 +260,11 @@ SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile))) $(SUBPROJECTS): %: %-allkm .PHONY: % -%: +%: + cmp --version >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi; $(eval $(call PARSE_RULE,$@)) $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) + .PHONY: all all: all-keyboards diff --git a/build_keyboard.mk b/build_keyboard.mk index 053c8532a..b0cb22e6a 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -4,44 +4,9 @@ endif .DEFAULT_GOAL := all -space := $(subst ,, ) -ESCAPED_ABS_PATH = $(subst $(space),_SPACE_,$(abspath $1)) -starting_makefile := $(call ESCAPED_ABS_PATH,$(firstword $(MAKEFILE_LIST))) -mkfile_path := $(call ESCAPED_ABS_PATH,$(lastword $(MAKEFILE_LIST)))) -abs_tmk_root := $(patsubst %/,%,$(dir $(mkfile_path))) - -ifneq (,$(findstring /keyboards/,$(starting_makefile))) - possible_keyboard:=$(patsubst %/,%,$(dir $(patsubst $(abs_tmk_root)/keyboards/%,%,$(starting_makefile)))) - ifneq (,$(findstring /keymaps/,$(possible_keyboard))) - KEYMAP_DIR:=$(lastword $(subst /keymaps/, ,$(possible_keyboard))) - KEYBOARD_DIR:=$(firstword $(subst /keymaps/, ,$(possible_keyboard))) - ifneq (,$(findstring /,$(KEYBOARD_DIR))) - # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR))) - # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR))) - tmk_root = ../../.. - else - tmk_root = ../../../.. - endif - else - KEYMAP_DIR:=default - KEYBOARD_DIR:=$(possible_keyboard) - ifneq (,$(findstring /,$(KEYBOARD_DIR))) - # SUBPROJECT_DIR:=$(lastword $(subst /, ,$(KEYBOARD_DIR))) - # KEYBOARD_DIR:=$(firstword $(subst /, ,$(KEYBOARD_DIR))) - tmk_root = ../../.. - else - tmk_root = ../.. - endif - endif -else - tmk_root = . -endif -# $(info $(KEYBOARD_DIR)) -# $(info $(KEYMAP_DIR)) -# $(info $(SUBPROJECT_DIR)) # Directory common source filess exist -TOP_DIR = $(tmk_root) +TOP_DIR = . TMK_DIR = tmk_core TMK_PATH = $(TOP_DIR)/$(TMK_DIR) LIB_PATH = $(TOP_DIR)/lib @@ -50,92 +15,49 @@ QUANTUM_DIR = quantum QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR) -ifdef keyboard - KEYBOARD ?= $(keyboard) -endif -ifdef KEYBOARD_DIR - KEYBOARD ?= $(KEYBOARD_DIR) -endif -ifndef KEYBOARD - KEYBOARD=planck -endif - MASTER ?= left ifdef master MASTER = $(master) endif +KEYBOARD_PATH := keyboards/$(KEYBOARD) +KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c -# converts things to keyboards/subproject -ifneq (,$(findstring /,$(KEYBOARD))) - TEMP:=$(KEYBOARD) - KEYBOARD:=$(firstword $(subst /, ,$(TEMP))) - SUBPROJECT:=$(lastword $(subst /, ,$(TEMP))) -endif - -KEYBOARD_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD) - -ifdef sub - SUBPROJECT=$(sub) -endif -ifdef subproject - SUBPROJECT=$(subproject) -endif - -ifneq ("$(wildcard $(KEYBOARD_PATH)/$(KEYBOARD).c)","") - KEYBOARD_FILE = keyboards/$(KEYBOARD)/$(KEYBOARD).c - ifneq ($(call ESCAPED_ABS_PATH,$(KEYBOARD_PATH)/Makefile),$(starting_makefile)) - -include $(KEYBOARD_PATH)/Makefile - endif +ifneq ("$(wildcard $(KEYBOARD_C))","") + include $(KEYBOARD_PATH)/rules.mk else -$(error "$(KEYBOARD_PATH)/$(KEYBOARD).c" does not exist) -endif - -ifdef SUBPROJECT_DEFAULT - SUBPROJECT?=$(SUBPROJECT_DEFAULT) -endif - -ifdef SUBPROJECT - SUBPROJECT_PATH = $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT) - ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","") - OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT) - SUBPROJECT_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/$(SUBPROJECT).c - ifneq ($(call ESCAPED_ABS_PATH,$(SUBPROJECT_PATH)/Makefile),$(starting_makefile)) - -include $(SUBPROJECT_PATH)/Makefile - endif - else -$(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist) - endif -endif - -ifdef keymap - KEYMAP ?= $(keymap) -endif -ifdef KEYMAP_DIR - KEYMAP ?= $(KEYMAP_DIR) -endif -ifndef KEYMAP - KEYMAP = default -endif -KEYMAP_PATH = $(KEYBOARD_PATH)/keymaps/$(KEYMAP) -ifneq ("$(wildcard $(KEYMAP_PATH)/keymap.c)","") - KEYMAP_FILE = keyboards/$(KEYBOARD)/keymaps/$(KEYMAP)/keymap.c - ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile)) - -include $(KEYMAP_PATH)/Makefile - endif -else - ifeq ("$(wildcard $(SUBPROJECT_PATH)/keymaps/$(KEYMAP)/keymap.c)","") -$(error "$(KEYMAP_PATH)/keymap.c" does not exist) - else - KEYMAP_PATH = $(SUBPROJECT_PATH)/keymaps/$(KEYMAP) - KEYMAP_FILE = keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/$(KEYMAP)/keymap.c - ifneq ($(call ESCAPED_ABS_PATH,$(KEYMAP_PATH)/Makefile),$(starting_makefile)) - -include $(KEYMAP_PATH)/Makefile - endif - endif + $(error "$(KEYBOARD_C)" does not exist) +endif + + +ifneq ($(SUBPROJECT),) + SUBPROJECT_PATH := keyboards/$(KEYBOARD)/$(SUBPROJECT) + SUBPROJECT_C := $(SUBPROJECT_PATH)/$(SUBPROJECT).c + ifneq ("$(wildcard $(SUBPROJECT_C))","") + OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT) + include $(SUBPROJECT_PATH)/rules.mk + else + $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist) + endif +endif + +MAIN_KEYMAP_PATH := $(KEYBOARD_PATH)/keymaps/$(KEYMAP) +MAIN_KEYMAP_C := $(MAIN_KEYMAP_PATH)/keymap.c +SUBPROJ_KEYMAP_PATH := $(SUBPROJECT_PATH)/keymaps/$(KEYMAP) +SUBPROJ_KEYMAP_C := $(SUBPROJ_KEYMAP_PATH)/keymap.c +ifneq ("$(wildcard $(SUBPROJ_KEYMAP_C))","") + -include $(SUBPROJ_KEYMAP_PATH)/Makefile + KEYMAP_C := $(SUBPROJ_KEYMAP_C) + KEYMAP_PATH := $(SUBPROJ_KEYMAP_PATH) +else ifneq ("$(wildcard $(MAIN_KEYMAP_C))","") + -include $(MAIN_KEYMAP_PATH)/Makefile + KEYMAP_C := $(MAIN_KEYMAP_C) + KEYMAP_PATH := $(MAIN_KEYMAP_PATH) +else + $(error "$(MAIN_KEYMAP_C)/keymap.c" does not exist) endif -ifdef SUBPROJECT +ifneq ($(SUBPROJECT),) TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP) else TARGET ?= $(KEYBOARD)_$(KEYMAP) @@ -149,36 +71,27 @@ BUILD_DIR = $(TOP_DIR)/.build OBJDIR = $(BUILD_DIR)/obj_$(TARGET) - ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") CONFIG_H = $(KEYMAP_PATH)/config.h else CONFIG_H = $(KEYBOARD_PATH)/config.h - ifdef SUBPROJECT - ifneq ("$(wildcard $(SUBPROJECT_PATH)/$(SUBPROJECT).c)","") + ifneq ($(SUBPROJECT),) + ifneq ("$(wildcard $(SUBPROJECT_C))","") CONFIG_H = $(SUBPROJECT_PATH)/config.h endif endif endif # # project specific files -SRC += $(KEYBOARD_FILE) \ - $(KEYMAP_FILE) \ +SRC += $(KEYBOARD_C) \ + $(KEYMAP_C) \ $(QUANTUM_DIR)/quantum.c \ $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/keycode_config.c \ $(QUANTUM_DIR)/process_keycode/process_leader.c -ifdef SUBPROJECT - SRC += $(SUBPROJECT_FILE) -endif - -ifdef SUBPROJECT - SRC += $(SUBPROJECT_FILE) -endif - -ifdef SUBPROJECT - SRC += $(SUBPROJECT_FILE) +ifneq ($(SUBPROJECT),) + SRC += $(SUBPROJECT_C) endif ifndef CUSTOM_MATRIX @@ -229,7 +142,7 @@ endif # Search Path VPATH += $(KEYMAP_PATH) -ifdef SUBPROJECT +ifneq ($(SUBPROJECT),) VPATH += $(SUBPROJECT_PATH) endif VPATH += $(KEYBOARD_PATH) diff --git a/message.mk b/message.mk index 2ebf76a58..08a4e02ab 100644 --- a/message.mk +++ b/message.mk @@ -32,4 +32,5 @@ PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) -BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; \ No newline at end of file +BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; +MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR) \ No newline at end of file -- cgit v1.2.3-70-g09d2 From 8732265928818dd0b8797fb271e7c7fa9346d025 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Tue, 9 Aug 2016 09:52:01 +0300 Subject: Options for silent compilation A single keyboard is always by default compiled in verbose mode. While multiple keyboards are compiled in silent mode. This can be overriden by the silent variable from the command line --- Makefile | 50 ++++++++++++++++++++++++++++++++++++++------------ message.mk | 4 ---- 2 files changed, 38 insertions(+), 16 deletions(-) (limited to 'message.mk') diff --git a/Makefile b/Makefile index 9b534e897..3d4bd589f 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,16 @@ ifndef VERBOSE .SILENT: endif +ifdef silent + SILENT = $(silent) +endif + +ifdef SILENT + SUB_IS_SILENT := $(silent) +endif + +override SILENT = false + STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST)) ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST)) ROOT_DIR := $(dir $(ROOT_MAKEFILE)) @@ -59,10 +69,10 @@ ifdef keymap KEYMAP := $(keymap) endif -$(info Keyboard: $(KEYBOARD)) -$(info Keymap: $(KEYMAP)) -$(info Subproject: $(SUBPROJECT)) -$(info Keyboards: $(KEYBOARDS)) +#$(info Keyboard: $(KEYBOARD)) +#$(info Keymap: $(KEYMAP)) +#$(info Subproject: $(SUBPROJECT)) +#$(info Keyboards: $(KEYBOARDS)) .DEFAULT_GOAL := all ifneq ($(KEYMAP),) @@ -229,11 +239,14 @@ define PARSE_KEYMAP endif KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR) MAKE_VARS := KEYBOARD=$$(CURRENT_KB) SUBPROJECT=$$(CURRENT_SP) KEYMAP=$$(CURRENT_KM) - MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=false - COMMAND_$$(COMMAND) := \ - printf "Compiling $$(KB_SP) with $(BOLD)$$(CURRENT_KM)$(NO_COLOR)" | \ - $(AWK) '{ printf "%-118s", $$$$0;}'; \ - LOG=$$$$($$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_VARS) 2>&1) ; \ + MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) + MAKE_COMMAND := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk + MAKE_MSG := Compiling $$(KB_SP) with $(BOLD)$$(CURRENT_KM)$(NO_COLOR) + MAKE_MSG_FORMAT := $(AWK) '{ printf "%-118s", $$$$0;}' + COMMAND_true_$$(COMMAND) := \ + printf "$$(MAKE_MSG)" | \ + $$(MAKE_MSG_FORMAT); \ + LOG=$$$$($$(MAKE_COMMAND) $$(MAKE_VARS) SILENT=true 2>&1) ; \ if [ $$$$? -gt 0 ]; \ then $$(PRINT_ERROR_PLAIN); \ elif [ "$$$$LOG" != "" ] ; \ @@ -241,18 +254,30 @@ define PARSE_KEYMAP else \ $$(PRINT_OK); \ fi; + COMMAND_false_$$(COMMAND) := \ + printf "$$(MAKE_MSG)\n" | \ + $$(MAKE_MSG_FORMAT); \ + $$(MAKE_COMMAND) $$(MAKE_VARS) SILENT=false; endef define PARSE_ALL_KEYMAPS $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS))) endef +define SET_SILENT_MODE + ifdef SUB_IS_SILENT + SILENT_MODE := $(SUB_IS_SILENT) + else ifeq ($$(words $$(COMMANDS)),1) + SILENT_MODE := false + else + SILENT_MODE := true + endif +endef + include $(ROOT_DIR)/message.mk -#RUN_COMMAND = echo "Running": $(COMMAND_$(COMMAND)); RUN_COMMAND = \ -$(COMMAND_$(COMMAND)) -#LOG=$$(echo $(COMMAND) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \ +$(COMMAND_$(SILENT_MODE)_$(COMMAND)) # Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile))) @@ -270,6 +295,7 @@ $(SUBPROJECTS): %: %-allkm esac \ done $(eval $(call PARSE_RULE,$@)) + $(eval $(call SET_SILENT_MODE)) +$(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) diff --git a/message.mk b/message.mk index 08a4e02ab..aefb46de8 100644 --- a/message.mk +++ b/message.mk @@ -19,10 +19,6 @@ OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n -ifndef $(SILENT) - SILENT = false -endif - TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' -- cgit v1.2.3-70-g09d2 From 3aac4e95c91be3244d68f27159c2667904c8fddd Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Mon, 15 Aug 2016 08:20:16 +0300 Subject: More general system for generating several outputs --- build_keyboard.mk | 44 +++++++++++------- message.mk | 29 +++++++++++- tmk_core/chibios.mk | 4 +- tmk_core/rules.mk | 125 +++++++++++++++++----------------------------------- 4 files changed, 98 insertions(+), 104 deletions(-) (limited to 'message.mk') diff --git a/build_keyboard.mk b/build_keyboard.mk index 7d284cfa7..d10412ea5 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -43,6 +43,9 @@ ifneq ($(SUBPROJECT),) endif endif +# Save the defs here, so we don't include any keymap specific ones +PROJECT_DEFS := $(OPT_DEFS) + MAIN_KEYMAP_PATH := $(KEYBOARD_PATH)/keymaps/$(KEYMAP) MAIN_KEYMAP_C := $(MAIN_KEYMAP_PATH)/keymap.c SUBPROJ_KEYMAP_PATH := $(SUBPROJECT_PATH)/keymaps/$(KEYMAP) @@ -59,18 +62,33 @@ else $(error "$(MAIN_KEYMAP_C)/keymap.c" does not exist) endif +BUILD_DIR = $(TOP_DIR)/.build + ifneq ($(SUBPROJECT),) TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP) + KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD)_$(SUBPROJECT) else TARGET ?= $(KEYBOARD)_$(KEYMAP) + KEYBOARD_OUTPUT := $(BUILD_DIR)/obj_$(KEYBOARD) endif -BUILD_DIR = $(TOP_DIR)/.build +# We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA +ifdef MCU_FAMILY + PLATFORM=CHIBIOS +else + PLATFORM=AVR +endif + +ifeq ($(PLATFORM),CHIBIOS) + include $(TMK_PATH)/protocol/chibios.mk + include $(TMK_PATH)/chibios.mk + OPT_OS = chibios +endif # Object files directory # To put object files in current directory, use a dot (.), do NOT make # this an empty or blank macro! -OBJDIR := $(BUILD_DIR)/obj_$(TARGET) +KEYMAP_OUTPUT := $(BUILD_DIR)/obj_$(TARGET) ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") @@ -156,23 +174,10 @@ VPATH += $(QUANTUM_PATH)/audio VPATH += $(QUANTUM_PATH)/process_keycode -# We can assume a ChibiOS target When MCU_FAMILY is defined, since it's not used for LUFA -ifdef MCU_FAMILY - PLATFORM=CHIBIOS -else - PLATFORM=AVR -endif - include $(TMK_PATH)/common.mk ifeq ($(PLATFORM),AVR) include $(TMK_PATH)/protocol/lufa.mk include $(TMK_PATH)/avr.mk -else ifeq ($(PLATFORM),CHIBIOS) - include $(TMK_PATH)/protocol/chibios.mk - include $(TMK_PATH)/chibios.mk - OPT_OS = chibios -else - $(error Unknown platform) endif ifeq ($(strip $(VISUALIZER_ENABLE)), yes) @@ -181,6 +186,13 @@ ifeq ($(strip $(VISUALIZER_ENABLE)), yes) include $(VISUALIZER_PATH)/visualizer.mk endif + +OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) +$(KEYMAP_OUTPUT)_SRC := $(SRC) +$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" +$(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) +$(KEYBOARD_OUTPUT)_DEFS := $(PROJECT_DEFS) + + include $(TMK_PATH)/rules.mk -OPT_DEFS += -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" diff --git a/message.mk b/message.mk index aefb46de8..6abc78215 100644 --- a/message.mk +++ b/message.mk @@ -29,4 +29,31 @@ PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $ PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; -MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR) \ No newline at end of file +MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR) + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_BIN = Creating binary load file for Flash: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_COMPILING_CPP = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: +MSG_CREATING_LIBRARY = Creating library: +MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ + Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ + git submodule sync --recursive\n\ + git submodule update --init --recursive$(NO_COLOR)\n\n\ + You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ + or if you have modified the ChibiOS libraries yourself. \n\n \ No newline at end of file diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index cb67ac6f2..b05d59ee8 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -89,9 +89,9 @@ CHIBISRC = $(STARTUPSRC) \ $(STARTUPASM) \ $(PORTASM) \ $(OSALASM) - -SRC += $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC)) +CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC)) + EXTRAINCDIRS += $(CHIBIOS)/os/license \ $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \ diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index e8e3de571..9f6d8d9df 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -25,6 +25,18 @@ vpath %.hpp $(VPATH_SRC) vpath %.S $(VPATH_SRC) VPATH := +# Convert all SRC to OBJ +define OBJ_FROM_SRC +$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.S,$1/%.o,$($1_SRC)))) +endef +$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT)))) + +# Define a list of all objects +OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ)) + +MASTER_OUTPUT := $(firstword $(OUTPUTS)) + + # Output format. (can be srec, ihex, binary) FORMAT = ihex @@ -53,17 +65,18 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources -CDEFS += $(OPT_DEFS) +#CDEFS += # Place -D or -U options here for ASM sources -ADEFS += $(OPT_DEFS) +#ADEFS += # Place -D or -U options here for C++ sources #CPPDEFS += -D__STDC_LIMIT_MACROS #CPPDEFS += -D__STDC_CONSTANT_MACROS -CPPDEFS += $(OPT_DEFS) +#CPPDEFS += + @@ -134,7 +147,8 @@ endif # files -- see avr-libc docs [FIXME: not yet described there] # -listing-cont-lines: Sets the maximum number of continuation lines of hex # dump that will be displayed for a given single line of source input. -ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 +ASFLAGS += $(ADEFS) +ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100 ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) ifdef CONFIG_H ASFLAGS += -include $(CONFIG_H) @@ -193,48 +207,6 @@ COPY = cp WINSHELL = cmd SECHO = $(SILENT) || echo -# Define Messages -# English -MSG_ERRORS_NONE = Errors: none -MSG_BEGIN = -------- begin -------- -MSG_END = -------- end -------- -MSG_SIZE_BEFORE = Size before: -MSG_SIZE_AFTER = Size after: -MSG_COFF = Converting to AVR COFF: -MSG_EXTENDED_COFF = Converting to AVR Extended COFF: -MSG_FLASH = Creating load file for Flash: -MSG_EEPROM = Creating load file for EEPROM: -MSG_BIN = Creating binary load file for Flash: -MSG_EXTENDED_LISTING = Creating Extended Listing: -MSG_SYMBOL_TABLE = Creating Symbol Table: -MSG_LINKING = Linking: -MSG_COMPILING = Compiling: -MSG_COMPILING_CPP = Compiling: -MSG_ASSEMBLING = Assembling: -MSG_CLEANING = Cleaning project: -MSG_CREATING_LIBRARY = Creating library: -MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ - Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\ - git submodule sync --recursive\n\ - git submodule update --init --recursive$(NO_COLOR)\n\n\ - You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ - or if you have modified the ChibiOS libraries yourself. \n\n - - -# Define all object files. -OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC)))) -# The files in the lib folder are shared between all keymaps, so generate that folder name by removing -# the keymap from the name -KBOBJDIR=$(subst _$(KEYMAP),,$(OBJDIR)) -# And fixup the object files to match -LIBOBJ = $(foreach v,$(OBJ),$(if $(findstring /lib/,$v),$v)) -NONLIBOBJ := $(filter-out $(LIBOBJ),$(OBJ)) -LIBOBJ := $(subst _$(KEYMAP)/,/,$(LIBOBJ)) -OBJ := $(LIBOBJ) $(NONLIBOBJ) - -# Define all listing files. -LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC)))) - # Compiler flags to generate dependency files. #GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d @@ -320,68 +292,66 @@ gccversion : $(eval CMD=$(BIN) $< $@ || exit 0) @$(BUILD_CMD) -# Create library from object files. -.SECONDARY : $(BUILD_DIR)/$(TARGET).a -.PRECIOUS : $(OBJ) -%.a: $(OBJ) - @$(SILENT) || printf "$(MSG_CREATING_LIBRARY) $@" | $(AWK_CMD) - $(eval CMD=$(AR) $@ $(OBJ) ) - @$(BUILD_CMD) - BEGIN = gccversion sizebefore # Link: create ELF output file from object files. .SECONDARY : $(BUILD_DIR)/$(TARGET).elf .PRECIOUS : $(OBJ) # Note the obj.txt depeendency is there to force linking if a source file is deleted -%.elf: $(OBJ) $(OBJDIR)/cflags.txt $(OBJDIR)/ldflags.txt $(OBJDIR)/obj.txt | $(BEGIN) +%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN) @$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD) $(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS)) @$(BUILD_CMD) + define GEN_OBJRULE +$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) +$1_CPPFLAGS= $$(ALL_CPPFLAGS) $$($1_DEFS) +$1_ASFLAGS= $$(ALL_ASFLAGS) $$($1_DEFS) + # Compile: create object files from C source files. $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN) @mkdir -p $$(@D) @$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + $$(eval CMD := $$(CC) -c $$($1_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$$(BUILD_CMD) # Compile: create object files from C++ source files. $1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN) @mkdir -p $$(@D) @$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) + $$(eval CMD=$$(CC) -c $$($1_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) @$(BUILD_CMD) # Assemble: create object files from assembler source files. $1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN) @mkdir -p $$(@D) @$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD) - $$(eval CMD=$$(CC) -c $$(ALL_ASFLAGS) $$< -o $$@) + $$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@) @$$(BUILD_CMD) $1/force: $1/cflags.txt: $1/force - echo '$$(ALL_CFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CFLAGS)' > $$@ + echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@ $1/cppflags.txt: $1/force - echo '$$(ALL_CPPFLAGS)' | cmp -s - $$@ || echo '$$(ALL_CPPFLAGS)' > $$@ + echo '$$($1_CPPFLAGS)' | cmp -s - $$@ || echo '$$($1_CPPFLAGS)' > $$@ $1/asflags.txt: $1/force - echo '$$(ALL_ASFLAGS)' | cmp -s - $$@ || echo '$$(ALL_ASFLAGS)' > $$@ - -$1/ldflags.txt: $1/force - echo '$$(LDFLAGS)' | cmp -s - $$@ || echo '$$(LDFLAGS)' > $$@ - -$1/obj.txt: $1/force - echo '$$(OBJ)' | cmp -s - $$@ || echo '$$(OBJ)' > $$@ + echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@ $1/compiler.txt: $1/force $$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@ endef +$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force + echo '$(OBJ)' | cmp -s - $$@ || echo '$(OBJ)' > $$@ + +$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force + echo '$(LDFLAGS)' | cmp -s - $$@ || echo '$(LDFLAGS)' > $$@ + + # We have to use static rules for the .d files for some reason DEPS = $(patsubst %.o,%.d,$(OBJ)) # Keep the .d files @@ -390,22 +360,7 @@ DEPS = $(patsubst %.o,%.d,$(OBJ)) $(DEPS): -# Since the object files could be in two different folders, generate -# separate rules for them, rather than having too generic rules -$(eval $(call GEN_OBJRULE,$(OBJDIR))) -$(eval $(call GEN_OBJRULE,$(KBOBJDIR))) - -# Compile: create assembler files from C source files. -%.s : %.c | $(BEGIN) - @$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD) - $(eval CMD=$(CC) -S $(ALL_CFLAGS) $< -o $@) - @$(BUILD_CMD) - -# Compile: create assembler files from C++ source files. -%.s : %.cpp | $(BEGIN) - @$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD) - $(eval CMD=$(CC) -S $(ALL_CPPFLAGS) $< -o $@) - @$(BUILD_CMD) +$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT)))) # Create preprocessed source for use in sending a bug report. %.i : %.c | $(BEGIN) @@ -420,13 +375,13 @@ clean: show_path: @echo VPATH=$(VPATH) @echo SRC=$(SRC) + @echo OBJ=$(OBJ) # Create build directory $(shell mkdir $(BUILD_DIR) 2>/dev/null) # Create object files directory -$(shell mkdir $(OBJDIR) 2>/dev/null) -$(shell mkdir $(KBOBJDIR) 2>/dev/null) +$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir $(OUTPUT) 2>/dev/null))) # Include the dependency files. -include $(patsubst %.o,%.d,$(OBJ)) -- cgit v1.2.3-70-g09d2 From 03e31ef8b9752220d092a1950030cf7942e002eb Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Tue, 16 Aug 2016 08:42:08 +0300 Subject: Continue on error --- Makefile | 6 +++++- message.mk | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'message.mk') diff --git a/Makefile b/Makefile index ed89b0733..f80d4e99c 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,8 @@ endif override SILENT = false +ON_ERROR := error_occured=1 + STARTING_MAKEFILE := $(firstword $(MAKEFILE_LIST)) ROOT_MAKEFILE := $(lastword $(MAKEFILE_LIST)) ROOT_DIR := $(dir $(ROOT_MAKEFILE)) @@ -302,7 +304,9 @@ $(SUBPROJECTS): %: %-allkm done $(eval $(call PARSE_RULE,$@)) $(eval $(call SET_SILENT_MODE)) - +$(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) + +error_occured=0; \ + $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) \ + if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi .PHONY: all diff --git a/message.mk b/message.mk index 6abc78215..f8fd38712 100644 --- a/message.mk +++ b/message.mk @@ -15,6 +15,8 @@ else AWK=cat && test endif +ON_ERROR ?= exit 1 + OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n @@ -23,9 +25,9 @@ TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }' TAB_LOG_PLAIN = printf "$$LOG\n" AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }' AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }' -PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && exit 1 +PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && $(ON_ERROR) PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) -PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && exit 1 +PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && $(ON_ERROR) PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; @@ -34,6 +36,7 @@ MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, pleas # Define Messages # English MSG_ERRORS_NONE = Errors: none +MSG_ERRORS = $(ERROR_COLOR)Make finished with errors\n$(NO_COLOR) MSG_BEGIN = -------- begin -------- MSG_END = -------- end -------- MSG_SIZE_BEFORE = Size before: -- cgit v1.2.3-70-g09d2 From b26ded3ab1c09e2a127feb5f4e22e97242ce77d7 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 20 Aug 2016 14:53:29 +0300 Subject: Comment the Makefile Also move some messages to message.mk --- Makefile | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- message.mk | 13 ++++++- 2 files changed, 124 insertions(+), 18 deletions(-) (limited to 'message.mk') diff --git a/Makefile b/Makefile index 9ca73b4ad..d70ac9a3b 100644 --- a/Makefile +++ b/Makefile @@ -2,15 +2,18 @@ ifndef VERBOSE .SILENT: endif +# Allow the silent with lower caps to work the same way as upper caps ifdef silent SILENT = $(silent) endif ifdef SILENT - SUB_IS_SILENT := $(silent) + SUB_IS_SILENT := $(SILENT) endif -override SILENT = false +# We need to make sure that silent is always turned off at the top level +# Otherwise the [OK], [ERROR] and [WARN] messags won't be displayed correctly +override SILENT := false ON_ERROR := error_occured=1 @@ -26,27 +29,44 @@ ABS_STARTING_DIR := $(dir $(ABS_STARTING_MAKEFILE)) ABS_ROOT_DIR := $(dir $(ABS_ROOT_MAKEFILE)) STARTING_DIR := $(subst $(ABS_ROOT_DIR),,$(ABS_STARTING_DIR)) -PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR)) - MAKEFILE_INCLUDED=yes +# Helper function to process the newt element of a space separated path +# It works a bit like the traditional functional head tail +# so the CURRENT_PATH_ELEMENT will beome the new head +# and the PATH_ELEMENTS are the rest that are still unprocessed define NEXT_PATH_ELEMENT $$(eval CURRENT_PATH_ELEMENT := $$(firstword $$(PATH_ELEMENTS))) $$(eval PATH_ELEMENTS := $$(wordlist 2,9999,$$(PATH_ELEMENTS))) endef +# We change the / to spaces so that we more easily can work with the elements +# separately +PATH_ELEMENTS := $(subst /, ,$(STARTING_DIR)) +# Initialize the path elements list for further processing $(eval $(call NEXT_PATH_ELEMENT)) +# This function sets the KEYBOARD; KEYMAP and SUBPROJECT to the correct +# variables depending on which directory you stand in. +# It's really a very simple if else chain, if you squint enough, +# but the makefile syntax makes it very verbose. +# If we are in a subfolder of keyboards 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) @@ -57,7 +77,8 @@ endif # Only consider folders with makefiles, to prevent errors in case there are extra folders KEYBOARDS := $(notdir $(patsubst %/Makefile,%,$(wildcard $(ROOT_DIR)/keyboards/*/Makefile))) -#Compability with the old make variables +#Compability with the old make variables, anything you specify directly on the command line +# always overrides the detected folders ifdef keyboard KEYBOARD := $(keyboard) endif @@ -71,29 +92,41 @@ ifdef keymap KEYMAP := $(keymap) endif +# Uncomment these for debugging #$(info Keyboard: $(KEYBOARD)) #$(info Keymap: $(KEYMAP)) #$(info Subproject: $(SUBPROJECT)) #$(info Keyboards: $(KEYBOARDS)) + +# Set the default goal depening on where we are running make from +# this handles the case where you run make without any arguments .DEFAULT_GOAL := all ifneq ($(KEYMAP),) ifeq ($(SUBPROJECT),) + # Inside a keymap folder, just build the keymap, with the + # default subproject .DEFAULT_GOAL := $(KEYBOARD)-$(KEYMAP) else + # Inside a subproject keyamp folder, build the keymap + # for that subproject .DEFAULT_GOAL := $(KEYBOARD)-$(SUBPROJECT)-$(KEYMAP) endif else ifneq ($(SUBPROJECT),) + # Inside a subproject folder, build all keymaps for that subproject .DEFAULT_GOAL := $(KEYBOARD)-$(SUBPROJECT)-allkm else ifneq ($(KEYBOARD),) + # 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 .DEFAULT_GOAL := $(KEYBOARD)-allsp-allkm endif -# Compare the start of the RULE_VARIABLE with the first argument($1) +# Compare the start of the RULE variable with the first argument($1) # If the rules equals $1 or starts with $1-, RULE_FOUND is set to true # and $1 is removed from the RULE variable -# Otherwise the RULE_FOUND variable is set to false +# Otherwise the RULE_FOUND variable is set to false, and RULE left as it was # The function is a bit tricky, since there's no built in $(startswith) function define COMPARE_AND_REMOVE_FROM_RULE_HELPER ifeq ($1,$$(RULE)) @@ -110,10 +143,12 @@ define COMPARE_AND_REMOVE_FROM_RULE_HELPER endif endef +# This makes it easier to call COMPARE_AND_REMOVE_FROM_RULE, since it makes it behave like +# a function that returns the value COMPARE_AND_REMOVE_FROM_RULE = $(eval $(call COMPARE_AND_REMOVE_FROM_RULE_HELPER,$1))$(RULE_FOUND) -# Recursively try to find a match +# Recursively try to find a 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 @@ -127,6 +162,7 @@ define TRY_TO_MATCH_RULE_FROM_LIST_HELPER endif endef +# Make it easier to call TRY_TO_MATCH_RULE_FROM_LIST TRY_TO_MATCH_RULE_FROM_LIST = $(eval $(call TRY_TO_MATCH_RULE_FROM_LIST_HELPER,$1))$(RULE_FOUND) define ALL_IN_LIST_LOOP @@ -139,47 +175,70 @@ define PARSE_ALL_IN_LIST $$(foreach ITEM$1,$2,$$(eval $$(call ALL_IN_LIST_LOOP,$1))) endef +# The entry point for rule parsing +# parses a rule in the format --- +# but this particular function only deals with the first part define PARSE_RULE RULE := $1 COMMANDS := + # If the rule starts with allkb, then continue the parsing from + # PARSE_ALL_KEYBOARDS ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allkb),true) $$(eval $$(call PARSE_ALL_KEYBOARDS)) + # If the rule starts with the name of a known keyboard, then continue + # the parsing from PARSE_KEYBOARD else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(KEYBOARDS)),true) $$(eval $$(call PARSE_KEYBOARD,$$(MATCHED_ITEM))) + # Otherwise use the KEYBOARD variable, which is determined either by + # the current directory you run make from, or passed in as an argument else ifneq ($$(KEYBOARD),) $$(eval $$(call PARSE_KEYBOARD,$$(KEYBOARD))) else $$(info make: *** No rule to make target '$1'. Stop.) + # Notice the tab instead of spaces below! exit 1 endif endef # $1 = Keyboard +# Parses a rule in the format -- +# the keyboard is already known when entering this function define PARSE_KEYBOARD CURRENT_KB := $1 # A subproject is any keyboard subfolder with a makefile SUBPROJECTS := $$(notdir $$(patsubst %/Makefile,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/*/Makefile))) + # if the rule starts with allsp, then continue with looping over all subprojects ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allsp),true) $$(eval $$(call PARSE_ALL_SUBPROJECTS)) + # A special case for matching the defaultsp (default subproject) else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,defaultsp),true) $$(eval $$(call PARSE_SUBPROJECT,defaultsp)) + # If the rule starts with the name of a known subproject else ifeq ($$(call TRY_TO_MATCH_RULE_FROM_LIST,$$(SUBPROJECTS)),true) $$(eval $$(call PARSE_SUBPROJECT,$$(MATCHED_ITEM))) + # Try to use the SUBPROJECT variable, which is either determined by the + # directory which invoked make, or passed as an argument to make else ifneq ($$(SUBPROJECT),) $$(eval $$(call PARSE_SUBPROJECT,$$(SUBPROJECT))) + # 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 else - # 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 $$(eval $$(call PARSE_SUBPROJECT,defaultsp)) endif endef +# if we are going to compile all keyboards, match the rest of the rule +# for each of them define PARSE_ALL_KEYBOARDS $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYBOARD,$(KEYBOARDS))) endef # $1 Subproject +# When entering this, the keyboard and subproject are known, so now we need +# to determine which keymaps are going to get compiled define PARSE_SUBPROJECT + # If we want to compile the default subproject, then we need to + # include the correct makefile to determine the actual name of it ifeq ($1,defaultsp) SUBPROJECT_DEFAULT= $$(eval include $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/Makefile) @@ -188,39 +247,54 @@ define PARSE_SUBPROJECT CURRENT_SP := $1 endif # If current subproject is empty (the default was not defined), and we have a list of subproject - # then make all + # then make all of them ifeq ($$(CURRENT_SP),) ifneq ($$(SUBPROJECTS),) CURRENT_SP := allsp endif endif + # The special allsp is handled later ifneq ($$(CURRENT_SP),allsp) + # get a list of all keymaps KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/keymaps/*/.))) ifneq ($$(CURRENT_SP),) + # if the subproject is defined, then also look for keymaps inside the subproject folder SP_KEYMAPS := $$(notdir $$(patsubst %/.,%,$$(wildcard $(ROOT_DIR)/keyboards/$$(CURRENT_KB)/$$(CURRENT_SP)/keymaps/*/.))) KEYMAPS := $$(sort $$(KEYMAPS) $$(SP_KEYMAPS)) endif + # 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 allkm was specified else ifeq ($$(call COMPARE_AND_REMOVE_FROM_RULE,allkm),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))) else + # Otherwise something is wrong with the target + # Try to give as much information as possible of what it it was trying to do ifeq ($$(CURRENT_SP),) $$(info make: *** No rule to make target '$$(CURRENT_KB)-$$(RULE)'. Stop.) else $$(info make: *** No rule to make target '$$(CURRENT_KB)-$$(CURRENT_SP)-$$(RULE)'. Stop.) endif + # Notice the tab instead of spaces below! exit 1 endif else + # As earlier mentione,d when allsb is specified, we call our self recursively + # for all of the subprojects $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_SUBPROJECT,$(SUBPROJECTS))) endif endef +# If we want to parse all subprojects, but the keyboard doesn't have any, +# then use defaultsp instead define PARSE_ALL_SUBPROJECTS ifeq ($$(SUBPROJECTS),) $$(eval $$(call PARSE_SUBPROJECT,defaultsp)) @@ -230,27 +304,36 @@ define PARSE_ALL_SUBPROJECTS endef # $1 Keymap +# This is the meat of compiling a keyboard, when entering this, everything is known +# keyboard, subproject, and keymap +# Note that we are not directly calling the command here, but instead building a list, +# which will later be processed define PARSE_KEYMAP CURRENT_KM = $1 # The rest of the rule is the target # Remove the leading "-" from the target, as it acts as a separator MAKE_TARGET := $$(patsubst -%,%,$$(RULE)) + # We need to generate an unique indentifer to append to the COMMANDS list COMMAND := COMMAND_KEYBOARD_$$(CURRENT_KB)_SUBPROJECT_$(CURRENT_SP)_KEYMAP_$$(CURRENT_KM) COMMANDS += $$(COMMAND) + # If we are compiling a keyboard without a subproject, we want to display just the name + # of the keyboard, otherwise keyboard/subproject ifeq ($$(CURRENT_SP),) KB_SP := $(CURRENT_KB) else KB_SP := $(CURRENT_KB)/$$(CURRENT_SP) endif + # Format it in bold KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR) + # Specify the variables that we are passing forward to submake MAKE_VARS := KEYBOARD=$$(CURRENT_KB) SUBPROJECT=$$(CURRENT_SP) KEYMAP=$$(CURRENT_KM) MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) + # And the first part of the make command MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET) - MAKE_MSG := Making $$(KB_SP) with keymap $(BOLD)$$(CURRENT_KM)$(NO_COLOR) - ifneq ($$(MAKE_TARGET),) - MAKE_MSG += and target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR) - endif - MAKE_MSG_FORMAT := $(AWK) '{ printf "%-118s", $$$$0;}' + # The message to display + MAKE_MSG := $$(MSG_MAKE_KB) + # We run the command differently, depending on if we want more output or not + # The true version for silent output and the false version otherwise COMMAND_true_$$(COMMAND) := \ printf "$$(MAKE_MSG)" | \ $$(MAKE_MSG_FORMAT); \ @@ -267,10 +350,14 @@ define PARSE_KEYMAP $$(MAKE_CMD) $$(MAKE_VARS) SILENT=false; endef +# Just parse all the keymaps for a specifc keyboard define PARSE_ALL_KEYMAPS $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS))) endef +# 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 +# from the command line define SET_SILENT_MODE ifdef SUB_IS_SILENT SILENT_MODE := $(SUB_IS_SILENT) @@ -291,9 +378,12 @@ SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile))) .PHONY: $(SUBPROJECTS) $(SUBPROJECTS): %: %-allkm +# Let's match everything, we handle all the rule parsing ourselves .PHONY: % %: + # 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; + # Check if the submodules are dirty, and display a warning if they are git submodule status --recursive 2>/dev/null | \ while IFS= read -r x; do \ case "$$x" in \ @@ -303,14 +393,20 @@ $(SUBPROJECTS): %: %-allkm done $(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 +error_occured=0; \ $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) \ if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi +# All should compile everything .PHONY: all all: all-keyboards +# Define some shortcuts, mostly for compability with the old syntax .PHONY: all-keyboards all-keyboards: allkb-allsp-allkm @@ -318,6 +414,7 @@ all-keyboards: allkb-allsp-allkm all-keyboards-defaults: allkb-allsp-default +# 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") BUILD_DATE := $(shell date +"%Y-%m-%d-%H:%M:%S") $(shell echo '#define QMK_VERSION "$(GIT_VERSION)"' > $(ROOT_DIR)/quantum/version.h) diff --git a/message.mk b/message.mk index f8fd38712..fb1a7a1f9 100644 --- a/message.mk +++ b/message.mk @@ -31,7 +31,7 @@ PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $ PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS) BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi; -MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR) +MAKE_MSG_FORMAT = $(AWK) '{ printf "%-118s", $$0;}' # Define Messages # English @@ -59,4 +59,13 @@ MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ git submodule sync --recursive\n\ git submodule update --init --recursive$(NO_COLOR)\n\n\ You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\ - or if you have modified the ChibiOS libraries yourself. \n\n \ No newline at end of file + or if you have modified the ChibiOS libraries yourself. \n\n +MSG_NO_CMP = $(ERROR_COLOR)Error:$(NO_COLOR)$(BOLD) cmp command not found, please install diffutils\n$(NO_COLOR) + +define GENERATE_MSG_MAKE_KB + MSG_MAKE_KB_ACTUAL := Making $$(KB_SP) with keymap $(BOLD)$$(CURRENT_KM)$(NO_COLOR) + ifneq ($$(MAKE_TARGET),) + MSG_MAKE_KB_ACTUAL += and target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR) + endif +endef +MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL) -- cgit v1.2.3-70-g09d2 From 27a673f5cf75747fe73641059aae60e9b53a1c78 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sun, 21 Aug 2016 17:14:38 +0300 Subject: The makefile actually calls build_test --- Makefile | 22 +++++++++++++++++----- build_keyboard.mk | 14 +------------- build_test.mk | 5 +++++ common.mk | 12 ++++++++++++ message.mk | 7 +++++++ 5 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 build_test.mk create mode 100644 common.mk (limited to 'message.mk') diff --git a/Makefile b/Makefile index 16e90f8e4..67b981d51 100644 --- a/Makefile +++ b/Makefile @@ -358,7 +358,6 @@ define PARSE_KEYMAP MAKE_TARGET := $$(patsubst -%,%,$$(RULE)) # We need to generate an unique indentifer to append to the COMMANDS list COMMAND := COMMAND_KEYBOARD_$$(CURRENT_KB)_SUBPROJECT_$(CURRENT_SP)_KEYMAP_$$(CURRENT_KM) - COMMANDS += $$(COMMAND) # If we are compiling a keyboard without a subproject, we want to display just the name # of the keyboard, otherwise keyboard/subproject ifeq ($$(CURRENT_SP),) @@ -370,13 +369,18 @@ define PARSE_KEYMAP KB_SP := $(BOLD)$$(KB_SP)$(NO_COLOR) # Specify the variables that we are passing forward to submake MAKE_VARS := KEYBOARD=$$(CURRENT_KB) SUBPROJECT=$$(CURRENT_SP) KEYMAP=$$(CURRENT_KM) - MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) # And the first part of the make command MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_keyboard.mk $$(MAKE_TARGET) # The message to display MAKE_MSG := $$(MSG_MAKE_KB) # We run the command differently, depending on if we want more output or not # The true version for silent output and the false version otherwise + $$(eval $$(call BUILD)) +endef + +define BUILD + MAKE_VARS += VERBOSE=$(VERBOSE) COLOR=$(COLOR) + COMMANDS += $$(COMMAND) COMMAND_true_$$(COMMAND) := \ printf "$$(MAKE_MSG)" | \ $$(MAKE_MSG_FORMAT); \ @@ -398,13 +402,21 @@ define PARSE_ALL_KEYMAPS $$(eval $$(call PARSE_ALL_IN_LIST,PARSE_KEYMAP,$$(KEYMAPS))) endef +define BUILD_TEST + TEST_NAME := $1 + MAKE_TARGET := $2 + COMMAND := $1 + MAKE_CMD := $$(MAKE) -r -R -C $(ROOT_DIR) -f build_test.mk $$(MAKE_TARGET) + MAKE_VARS := TEST=$$(TEST_NAME) + MAKE_MSG := $$(MSG_MAKE_TEST) + $$(eval $$(call BUILD)) +endef + define PARSE_TEST TEST_NAME := $$(firstword $$(subst -, ,$$(RULE))) TEST_TARGET := $$(subst $$(TEST_NAME),,$$(subst $$(TEST_NAME)-,,$$(RULE))) MATCHED_TESTS := $$(foreach TEST,$$(TEST_LIST),$$(if $$(findstring $$(TEST_NAME),$$(TEST)),$$(TEST),)) - $$(info Test name $$(TEST_NAME)) - $$(info Test target $$(TEST_TARGET)) - $$(info $$(MATCHED_TESTS)) + $$(foreach TEST,$$(MATCHED_TESTS),$$(eval $$(call BUILD_TEST,$$(TEST),$$(TEST_TARGET)))) endef diff --git a/build_keyboard.mk b/build_keyboard.mk index f843572f6..bbe571845 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -4,19 +4,7 @@ endif .DEFAULT_GOAL := all -include message.mk - - -# Directory common source filess exist -TOP_DIR = . -TMK_DIR = tmk_core -TMK_PATH = $(TOP_DIR)/$(TMK_DIR) -LIB_PATH = $(TOP_DIR)/lib - -QUANTUM_DIR = quantum -QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR) - -BUILD_DIR := $(TOP_DIR)/.build +include common.mk ifneq ($(SUBPROJECT),) TARGET ?= $(KEYBOARD)_$(SUBPROJECT)_$(KEYMAP) diff --git a/build_test.mk b/build_test.mk new file mode 100644 index 000000000..37ed8b568 --- /dev/null +++ b/build_test.mk @@ -0,0 +1,5 @@ +include common.mk + + +all: + echo Done $(TEST) \ No newline at end of file diff --git a/common.mk b/common.mk new file mode 100644 index 000000000..689fdf5a5 --- /dev/null +++ b/common.mk @@ -0,0 +1,12 @@ +include message.mk + +# Directory common source files exist +TOP_DIR = . +TMK_DIR = tmk_core +TMK_PATH = $(TOP_DIR)/$(TMK_DIR) +LIB_PATH = $(TOP_DIR)/lib + +QUANTUM_DIR = quantum +QUANTUM_PATH = $(TOP_DIR)/$(QUANTUM_DIR) + +BUILD_DIR := $(TOP_DIR)/.build \ No newline at end of file diff --git a/message.mk b/message.mk index fb1a7a1f9..96814986b 100644 --- a/message.mk +++ b/message.mk @@ -69,3 +69,10 @@ define GENERATE_MSG_MAKE_KB endif endef MSG_MAKE_KB = $(eval $(call GENERATE_MSG_MAKE_KB))$(MSG_MAKE_KB_ACTUAL) +define GENERATE_MSG_MAKE_TEST + MSG_MAKE_TEST_ACTUAL := Making test $(BOLD)$(TEST_NAME)$(NO_COLOR) + ifneq ($$(MAKE_TARGET),) + MSG_MAKE_TEST_ACTUAL += with target $(BOLD)$$(MAKE_TARGET)$(NO_COLOR) + endif +endef +MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) -- cgit v1.2.3-70-g09d2 From 7eefb34e7c4f162b9568ff880d0e4e5214e1b9c9 Mon Sep 17 00:00:00 2001 From: Fred Sundvik Date: Sat, 27 Aug 2016 14:53:57 +0300 Subject: Detect failures when running multiple tests Also add better output. --- Makefile | 13 +++++++++++-- message.mk | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'message.mk') diff --git a/Makefile b/Makefile index 5f5c46860..b7ef5f92a 100644 --- a/Makefile +++ b/Makefile @@ -415,7 +415,15 @@ define BUILD_TEST MAKE_MSG := $$(MSG_MAKE_TEST) $$(eval $$(call BUILD)) TEST_EXECUTABLE := $$(TEST_DIR)/$$(TEST_NAME).elf - TESTS += $$(TEST_EXECUTABLE) + TESTS += $$(TEST_NAME) + TEST_MSG := $$(MSG_TEST) + $$(TEST_NAME)_COMMAND := \ + printf "$$(TEST_MSG)\n"; \ + $$(TEST_EXECUTABLE); \ + if [ $$$$? -gt 0 ]; \ + then error_occured=1; \ + fi; \ + printf "\n"; endef define PARSE_TEST @@ -472,7 +480,8 @@ $(SUBPROJECTS): %: %-allkm +error_occured=0; \ $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) \ if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi;\ - $(foreach TEST,$(TESTS),$(TEST);) + $(foreach TEST,$(TESTS),$($(TEST)_COMMAND)) \ + if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi;\ # All should compile everything .PHONY: all diff --git a/message.mk b/message.mk index 96814986b..fa051fd71 100644 --- a/message.mk +++ b/message.mk @@ -76,3 +76,4 @@ define GENERATE_MSG_MAKE_TEST endif endef MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) +MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR) -- cgit v1.2.3-70-g09d2