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...