#
# Makefile
#

include Makefile.conf

PID          := $(shell echo $$$$)
PREFIX        = nice -n 19 /usr/bin/time --format='%E (%U)' -o /dev/shm/t-$(PID)
POSTFIX       = && cat /dev/shm/t-$(PID) | xargs -I "%" echo -en '\033[100D\033[60C$1' "%\n" && rm -f /dev/shm/t-$(PID)

ARNAME        = $(notdir $(CURDIR)).$(ARCH).a

SUBDIRS      := $(wildcard */.)
SUBDIRS      := $(foreach dir,$(SUBDIRS),$(subst /.,,$(dir)))
FILTER        = doc%
SUBDIRS      := $(filter-out $(FILTER),$(SUBDIRS))
SUBDIRARS     = $(foreach dir,$(SUBDIRS),$(dir)/$(dir).a)

LOCALSOURCES  = $(wildcard *.cpp *.cc)
LOCALOBJECTS := $(LOCALSOURCES:.cpp=.$(ARCH).o)
LOCALOBJECTS := $(LOCALOBJECTS:.cc=.$(ARCH).o)
LOCALDEPENDS  = $(LOCALOBJECTS:.o=.d)
SOURCES       = $(wildcard *.cpp */*.cpp */*/*.cpp */*/*/*.cpp)
OBJECTS       = $(SOURCES:.cpp=.$(ARCH).o)
DEPENDS       = $(OBJECTS:.o=.d)
TARGETS       =


$(LOCALOBJECTS): | $(SUBDIRS)
$(OBJECTS): | $(SUBDIRS)

artifacts: $(LOCALOBJECTS)

.DEFAULT_GOAL := artifacts

-include Makefile.target

ifneq ($(MAKECMDGOALS),clean)
-include $(LOCALDEPENDS)
endif

%.$(ARCH).d: %.cpp
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo -n " [MM] $@"
	@$(PREFIX) $(CC) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@ $(POSTFIX)

%.$(ARCH).o: %.cpp
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo -n " [CC] $@"
	@$(PREFIX) $(CC) -c $(CFLAGS) $< -o $@ $(POSTFIX)

%.$(ARCH).d: %.cc
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo -n " [MM] $@"
	@$(PREFIX) $(CC) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@ $(POSTFIX)

%.$(ARCH).o: %.cc
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo -n " [CC] $@"
	@$(PREFIX) $(CC) -c $(CFLAGS) $< -o $@ $(POSTFIX)

$(ARNAME): $(SUBDIRS) $(LOCALOBJECTS)
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo -n " [AR] $@"
	@$(PREFIX) $(AR) rcuT $@ $(LOCALOBJECTS) $(SUBDIRARS) $(POSTFIX)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo " <$@>"
	@$(MAKE) -s -S -C $@ artifacts
	@depth=$(MAKELEVEL); \
	while [ $${depth} -gt 0 ] ; do \
		echo -n " "; \
		depth=`expr $$depth - 1`; \
	done; \
	true
	@echo " </$@>"

.PHONY: all
all: $(TARGETS)

.PHONY: clean
clean:
	@for dir in $(SUBDIRS); do \
		depth=$(MAKELEVEL); \
		while [ $${depth} -gt 0 ] ; do \
			echo -n " "; \
			depth=`expr $$depth - 1`; \
		done; \
		echo " <$$dir>"; \
		$(MAKE) -s -S -C $$dir $@; \
		while [ $${depth} -gt 0 ] ; do \
			echo -n " "; \
			depth=`expr $$depth - 1`; \
		done; \
		echo " </$$dir>"; \
	done; \
	true
	@rm -f $(LOCALOBJECTS) $(LOCALDEPENDS) $(ARNAME) $(TARGETS) || true
