## Copyright 2017 Chris Johns <chrisj@rtems.org>
##
## The following builds in parallel. The subdirectories are
## expanded into separate rules and all the targets are listed
## and make runs as many as it can.
##
## A macro is defined and evaluated once for each directory. This
## creates the instance of the rule. Use $(info ...) to print them.
##
SUBDIRS_dot = $(filter .,$(_SUBDIRS))
SUBDIRS_no_dot = $(filter-out .,$(_SUBDIRS))
SUBDIRS_no_dot_no_wrapup = $(filter-out wrapup,$(SUBDIRS_no_dot))
SUBDIRS_wrapup = $(filter wrapup,$(SUBDIRS_no_dot))
SUBDIR_TARGET = $(subst /,-,$1)
PREINSTALL_TARGET = preinstall-$(call SUBDIR_TARGET,$(1))
preintstall_targets = $(if "$(SUBDIRS_dot)" ".",preinstall-dot) $(foreach D,$(SUBDIRS_no_dot),$(call PREINSTALL_TARGET,$(D)))
define PREINSTALL_DIR
.PHONY: $1
$1:
@+set fnord $(MAKEFLAGS); amf=$$$$2; \
subdir=$(2); \
subdir_label=`echo $(1) | sed -e 's/preinstall-//'`; \
target=`echo $$@ | sed -e 's/-recursive//' -e "s/-$$$${subdir_label}//"`$(3); \
echo "Making $$$$target in $$$$subdir"; \
(cd $$$$subdir && $(MAKE) $(AM_MAKEFLAGS) $$$$target) \
|| case "$$$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac;
endef
$(if "$(SUBDIRS_dot)" ".",$(eval $(call PREINSTALL_DIR,preinstall-dot,.,-am)))
$(foreach D,$(SUBDIRS_no_dot),$(eval $(call PREINSTALL_DIR,$(call PREINSTALL_TARGET,$(D)),$(D))))
preinstall: $(preintstall_targets)
.PHONY: preinstall
define CPUKITDIR
.PHONY: $1
$1: $(preintstall_targets)
@+set fnord $(MAKEFLAGS); amf=$$$$2; \
subdir=$(2); \
target=`echo $(MAKECMDGOALS) | sed s/-recursive//`; \
if test "$$$$target" = "all-local-am"; then \
target="all-am"; \
fi; \
if test "$$$$target" = "all-local"; then \
target="all"; \
fi; \
echo "Making $$$$target in $$$$subdir"; \
if test "$$$$subdir" != "."; then \
cd $$$$subdir; \
$(MAKE) $(AM_MAKEFLAGS) $$$$target; \
fi;
endef
#
# This GNU make syntax is being used to stop automake thinking the code is for
# it.
#
$(if "$(SUBDIRS_dot)" ".",$(eval $(call CPUKITDIR,dot,.)))
$(foreach D,$(SUBDIRS_no_dot),$(eval $(call CPUKITDIR,$(D),$(D))))
#
# If there is a wrapup make it depend on all other directories so it is not
# entered until they have finished.
#
$(if "$(SUBDIRS_wrapup)" "wrapup",wrapup: dot $(foreach D,$(SUBDIRS_no_dot_no_wrapup),$(D)),)
all-local: preinstall $(if "$(SUBDIRS_dot)" ".",dot) $(SUBDIRS_no_dot)