+#[ Rules and Depends ]##################################################{{{#
+
+AUTO_DEPENDS += filter_c
+filter_c = $(addprefix $2/,$(patsubst %.c,%.o,$(filter %.c,$1)))
+
+# this is some ad-hoc last resort dependency method
+%.a: FORCE
+ @$(MAKE) -q -rC $(dir $(@D)) $(_cobjs)/$(@F) || $(MAKE) -rC $(dir $(@D)) $(_cobjs)/$(@F)
+
+# this implicit rule is used to force directory existence, without depending
+# on the directory itself, since its mtime changes too often.
+%/.exists: Makefile $(CONFDIR)/$(wildcard *.mk)
+ @$(RM) -r $*
+ @-mkdir -p $*
+ @touch $@
+# We don't want make to remove these files because of default rules.
+.PRECIOUS: %/.exists
+
+define RULE_C_tpl
+$(_cobjs)/$1/%.o: %.c $(_cobjs)/$1/.exists
+ $(CC) $$(CFLAGS) $$($1_CPPFLAGS) $2 -MMD -MT "$$(@D)/$$*.d $$(@D)/$$*.o" -MF $$(@D)/$$*.d -g -c -o $$@ $$<
+
+$(_cobjs)/$1/%.d: %.c $(_cobjs)/$1/.exists
+ @$(CPP) $$(CFLAGS) $$($1_CPPFLAGS) $2 -MM -MT "$$(@D)/$$*.d $$(@D)/$$*.o" -MF $$(@D)/$$*.d $$<
+
+-include $$(wildcard $(_cobjs)/$1/*.d) /dev/null
+endef
+
+########################################################################}}}#
+#[ Classes ]############################################################{{{#
+
+deps_create = $(foreach f,$(AUTO_DEPENDS),$(call $f,$1,$2))
+
+define CLASS_LIBRARIES_tpl
+all:: $1.so
+
+$1.so: $(_cobjs)/$1/.exists $$(call deps_create,$$($1_SOURCES),$(_cobjs)/$1)
+ $(CC) $$(CFLAGS) $$($1_CPPFLAGS) -fPIC -shared -o $$@ \
+ $$(filter %.o,$$^) $$(LDFLAGS) $$($1_LDFLAGS) $$($1_LIBADD)
+
+$$(eval $$(call RULE_C_tpl,$1,-fPIC $2))
+
+clean::
+ $(RM) $1.so
+endef
+$(foreach l, \
+ $(foreach l,$(filter %_LIBRARIES,$(.VARIABLES)),$($l)), \
+ $(eval $(call CLASS_LIBRARIES_tpl,$l,)))
+
+#define CLASS_EXE_tpl
+#all:: $1
+#$1: $(_cobjs)/$1/.exists $$(call deps_create,$$($1_SOURCES),$(_cobjs)/$1)
+# $(CC) -o $$@ $$(CFLAGS) $$($1_CPPFLAGS) $$(filter %.o,$$^) \
+# $$(LDFLAGS) $$($1_LDFLAGS) $$(filter %.a,$$^)
+#
+#$$(eval $$(call RULE_C_tpl,$1,$2))
+#
+#clean::
+# $(RM) $1
+#endef
+#$(foreach x,$(__EXE__),$(eval $(call CLASS_EXE_tpl,$x,)))
+
+########################################################################}}}#
+#[ Candy ]##############################################################{{{#
+
+echo-root:
+ @echo $(DEPTH)
+
+echo-tags:
+ @echo $(DEPTH)/.tags
+
+ifeq (".","$(DEPTH)")
+tags:
+ ctags -o .$@ --recurse=yes --exclude=.svn --exclude=\*.mk --totals=yes;
+
+distclean clober::
+ $(RM) -f .tags
+else
+tags:
+ $(MAKE) -C $(DEPTH) $@
+endif
+
+.PHONY: tags
+
+########################################################################}}}#
+
+all check clobber distclean::
+ @set -e $(patsubst %,; $(MAKE) -rC % $@,$(SUBDIRS))
+
+CLEAN_RECURSE=1
+clean::
+ $(RM) -r $(_cobjs)
+ @$(if $(CLEAN_RECURSE),$(patsubst %,$(MAKE) -rC % $@;,$(SUBDIRS)))
+
+clobber distclean:: CLEAN_RECURSE=
+clobber distclean:: clean
+ $(RM) -r .objs*
+
+.PHONY: all check clean clobber distclean FORCE