diff --git a/Makefile b/Makefile
index 0ad6e8d9b0b3a04ed3d087bf3edd70fa5298146d..679094a9b2dd042f18df4bfcf5c898356b4f1419 100644
--- a/Makefile
+++ b/Makefile
@@ -118,12 +118,17 @@ $(if $(KBUILD_OUTPUT),, \
 # Check that OUTPUT directory is not the same as where we have kernel src
 $(if $(filter-out $(KBUILD_OUTPUT),$(shell /bin/pwd)),, \
      $(error Output directory (O=...) specifies kernel src dir))
-PHONY += $(MAKECMDGOALS)
 
-$(filter-out _all,$(MAKECMDGOALS)) _all:
+PHONY += $(MAKECMDGOALS) sub-make
+
+$(filter-out _all sub-make,$(MAKECMDGOALS)) _all: sub-make
+	$(Q)@:
+
+sub-make: FORCE
 	$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
 	KBUILD_SRC=$(CURDIR) \
-	KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@
+	KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \
+	$(filter-out _all sub-make,$(MAKECMDGOALS))
 
 # Leave processing to above invocation of make
 skip-makefile := 1
diff --git a/scripts/mkmakefile b/scripts/mkmakefile
index 7f9d544f9b6c07339021bdb80762feeb7b95f9bf..ee39facee15238f8f4148fc2b7e914f07a31b613 100644
--- a/scripts/mkmakefile
+++ b/scripts/mkmakefile
@@ -26,11 +26,13 @@ MAKEFLAGS += --no-print-directory
 
 .PHONY: all \$(MAKECMDGOALS)
 
+all	:= \$(filter-out all Makefile,\$(MAKECMDGOALS))
+
 all:
-	\$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT)
+	\$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$(all)
 
 Makefile:;
 
-\$(filter-out all Makefile,\$(MAKECMDGOALS)) %/:
-	\$(MAKE) -C \$(KERNELSRC) O=\$(KERNELOUTPUT) \$@
+\$(all) %/: all
+	@:
 EOF