[project @ 1998-01-30 17:07:42 by simonm]
[ghc-hetmet.git] / mk / target.mk
index e4ad31a..5474bb8 100644 (file)
@@ -59,6 +59,9 @@
 #
 .PHONY: depend
 
+# Compiler produced files that are targets of the source's imports.
+MKDEPENDHS_OBJ_SUFFICES=o
+
 depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS)
        @$(RM) .depend
        @touch .depend
@@ -69,17 +72,13 @@ ifneq "$(MKDEPENDC_SRCS)" ""
        $(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS)
 endif
 ifneq "$(MKDEPENDHS_SRCS)" ""
-ifeq ($(notdir $(MKDEPENDHS)),ghc)
-#      New way of doing dependencies: the ghc driver knows how to invoke script
-       $(MKDEPENDHS) -M -optdep-f -optdep.depend $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(MKDEPENDHS_OPTS) $(HC_OPTS) $(MKDEPENDHS_SRCS)
-else
-#      Old way: call mkdependHS-1.2
-       $(MKDEPENDHS) -f .depend $(MKDEPENDHS_OPTS) \
-               $(foreach way,$(WAYS),-s $(way)) \
-               -- $(HC_OPTS) -- $(MKDEPENDHS_SRCS)
-endif
+       $(MKDEPENDHS) -M -optdep-f -optdep.depend $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(foreach obj,$(MKDEPENDHS_OBJ_SUFFICES),-optdep-o -optdep$(obj)) $(MKDEPENDHS_OPTS) $(patsubst -odir,,$(HC_OPTS)) $(MKDEPENDHS_SRCS)
 endif
 
+# the above patsubst is a hack to remove the '-odir $*' from HC_OPTS
+# which is present when we're splitting objects.  The $* maps to
+# nothing, since this isn't a pattern rule, so we have to get rid of
+# the -odir too to avoid problems.
 
 ##################################################################
 #                      boot
@@ -369,17 +368,26 @@ ifneq "$(SCRIPT_PROG)" ""
 #
 # ToDo: make this work for shell scripts (drop the initial $).
 #
+ifeq "$(INTERP)" "$(SHELL)"
+SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$(val)=\\\"$($(val))\\\";\" >> $@;")
+else
 SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$$\"\"$(val)=\\\"$($(val))\\\";\" >> $@;")
+endif
 
 all :: $(SCRIPT_PROG)
 
+#
+# #! support under cygwin32 is not quite there yet, 
+# so we rely on the eval `trick' instead. On all other
+# platforms, we prepend #!$(INTERP)  -- SOF 6/97
+# 
+
 $(SCRIPT_PROG) :: $(SCRIPT_OBJS)
        $(RM) $@
        @echo Creating $@...
 ifeq "$(INTERP)" "perl"
 ifneq "$(BIN_DIST)" "1"
-       @echo "eval 'exec perl -S $$$""0 $$""{1+\"$$$""@\"}'"  > $@
-       @echo "      if $$""running_under_some_shell;"     >> $@
+       echo "#! "$(PERL) > $@
 else
        @touch $@
 endif
@@ -409,11 +417,11 @@ endif
 # For each of these variables that is defined, you
 # get one install rule
 #
-#      INSTALL_PROGS    install these executable programs in $(bindir)
-#      INSTALL_SCRIPTS  install these executable scripts in $(bindir)
-#      INSTALL_LIBS     install these platform-dependent libraries in $(libdir)
-#      INSTALL_LIBEXECS install these platform-dependent execs in $(libdir)
-#      INSTALL_DATAS    install these platform-independent files in $(datadir)
+#      INSTALL_PROGS     executable programs in $(bindir)
+#      INSTALL_SCRIPTS   executable scripts in $(bindir)
+#      INSTALL_LIBS      platform-dependent libraries in $(libdir) (ranlib'ed)
+#      INSTALL_LIBEXECS  platform-dependent execs in $(libdir)
+#      INSTALL_DATAS     platform-independent files in $(datadir)
 #
 # If the installation directory variable is undefined, the install rule simply
 # emits a suitable error message.
@@ -422,25 +430,34 @@ endif
 # friends can be overridden from their original settings in mk/config.mk.in
 # || mk/build.mk
 #
-.PHONY: install installdirs install-strip install-dirs uninstall install-docs
+.PHONY: install installdirs install-strip install-dirs uninstall install-docs show-install
+
+show-install :
+       @echo "bindir = $(bindir)"
+       @echo "libdir = $(libdir)"
+       @echo "libexecdir = $(libexecdir)  # by default, same as libdir"
+       @echo "datadir = $(datadir)  # unused for ghc project"
 
 #
 # Sometimes useful to separate out the creation of install directories 
 # from the installation itself.
 #
-installdirs ::
+install-dirs ::
        @$(INSTALL_DIR) $(bindir)
        @$(INSTALL_DIR) $(libdir)
        @$(INSTALL_DIR) $(libexecdir)
        @$(INSTALL_DIR) $(datadir)
 
 # Better do this first...
-install:: installdirs
+# but we won't for the moment, do it on-demand from
+# within the various install targets instead.
+#install:: install-dirs
 
 ifneq "$(INSTALL_PROGS)" ""
 install:: $(INSTALL_PROGS)
+       @$(INSTALL_DIR) $(bindir)
        for i in $(INSTALL_PROGS); do \
-               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir); \
        done
 endif
 
@@ -450,18 +467,19 @@ endif
 #
 ifneq "$(INSTALL_SCRIPTS)" ""
 install:: $(INSTALL_SCRIPTS)
+       @$(INSTALL_DIR) $(bindir)
 ifeq "$(INTERP)" "perl"
 ifneq "$(BIN_DIST)" "1"
        @for i in $(INSTALL_SCRIPTS); do \
           $(RM) $$i.tmp; \
-          echo "eval 'exec $(PERL) -S $$$""0 $$""{1+\"$$$""@\"}'"  > $$i.tmp ; \
-          echo "      if $$""running_under_some_shell;"           >> $$i.tmp ; \
-          echo $$"bindir='$(bindir)';"                            >> $$i.tmp ; \
-          echo $$"libdir='$(real_libdir)';"                       >> $$i.tmp ; \
-          echo $$"datadir='$(real_datadir)';"                     >> $$i.tmp ; \
+          echo "#! $(PERL)" > $$i.tmp ; \
+          echo '$$'"bindir='$(bindir)';"                            >> $$i.tmp ; \
+          echo '$$'"libdir='$(libdir)';"                            >> $$i.tmp ; \
+          echo '$$'"libexecdir='$(libexecdir)';"                    >> $$i.tmp ; \
+          echo '$$'"datadir='$(datadir)';"                          >> $$i.tmp ; \
           cat  $$i                                                >> $$i.tmp ; \
-          echo $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i $(bindir) ;    \
-          $(INSTALL_PROGRAM) $(filter-out -s,,$(INSTALL_BIN_OPTS)) $$i.tmp $(bindir)/$$i ; \
+          echo $(INSTALL_PROGRAM) $(filter-out -s,$(INSTALL_OPTS)) $$i.tmp $(bindir)/$$i ;    \
+          $(INSTALL_PROGRAM) $(filter-out -s,$(INSTALL_BIN_OPTS)) $$i.tmp $(bindir)/$$i ; \
           $(RM) $$i.tmp; \
        done
 else
@@ -478,15 +496,16 @@ endif
 
 ifneq "$(INSTALL_LIB_SCRIPTS)" ""
 install:: $(INSTALL_LIB_SCRIPTS)
+       @$(INSTALL_DIR) $(libdir)
 ifeq "$(INTERP)" "perl"
 ifneq "$(BIN_DIST)" "1"
        @for i in $(INSTALL_LIB_SCRIPTS); do \
           $(RM) $$i.tmp; \
-          echo "eval 'exec $(PERL) -S $$$""0 $$""{1+\"$$$""@\"}'"  > $$i.tmp ; \
-          echo "      if $$""running_under_some_shell;"           >> $$i.tmp ; \
-          echo $$"bindir='$(bindir)';"                            >> $$i.tmp ; \
-          echo $$"libdir='$(real_libdir)';"                       >> $$i.tmp ; \
-          echo $$"datadir='$(real_datadir)';"                     >> $$i.tmp ; \
+          echo "#! $(PERL)" > $$i.tmp ; \
+          echo '$$'"bindir='$(bindir)';"                            >> $$i.tmp ; \
+          echo '$$'"libdir='$(libdir)';"                            >> $$i.tmp ; \
+          echo '$$'"libexecdir='$(libexecdir)';"                    >> $$i.tmp ; \
+          echo '$$'"datadir='$(datadir)';"                          >> $$i.tmp ; \
           cat  $$i                                                >> $$i.tmp ; \
           echo $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i $(libdir) ;    \
           $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i.tmp $(libdir)/$$i ; \
@@ -506,15 +525,16 @@ endif
 
 ifneq "$(INSTALL_LIBEXEC_SCRIPTS)" ""
 install:: $(INSTALL_LIBEXEC_SCRIPTS)
+       @$(INSTALL_DIR) $(libexecdir)
 ifeq "$(INTERP)" "perl"
 ifneq "$(BIN_DIST)" "1"
        @for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
           $(RM) $$i.tmp; \
-          echo "eval 'exec $(PERL) -S $$$""0 $$""{1+\"$$$""@\"}'"  > $$i.tmp ; \
-          echo "      if $$""running_under_some_shell;"           >> $$i.tmp ; \
-          echo $$"bindir='$(bindir)';"                            >> $$i.tmp ; \
-          echo $$"libdir='$(real_libdir)';"                       >> $$i.tmp ; \
-          echo $$"datadir='$(real_datadir)';"                     >> $$i.tmp ; \
+          echo "#! $(PERL)" > $$i.tmp ; \
+          echo '$$'"bindir='$(bindir)';"                            >> $$i.tmp ; \
+          echo '$$'"libdir='$(libdir)';"                            >> $$i.tmp ; \
+          echo '$$'"libexecdir='$(libexecdir)';"                    >> $$i.tmp ; \
+          echo '$$'"datadir='$(datadir)';"                          >> $$i.tmp ; \
           cat  $$i                                                >> $$i.tmp ; \
           echo $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i $(libexecdir) ;    \
           $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i.tmp $(libexecdir)/$$i ; \
@@ -534,20 +554,29 @@ endif
 
 ifneq "$(INSTALL_LIBS)" ""
 install:: $(INSTALL_LIBS)
+       @$(INSTALL_DIR) $(libdir)
        for i in $(INSTALL_LIBS); do \
-               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
+               case $$i in \
+                 *.a) \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
+                   $(RANLIB) $(libdir)/`basename $$i` ;; \
+                 *) \
+                   $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
+               esac; \
        done
 endif
 
 ifneq "$(INSTALL_LIBEXECS)" ""
 install:: $(INSTALL_LIBEXECS)
+       @$(INSTALL_DIR) $(libexecdir)
        -for i in $(INSTALL_LIBEXECS); do \
-               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(libexecdir); \
        done
 endif
 
 ifneq "$(INSTALL_DATAS)" ""
 install:: $(INSTALL_DATAS)
+       @$(INSTALL_DIR) $(datadir)
        for i in $(INSTALL_DATAS); do \
                $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
        done
@@ -641,7 +670,7 @@ dist-pre::
        -rm -rf $(SRC_DIST_DIR)
        -rm -f $(SRC_DIST_NAME).tar.gz
        (cd $(FPTOOLS_TOP_ABS); find $(SRC_DIST_DIRS) -type d \( -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -exec $(MKDIRHIER) $(SRC_DIST_DIR)/{} \; \) ; )
-       (cd $(FPTOOLS_TOP_ABS); find $(SRC_DIST_DIRS) -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -type l -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; )
+       (cd $(FPTOOLS_TOP_ABS); find $(SRC_DIST_DIRS) -name CVS -prune -o -name SRC -prune -o -name tests -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -name "\#*" -prune -o -name ".\#*" -prune -o -type l -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; )
 
 #
 # After having created a shadow distribution tree and copied/linked
@@ -692,27 +721,27 @@ binary-dist-pre::
        -rm -rf $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)
        -rm -f $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME).tar.gz
        @for i in $(BIN_DIST_DIRS); do                   \
-         if (test -d "$$i"); then                       \
-          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \
-          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \
-          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \
-          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \
-          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion); \
-          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion); \
+         if test -d "$$i"; then                         \
+          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \
+          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \
+          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \
+          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \
+          echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion); \
+          $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion); \
           echo $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \
                        prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
                        exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
-                       bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion) ; \
+                       bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion) ; \
           $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \
                        prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
                        exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \
-                       bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \
-                       datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion) ; \
+                       bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \
+                       datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion) ; \
          fi; \
        done
 
@@ -761,11 +790,12 @@ TAGS:: $(SOURCES)
        @$(RM) TAGS
        @touch TAGS
 ifneq "$(HS_SRCS)" ""
-       $(HSTAGS) $(HSTAGS_OPTS) -- $(HS_SRCS)
+       $(HSTAGS) $(HSTAGS_OPTS) -- $(TAGS_HS_SRCS)
 endif
 ifneq "$(C_SRCS)" ""
-       etags -a $(C_SRCS)
+       etags -a $(TAGS_C_SRCS)
 endif
+       @( DEREFFED=`ls -l Makefile | sed -e 's/.*-> \(.*\)/\1/g'` && $(RM) `dirname $$DEREFFED`/TAGS && $(CP) TAGS `dirname $$DEREFFED` ) || echo TAGS file generated, perhaps copy over to source tree?
 
 #------------------------------------------------------------
 #                      Makefile debugging
@@ -776,63 +806,51 @@ endif
 show:
        @echo '$(VALUE)=$($(VALUE))'
 
-#------------------------------------------------------------
-#                      Documentation
-
+#--------------------------------------------------------------------------
+# SGML Documentation
+#
 .PHONY: dvi ps html info txt
 
-info:: $(DOC_INFO)
-dvi:: $(DOC_DVI)
-ps::  $(DOC_PS)
-html:: $(DOC_HTML)
-texi:: $(DOC_TEXI)
-txt:: $(DOC_TEXT)
-
-#
-# Building literate root documents requires extra treatment,
-# as the root files need to be processed different from other
-# literate files (`compile' them into .itex with the -S (standalone)
-# option) and then link together a master TeX document with
-# a -S option.
-#
-$(filter %.tex,$(patsubst %.lit,%.tex,$(DOC_SRCS))) :
-       @$(RM) $@
-       $(LIT2LATEX) -S -c $(LIT2LATEX_OPTS) -o $(patsubst %.tex,%.itex,$@) $(addsuffix .lit,$(basename $@))
-       $(LIT2LATEX) -S $(LIT2LATEX_OPTS) -o $@ $(addsuffix .itex,$(basename $@))
-       @chmod 444 $@
-#
-# Ditto for texi and html
-#
-$(filter %.texi,$(patsubst %.lit,%.texi,$(DOC_SRCS))) :
-       @$(RM) $@
-       $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.texi,%.itxi,$@) $(addsuffix .lit,$(basename $@))
-       $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o $@ $(addsuffix .itxi,$(basename $@))
-       @chmod 444 $@
-#
-# Rather than using lit2html, we opt for the lit-texi-html route,
-# and use texi2html as our HTML backend.
-# (Note: we need to change mkdependlit to get this really off the ground)
-#
-# If the generated html representation is split up into a myriad of files,
-# put the files in a subdirectory html/, if a monolith is created, park
-# the generated file in the same dir as the .lit file.
-#
-$(filter %.html,$(patsubst %.lit,%.html,$(DOC_SRCS))) : $(filter %.lit,$(DOC_SRCS))
-       $(RM) $@ $(patsubst %.html,%.texi,$@) $(patsubst %.html,%.itxi,$@)
-ifneq "$(filter -monolithic,$(TEXI2HTML_OPTS))" ""
-       $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.itxi,$@) $(addsuffix .lit,$(basename $@))
-       $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.texi,$@) $(addsuffix .itxi,$(basename $@))
-       $(TEXI2HTML) $(TEXI2HTML_OPTS) $(patsubst %.html,%.texi,$@)
-       cp $(TEXI2HTML_PREFIX)invisible.xbm .
+ifneq "$(SGML_DOC)" ""
+
+# multi-file SGML document: main document name is specified in $(SGML_DOC),
+# sub-documents (.sgml files) listed in $(SGML_SRCS).
+
+$(SGML_DOC).sgml : $(SGML_SRCS)
+       cat $(SGML_SRCS) > $(SGML_DOC).sgml
+
+SGML_DVI  = $(SGML_DOC).dvi
+SGML_PS   = $(SGML_DOC).ps
+SGML_INFO = $(SGML_DOC).info
+SGML_HTML = $(SGML_DOC).html
+SGML_TEXT = $(SGML_DOC).txt
+
+else # no SGML_DOC
+
+VSGML_SRCS = $(wildcard *.vsgml)
+
+ifneq "$(VSGML_SRCS)" ""
+SGML_SRCS  = $(addsuffix .sgml, $(basename $(VSGML_SRCS)))
 else
-       $(RM) html/$(basename $@)*
-       $(MKDIRHIER) html
-       $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.itxi,$@) $(addsuffix .lit,$(basename $@))
-       $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o html/$(patsubst %.html,%.texi,$@) $(addsuffix .itxi,$(basename $@))
-       (cd html; ../$(TEXI2HTML) $(TEXI2HTML_OPTS) $(patsubst %.html,%.texi,$@); cd ..)
-       cp $(TEXI2HTML_PREFIX)invisible.xbm html/
-       @touch $@
+SGML_SRCS  = $(wildcard *.sgml)
 endif
+
+SGML_DVI  = $(addsuffix  .dvi, $(basename $(SGML_SRCS)))
+SGML_PS   = $(addsuffix   .ps, $(basename $(SGML_SRCS)))
+SGML_INFO = $(addsuffix .info, $(basename $(SGML_SRCS)))
+SGML_HTML = $(addsuffix .html, $(basename $(SGML_SRCS)))
+SGML_TEXT = $(addsuffix  .txt, $(basename $(SGML_SRCS)))
+
+endif # SGML_DOC
+
+dvi  :: $(SGML_DVI)
+info :: $(SGML_INFO)
+html :: $(SGML_HTML)
+txt  :: $(SGML_TXT)
+ps   :: $(SGML_PS)
+
+CLEAN_FILES += $(SGML_TEXT) $(SGML_HTML) $(SGML_PS) $(SGML_DVI)
+
 ###########################################
 #
 #      Targets: clean
@@ -878,7 +896,8 @@ endif
 ifneq "$(HS_OBJS)" ""
 ifneq "$(filter -split-objs,$(HC_OPTS))" ""
 clean ::
-       find $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food;
+       find $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
+       -rmdir $(patsubst %.$(way_)o,%,$(HS_OBJS))
 endif
 endif
 
@@ -967,18 +986,30 @@ endif     # if way
 
 # No ways, so iterate over the SUBDIRS
 
+# note about recursively invoking make: we'd like make to drop all the
+# way back to the top level if it fails in any of the
+# sub(sub-...)directories.  This is done by setting the -e flag to the
+# shell during the loop, which causes an immediate failure if any of
+# the shell commands fail.
+
+# One exception: if the user gave the -i or -k flag to make in the
+# first place, we'd like to reverse this behaviour.  So we check for
+# these flags, and set the -e flag appropriately.  NOTE: watch out for
+# the --no-print-directory flag which is passed to recursive
+# invocations of make.
+
 ifeq "$(way)" ""
 ifneq "$(SUBDIRS)" ""
 
 all docs runtests boot TAGS clean veryclean maintainer-clean install info ::
-       @case '${MFLAGS}' in *[ik]*) set +e;; esac;
        @echo "------------------------------------------------------------------------"
        @echo "===fptools== Recursively making \`$@' in $(SUBDIRS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
-       @for i in $(SUBDIRS) ; do \
+       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
+       for i in $(SUBDIRS) ; do \
          echo "------------------------------------------------------------------------"; \
-         echo "==fptools== $(MAKE) $@;"; \
+         echo "==fptools== $(MAKE) $@ $(MFLAGS);"; \
          echo " in $(shell pwd)/$$i"; \
          echo "------------------------------------------------------------------------"; \
          $(MAKE) --no-print-directory -C $$i $(MFLAGS) $@; \
@@ -989,7 +1020,7 @@ all docs runtests boot TAGS clean veryclean maintainer-clean install info ::
        @echo "------------------------------------------------------------------------"
 
 dist ::
-       @case '${MFLAGS}' in *[ik]*) set +e;; esac; \
+       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
        for i in $(SUBDIRS) ; do \
          $(MKDIRHIER_PREFIX)mkdirhier $(SRC_DIST_DIR)/$$i; \
          $(MAKE) -C $$i $(MFLAGS) $@ SRC_DIST_DIR=$(SRC_DIST_DIR)/$$i; \
@@ -1017,7 +1048,8 @@ all docs runtests TAGS clean veryclean maintainer-clean install ::
        @echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
-       @for i in $(WAYS) ; do \
+       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
+       for i in $(WAYS) ; do \
          echo "------------------------------------------------------------------------"; \
          echo "==fptools== $(MAKE) way=$$i $@;"; \
          echo "PWD = $(shell pwd)"; \