When you run make twice, the second time there are still some compilations performed. In fact, it never pacifies, which is a PITA.
One issue is the following.
In sdf-detgen/src/syn/Makefile.am, we have:
DetBoxedSdf.def: $(BUNDLED_BOXEDSDF)/share/boxedsdf/BoxedSdf2.def
and BoxedSdf2.def is built in boxedsdf/src/syn/Makefile.am (which is processed earlier, so this is a good point). But the recursive invocation of all the sub packages implies an installation: that's what tell Makefile.am:
| $(RECURSIVE_TARGETS): | @$(mkinstalldirs) $(TMPDIST) | @set fnord $$MAKEFLAGS; amf=$$2; \ | dot_seen=no; \ | target=`echo $@ | sed s/-recursive//`; \ | list='$(SUBDIRS)'; for subdir in $$list; do \ | echo "Making $$target in $$subdir"; \ | if test "$$subdir" = "."; then \ | dot_seen=yes; \ | local_target="$$target-am"; \ | else \ | local_target="$$target"; \ | fi; \ | (cd $$subdir && \ | $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ | || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ | inpreinstpkgs=false; \ | for i in $(PREINST_PKGS); do \ | test x"$$i" = x"$$subdir" && inpreinstpkgs=true; \ | done; \ | innopreinst=false; \ | for i in $(NO_PREINST); do \ | test x"$$i" = x"$$target" && innopreinst=true; \ | done; \ | if test $$inpreinstpkgs = true \ | && test $$innopreinst = false; then \ | (cd $$subdir && \ ===>>| $(MAKE) $(AM_MAKEFLAGS) DESTDIR=$(TMPDIST) install) \ | || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; \ | esac; \ | fi \ | done; \ | if test "$$dot_seen" = "no"; then \ | $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ | fi; test -z "$$fail"
This piece of code, when going into boxedsdf will install BoxedSdf2.def again, and then we're good for another set of useless compilation.
1. Do we really really need to preinstall things like this?
2. If we do, wouldn't it be better to install lazily: only if $cmp reports the files are different, so as to keep timestamps happy. This means using another install program...