~ruther/qmk_firmware

b0317abe42289d5b391a2255dc1c97e4242d9a57 — Jack Humbert 8 years ago f44ead1 + d956dd1
Merge pull request #857 from fredizzimo/fix_makefile_too_long_bash

Run each sumbmake in a separate shell
1 files changed, 23 insertions(+), 8 deletions(-)

M Makefile
M Makefile => Makefile +23 -8
@@ 32,7 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))
TEST_DIR := $(ROOT_DIR)/.build/test
BUILD_DIR := $(ROOT_DIR)/.build
TEST_DIR := $(BUILD_DIR)/test
ERROR_FILE := $(BUILD_DIR)/error_occured

MAKEFILE_INCLUDED=yes



@@ 460,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)))


@@ 481,17 496,17 @@ $(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 TEST,$(TESTS),$($(TEST)_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