]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - Makefile
Compare Makefile with itself instead of using `--help`
[qmk_firmware.git] / Makefile
index 67b981d51ebb6e988acb173ca8334d08047d3ec9..636eae3e5b4e3177fdcf7c70a0af949588705bd1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,10 @@ ifndef VERBOSE
 .SILENT:
 endif
 
+# 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:
+
 # Allow the silent with lower caps to work the same way as upper caps
 ifdef silent
     SILENT = $(silent)
@@ -28,6 +32,9 @@ 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))
+BUILD_DIR := $(ROOT_DIR)/.build
+TEST_DIR := $(BUILD_DIR)/test
+ERROR_FILE := $(BUILD_DIR)/error_occured
 
 MAKEFILE_INCLUDED=yes
 
@@ -394,7 +401,10 @@ define BUILD
         fi;
     COMMAND_false_$$(COMMAND) := \
         printf "$$(MAKE_MSG)\n\n"; \
-        $$(MAKE_CMD) $$(MAKE_VARS) SILENT=false;
+        $$(MAKE_CMD) $$(MAKE_VARS) SILENT=false; \
+        if [ $$$$? -gt 0 ]; \
+            then error_occured=1; \
+        fi;
 endef
 
 # Just parse all the keymaps for a specifc keyboard
@@ -410,12 +420,29 @@ define BUILD_TEST
     MAKE_VARS := TEST=$$(TEST_NAME)
     MAKE_MSG := $$(MSG_MAKE_TEST)
     $$(eval $$(call BUILD))
+    ifneq ($$(MAKE_TARGET),clean)
+        TEST_EXECUTABLE := $$(TEST_DIR)/$$(TEST_NAME).elf
+        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";
+    endif
 endef
 
 define PARSE_TEST
+    TESTS :=
     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),))
+    ifeq ($$(TEST_NAME),all)
+        MATCHED_TESTS := $$(TEST_LIST)
+    else
+        MATCHED_TESTS := $$(foreach TEST,$$(TEST_LIST),$$(if $$(findstring $$(TEST_NAME),$$(TEST)),$$(TEST),))
+    endif
     $$(foreach TEST,$$(MATCHED_TESTS),$$(eval $$(call BUILD_TEST,$$(TEST),$$(TEST_TARGET))))
 endef
 
@@ -435,8 +462,21 @@ endef
 
 include $(ROOT_DIR)/message.mk
 
-RUN_COMMAND = \
-$(COMMAND_$(SILENT_MODE)_$(COMMAND))
+# The empty line is important here, as it will force a new shell to be created for each command
+# Otherwise the command line will become too long with a lot of keyboards and keymaps
+define RUN_COMMAND
++error_occured=0;\
+$(COMMAND_$(SILENT_MODE)_$(COMMAND))\
+if [ $$error_occured -gt 0 ]; then echo $$error_occured > $(ERROR_FILE); fi;
+
+
+endef
+define RUN_TEST
++error_occured=0;\
+$($(TEST)_COMMAND))\
+if [ $$error_occured -gt 0 ]; then echo $$error_occured > $(ERROR_FILE); fi;
+
+endef
 
 # Allow specifying just the subproject, in the keyboard directory, which will compile all keymaps
 SUBPROJECTS := $(notdir $(patsubst %/Makefile,%,$(wildcard ./*/Makefile)))
@@ -447,7 +487,7 @@ $(SUBPROJECTS): %: %-allkm
 .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;
+       cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/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 \
@@ -456,20 +496,21 @@ $(SUBPROJECTS): %: %-allkm
                        *) printf "$(MSG_SUBMODULE_DIRTY)";break;; \
                esac \
        done
+       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
-       +error_occured=0; \
-       $(foreach COMMAND,$(COMMANDS),$(RUN_COMMAND)) \
-       if [ $$error_occured -gt 0 ]; then printf "$(MSG_ERRORS)" & exit $$error_occured; fi
-       
+       $(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;
 
 # All should compile everything
 .PHONY: all
-all: all-keyboards 
+all: all-keyboards test-all
 
 # Define some shortcuts, mostly for compability with the old syntax
 .PHONY: all-keyboards
@@ -478,6 +519,11 @@ all-keyboards: allkb-allsp-allkm
 .PHONY: all-keyboards-defaults
 all-keyboards-defaults: allkb-allsp-default
 
+.PHONY: test
+test: test-all
+
+.PHONY: test-clean
+test-clean: test-all-clean
 
 # 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")
@@ -485,4 +531,4 @@ 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_BUILDDATE "$(BUILD_DATE)"' >> $(ROOT_DIR)/quantum/version.h)
 
-include $(ROOT_DIR)/testlist.mk
\ No newline at end of file
+include $(ROOT_DIR)/testlist.mk