#
# Macros for recursive invocations of make
#
# Inputs: 
# ~~~~~~~ 
# DIRS - list of sub-directories to invoke make in
# MAKEFILES - list of makefiles to be run
# NAMES - list of names of targets to be built
#

!include <$(ACE_ROOT)\include\makeinclude\make_flags.bor>

# We want to avoid all of this recursion if this is a multi-target sub-make.
!ifndef TARGET_NAME
# This is not a multi-target sub-make ...

!ifdef DIRS

all: $(DIRS)

# We use an extra level of make recursion to ensure the current directory is
# automatically restored when the sub-directory is finished.
$(DIRS):
	@echo Entering directory $<
	@$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f&&!
all:
	@cd $<
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -fMakefile.bor
!

# This ugliness is to remove extra spaces from between the items in the list.
DIRS_CLEAN_1 = $(DIRS) $(BLANK_SPACE)
DIRS_CLEAN_2 = $(DIRS_CLEAN_1: =%)
DIRS_CLEAN_3 = $(DIRS_CLEAN_2:%%=%)
DIRS_CLEAN_4 = $(DIRS_CLEAN_3:%%=%)
DIRS_CLEAN = $(DIRS_CLEAN_4:%=.Clean )

clean: $(DIRS_CLEAN)

# We use an extra level of make recursion to ensure the current directory is
# automatically restored when the sub-directory is finished.
$(DIRS_CLEAN):
	@echo Cleaning directory $(<:.Clean=)
	@$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f&&!
all:
	@cd $(<:.Clean=)
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -fMakefile.bor clean
!

# This ugliness is to remove extra spaces from between the items in the list.
DIRS_REALCLEAN_1 = $(DIRS) $(BLANK_SPACE)
DIRS_REALCLEAN_2 = $(DIRS_REALCLEAN_1: =%)
DIRS_REALCLEAN_3 = $(DIRS_REALCLEAN_2:%%=%)
DIRS_REALCLEAN_4 = $(DIRS_REALCLEAN_3:%%=%)
DIRS_REALCLEAN = $(DIRS_REALCLEAN_4:%=.RealClean )

realclean: $(DIRS_REALCLEAN)

# We use an extra level of make recursion to ensure the current directory is
# automatically restored when the sub-directory is finished.
$(DIRS_REALCLEAN):
	@echo Cleaning directory $(<:.RealClean=)
	@$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f&&!
all:
	@cd $(<:.RealClean=)
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -fMakefile.bor realclean
!

# This ugliness is to remove extra spaces from between the items in the list.
DIRS_INSTALL_1 = $(DIRS) $(BLANK_SPACE)
DIRS_INSTALL_2 = $(DIRS_INSTALL_1: =%)
DIRS_INSTALL_3 = $(DIRS_INSTALL_2:%%=%)
DIRS_INSTALL_4 = $(DIRS_INSTALL_3:%%=%)
DIRS_INSTALL = $(DIRS_INSTALL_4:%=.Install )

install: $(DIRS_INSTALL)

# We use an extra level of make recursion to ensure the current directory is
# automatically restored when the sub-directory is finished.
$(DIRS_INSTALL):
       @echo Installing directory $(<:.Install=)
       @$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f&&!
all:
       @cd $(<:.Install=)
       $(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -fMakefile.bor install
!

!endif

!ifdef MAKEFILES

# This ugliness is to remove extra spaces from between the items in the list.
MAKEFILES_ALL_1 = $(MAKEFILES) $(BLANK_SPACE)
MAKEFILES_ALL_2 = $(MAKEFILES_ALL_1: =%)
MAKEFILES_ALL_3 = $(MAKEFILES_ALL_2:%%=%)
MAKEFILES_ALL_4 = $(MAKEFILES_ALL_3:%%=%)
MAKEFILES_ALL = $(MAKEFILES_ALL_4:%=.All )

all: $(MAKEFILES_ALL)

$(MAKEFILES_ALL):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(<:.All=)

# This ugliness is to remove extra spaces from between the items in the list.
MAKEFILES_CLEAN_1 = $(MAKEFILES) $(BLANK_SPACE)
MAKEFILES_CLEAN_2 = $(MAKEFILES_CLEAN_1: =%)
MAKEFILES_CLEAN_3 = $(MAKEFILES_CLEAN_2:%%=%)
MAKEFILES_CLEAN_4 = $(MAKEFILES_CLEAN_3:%%=%)
MAKEFILES_CLEAN = $(MAKEFILES_CLEAN_4:%=.Clean )

clean: $(MAKEFILES_CLEAN)

$(MAKEFILES_CLEAN):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(<:.Clean=) clean

# This ugliness is to remove extra spaces from between the items in the list.
MAKEFILES_REALCLEAN_1 = $(MAKEFILES) $(BLANK_SPACE)
MAKEFILES_REALCLEAN_2 = $(MAKEFILES_REALCLEAN_1: =%)
MAKEFILES_REALCLEAN_3 = $(MAKEFILES_REALCLEAN_2:%%=%)
MAKEFILES_REALCLEAN_4 = $(MAKEFILES_REALCLEAN_3:%%=%)
MAKEFILES_REALCLEAN = $(MAKEFILES_REALCLEAN_4:%=.RealClean )

realclean: $(MAKEFILES_REALCLEAN)

$(MAKEFILES_REALCLEAN):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(<:.RealClean=) realclean

# This ugliness is to remove extra spaces from between the items in the list.
MAKEFILES_INSTALL_1 = $(MAKEFILES) $(BLANK_SPACE)
MAKEFILES_INSTALL_2 = $(MAKEFILES_INSTALL_1: =%)
MAKEFILES_INSTALL_3 = $(MAKEFILES_INSTALL_2:%%=%)
MAKEFILES_INSTALL_4 = $(MAKEFILES_INSTALL_3:%%=%)
MAKEFILES_INSTALL = $(MAKEFILES_INSTALL_4:%=.Install )

install: $(MAKEFILES_INSTALL)

$(MAKEFILES_INSTALL):
       $(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(<:.Install=) install

!endif

!ifdef NAMES

# This macro may be defined in the environment (e.g. the nightly build
# scripts) so we need to remove it.
!undef NAME

# Multi-target recursion assumes Makefile.bor. For multiple targets in
# makefiles with other names, you must set the MAKEFILE variable to the
# name of the file.
!ifndef MAKEFILE
MAKEFILE = Makefile.bor
!endif

# This ugliness is to remove extra spaces from between the items in the list.
NAMES_ALL_1 = $(NAMES) $(BLANK_SPACE)
NAMES_ALL_2 = $(NAMES_ALL_1: =%)
NAMES_ALL_3 = $(NAMES_ALL_2:%%=%)
NAMES_ALL_4 = $(NAMES_ALL_3:%%=%)
NAMES_ALL = $(NAMES_ALL_4:%=.All )

all: $(NAMES_ALL)

$(NAMES_ALL):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(MAKEFILE) -DTARGET_NAME=$(<:.All=)

# This ugliness is to remove extra spaces from between the items in the list.
NAMES_CLEAN_1 = $(NAMES) $(BLANK_SPACE)
NAMES_CLEAN_2 = $(NAMES_CLEAN_1: =%)
NAMES_CLEAN_3 = $(NAMES_CLEAN_2:%%=%)
NAMES_CLEAN_4 = $(NAMES_CLEAN_3:%%=%)
NAMES_CLEAN = $(NAMES_CLEAN_4:%=.Clean )

clean: $(NAMES_CLEAN)

$(NAMES_CLEAN):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(MAKEFILE) -DTARGET_NAME=$(<:.Clean=) clean

# This ugliness is to remove extra spaces from between the items in the list.
NAMES_REALCLEAN_1 = $(NAMES) $(BLANK_SPACE)
NAMES_REALCLEAN_2 = $(NAMES_REALCLEAN_1: =%)
NAMES_REALCLEAN_3 = $(NAMES_REALCLEAN_2:%%=%)
NAMES_REALCLEAN_4 = $(NAMES_REALCLEAN_3:%%=%)
NAMES_REALCLEAN = $(NAMES_REALCLEAN_4:%=.RealClean )

realclean: $(NAMES_REALCLEAN)

$(NAMES_REALCLEAN):
	$(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(MAKEFILE) -DTARGET_NAME=$(<:.RealClean=) realclean

# This ugliness is to remove extra spaces from between the items in the list.
NAMES_INSTALL_1 = $(NAMES) $(BLANK_SPACE)
NAMES_INSTALL_2 = $(NAMES_INSTALL_1: =%)
NAMES_INSTALL_3 = $(NAMES_INSTALL_2:%%=%)
NAMES_INSTALL_4 = $(NAMES_INSTALL_3:%%=%)
NAMES_INSTALL = $(NAMES_INSTALL_4:%=.Install )

install: $(NAMES_INSTALL)

$(NAMES_INSTALL):
       $(MAKE) -$(MAKEFLAGS) $(MAKE_FLAGS) -f$(MAKEFILE) -DTARGET_NAME=$(<:.Install=) install

!endif

!else
# This is a multi-target sub-make ...

# Set the name of the current target.
NAME = $(TARGET_NAME)

!endif
