#
# Makefile
#

include Makefile.conf

ARNAME        = $(notdir $(CURDIR)).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=.o)
LOCALOBJECTS := $(LOCALOBJECTS:.cc=.o)
LOCALDEPENDS  = $(LOCALOBJECTS:.o=.d)
SOURCES       = $(wildcard *.cpp */*.cpp */*/*.cpp */*/*/*.cpp)
OBJECTS       = $(SOURCES:.cpp=.o)
DEPENDS       = $(OBJECTS:.o=.d)
TARGETS       =

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

artifacts: $(LOCALOBJECTS)

.DEFAULT_GOAL := artifacts

-include Makefile.target

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

%.d: %.cpp
	$(info [MM] $@)
	@$(CC) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@

%.o: %.cpp
	$(info [CC] $@)
	@nice -n 19 $(CC) -c $(CFLAGS) $< -o $@

%.d: %.cc
	$(info [MM] $@)
	@$(CC) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@

%.o: %.cc
	$(info [CC] $@)
	@nice -n 19 $(CC) -c $(CFLAGS) $< -o $@

$(ARNAME): $(SUBDIRS) $(LOCALOBJECTS)
	$(info [AR] $@)
	@nice -n 19 $(AR) rcuT $@ $(LOCALOBJECTS) $(SUBDIRARS)

.PHONY: $(SUBDIRS)
$(SUBDIRS):
	@$(MAKE) -S -C $@ artifacts

.PHONY: all
all: $(TARGETS)

.PHONY: clean
clean:
	@for dir in $(SUBDIRS); do \
		$(MAKE) -S -C $$dir $@; \
	done
	@rm -f $(LOCALOBJECTS) $(LOCALDEPENDS) $(ARNAME) $(TARGETS) || true
