-SUBDIRS = libs matita
-
-all: $(foreach d,$(SUBDIRS),all.$(d))
-opt: $(foreach d,$(SUBDIRS),opt.$(d))
-clean: $(foreach d,$(SUBDIRS),clean.$(d))
-distclean: $(foreach d,$(SUBDIRS),distclean.$(d))
-
-all.%:
- $(MAKE) -C $* all
-opt.%:
- $(MAKE) -C $* opt
-clean.%:
- $(MAKE) -C $* clean
-distclean.%:
- $(MAKE) -C $* distclean
-install.%:
- $(MAKE) -C $* install
-uninstall.%:
- $(MAKE) -C $* uninstall
+SUBDIRS = components matita
+
+ifeq ($(DISTRIBUTED),yes)
+# 'world' is the default target when distributed, otherwise 'all' is
+world: depend $(foreach d,$(SUBDIRS),rec@world@$(d))
+all: depend $(foreach d,$(SUBDIRS),rec@all@$(d))
+opt: depend $(foreach d,$(SUBDIRS),rec@opt@$(d))
+else
+all: $(foreach d,$(SUBDIRS),rec@all@$(d))
+opt: $(foreach d,$(SUBDIRS),rec@opt@$(d))
+world: depend $(foreach d,$(SUBDIRS),rec@world@$(d))
+endif
+depend: depend-stamp
+depend-stamp:
+ifeq ($(HAVE_OCAMLOPT),yes)
+ ifeq ($(DISTRIBUTED),yes)
+ $(MAKE) $(foreach d,$(SUBDIRS),rec@depend.opt@$(d))
+ else
+ $(MAKE) $(foreach d,$(SUBDIRS),rec@depend@$(d))
+ endif
+else
+ $(MAKE) $(foreach d,$(SUBDIRS),rec@depend@$(d))
+endif
+ $(H)touch depend-stamp
+
+clean:
+ $(H)make $(foreach d,$(SUBDIRS),rec@clean@$(d)) || true
+distclean:
+ $(H)make $(foreach d,$(SUBDIRS),rec@distclean@$(d)) || true
+ $(H)rm -rf .matita library-stamp depend-stamp
+install-indep: $(foreach d,$(SUBDIRS),rec@install-indep@$(d))
+install-arch: $(foreach d,$(SUBDIRS),rec@install-arch@$(d))
+install: install-indep install-arch
+uninstall: $(foreach d,$(SUBDIRS),rec@uninstall@$(d))
+
+rec@%:
+ $(MAKE) -C $(word 2, $(subst @, ,$*)) $(word 1, $(subst @, ,$*)) DESTDIR=$(shell pwd)/$(DESTDIR)
+
+# {{{ Distribution stuff
+
+ifeq ($(DISTRIBUTED),yes)
+library: library-stamp
+library-stamp:
+ $(MAKE) -C matita/ dist_library
+ touch $@
+endif