diff --git a/Bootloaders/makefile b/Bootloaders/makefile
index 01aa506fd56302e9c28fbbed442b2ac87adcc50a..ba4f51259c20883c0e267f676c7e9f6c8c74505d 100644
--- a/Bootloaders/makefile
+++ b/Bootloaders/makefile
@@ -22,10 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Demos/Device/ClassDriver/makefile b/Demos/Device/ClassDriver/makefile
index ad880009111bda00847607033ed45f6f26968d20..3a5615e05a55098c73798391bb285415d887fdaa 100644
--- a/Demos/Device/ClassDriver/makefile
+++ b/Demos/Device/ClassDriver/makefile
@@ -22,10 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Demos/Device/LowLevel/makefile b/Demos/Device/LowLevel/makefile
index ad880009111bda00847607033ed45f6f26968d20..3a5615e05a55098c73798391bb285415d887fdaa 100644
--- a/Demos/Device/LowLevel/makefile
+++ b/Demos/Device/LowLevel/makefile
@@ -22,10 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Demos/DualRole/ClassDriver/makefile b/Demos/DualRole/ClassDriver/makefile
index 741383f18a0b969f6f5e6052753b02b2b56b9bbf..71fb805ef4d6a9e1581ef7d9078bcc9c21b96d59 100644
--- a/Demos/DualRole/ClassDriver/makefile
+++ b/Demos/DualRole/ClassDriver/makefile
@@ -22,11 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
 
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Demos/Host/ClassDriver/makefile b/Demos/Host/ClassDriver/makefile
index d9a3dc3594875aeafc72253cfd5b4a5b5c8f5b3d..a2b14c8a6e63838ad15d655c6b91551f8a5ab1fb 100644
--- a/Demos/Host/ClassDriver/makefile
+++ b/Demos/Host/ClassDriver/makefile
@@ -22,10 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Demos/Host/LowLevel/makefile b/Demos/Host/LowLevel/makefile
index d9a3dc3594875aeafc72253cfd5b4a5b5c8f5b3d..a2b14c8a6e63838ad15d655c6b91551f8a5ab1fb 100644
--- a/Demos/Host/LowLevel/makefile
+++ b/Demos/Host/LowLevel/makefile
@@ -22,10 +22,23 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
diff --git a/Projects/makefile b/Projects/makefile
index 2bc9f98b19d204081bc8ebf74a9492973f404fec..ec8e65b8b795e41cf2a6eae90d1b455d862057ea 100644
--- a/Projects/makefile
+++ b/Projects/makefile
@@ -22,10 +22,24 @@ ifeq ($(MAKELEVEL), 10)
    $(error EMERGENCY ABORT: INFINITE RECURSION DETECTED)
 endif
 
-all:
+# If building without a per-project object directory, we can't build in parallel
 ifeq ($(OBJDIR),)
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) clean all;)
+   .NOTPARALLEL:
+
+   # Ensure projects are pre-cleaned if the target is the default or "all"
+   ifeq ($(MAKECMDGOALS),)
+      MAKECMDGOALS := clean all
+   endif
+   ifneq ($(findstring all, $(MAKECMDGOALS)),)
+      MAKECMDGOALS := clean $(MAKECMDGOALS)
+   endif
 endif
 
-%:
-	@$(foreach PROJECT, $(PROJECT_DIRECTORIES), $(MAKE) -C $(PROJECT) $@;)
+%: $(PROJECT_DIRECTORIES)
+	@echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+	@$(MAKE) -C $@ $(MAKECMDGOALS)
+    
+.PHONY: $(PROJECT_DIRECTORIES)
+