+ $(V_M4)-DFWHOST=$* base.m4 $*.m4 $(MAIN_M4_SOURCES) >$@.new
+ $(V_AT)chmod +x $@.new && mv $@.new $@
+
+clean:; rm -f $(TARGETS) *.new $(CLEANFILES)
+.PHONY: clean
+
+###--------------------------------------------------------------------------
+### Installation.
+
+## The local machine doesn't want the complicated SSH stuff.
+THISHOST = $(shell hostname)
+OTHERHOSTS = $(filter-out $(THISHOST), $(HOSTS))
+
+## Testing.
+check: $(THISHOST).sh
+ $(ROOT) ./$(THISHOST).sh test
+
+## Installation on a local host,
+install/$(THISHOST): $(THISHOST).sh
+ [ "x$(SCRIPTS)" = x ] || $(ROOT) install -m755 $(SCRIPTS) $(sbindir)
+ $(ROOT) ./$(THISHOST).sh replace </dev/tty
+
+## Installation on a remote host.
+$(addprefix install/, $(OTHERHOSTS)): install/%: %.sh
+ if [ "x$(SCRIPTS)" != x ]; then \
+ for i in $(SCRIPTS); do \
+ $(ROOT) scp $$i root@$*:$(sbindir)/$$i.new && \
+ $(ROOT) ssh root@$* \
+ 'cd $(sbindir) && chmod 755 $$i.new && mv $$i.new $i' || \
+ exit 1; \
+ done; \
+ fi
+ $(ROOT) scp $*.sh root@$*:$(FIREWALL).new
+ $(ROOT) ssh root@$* $(FIREWALL).new remote-prepare
+ $(ROOT) ssh root@$* $(FIREWALL).new remote-commit
+ $(ROOT) ssh root@$* rm -f $(FIREWALL).new