+# If building without a per-project object directory, we can't build in parallel
+ifeq ($(OBJDIR),)
+ .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
+
+%: $(PROJECT_DIRECTORIES)
+ @echo . > /dev/null
+
+$(PROJECT_DIRECTORIES):
+ @$(MAKE) -C $@ $(MAKECMDGOALS)
+
+.PHONY: $(PROJECT_DIRECTORIES)