Reorganisation of the source tree
[ghc-hetmet.git] / mk / target.mk
index 9499aa9..0334896 100644 (file)
@@ -2,14 +2,14 @@
 #
 #                      target.mk
 #
-#              Standard targets for fptools
+#              Standard targets for GHC
 #
 #################################################################################
 
 #
 # This file contain three groups of target rules:
 #
-# 1.  FPtools targets
+# 1.  GHC targets
 #      depend*
 #      runtests*
 #
@@ -19,7 +19,7 @@
 #       install-docs*
 #      clean* distclean* mostlyclean* maintainer-clean*
 #      tags*
-#      dvi ps (no info) FPTOOLS adds: pdf rtf html
+#      dvi ps (no info) GHC adds: pdf rtf html chm HxS
 #      check
 #
 # 3. Some of the above targets have a version that
@@ -50,7 +50,7 @@ include $(TOP)/mk/package.mk
 include $(TOP)/mk/suffix.mk
 
 ##################################################################
-#              FPtools standard targets
+#              GHC standard targets
 #
 # depend:
 #
@@ -77,13 +77,11 @@ include $(TOP)/mk/suffix.mk
 # Compiler produced files that are targets of the source's imports.
 MKDEPENDHS_OBJ_SUFFICES=o
 
-ifneq "$(STAMP_PKG_CONF)" ""
+ifneq "$(BootingFromHc)" "YES"
 PKGCONF_DEP = $(STAMP_PKG_CONF)
-else
-PKGCONF_DEP =
 endif
 
-depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(STAMP_PKG_CONF)
+depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP)
        @$(RM) .depend
        @touch .depend
 ifneq "$(DOC_SRCS)" ""
@@ -180,7 +178,7 @@ endif
 # `TAGS'
 #      Update a tags table for this program.
 # 
-# `dvi' `ps' `pdf' `html' `rtf' 
+# `dvi' `ps' `pdf' `html' `chm' `HxS' `rtf' 
 #      Generate DVI/PS/PDF files for LaTeX/DocBook docs. Not everything is
 #      supported everywhere, but the intention is to standardise on DocBook
 #      producing all formats.
@@ -204,7 +202,7 @@ endif
 #      directories where files are installed, and their parent
 #      directories. There is a script called `mkinstalldirs' which is
 #      convenient for this; find it in the Texinfo package.
-#      (FPTOOLS: we use a close relative of the suggested script, situated
+#      (GHC: we use a close relative of the suggested script, situated
 #       in glafp-utils/mkdirhier -- SOF)
 
 
@@ -236,12 +234,12 @@ ifneq "$(HS_PROG)" ""
 all :: $(HS_PROG)
 
 ifneq "$(BootingFromHc)" "YES"
-$(HS_PROG) :: $(HS_OBJS)
-       $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS)
+$(HS_PROG) :: $(OBJS)
+       $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(OBJS)
 else
 # see bootstrap.mk
-$(HS_PROG) :: $(HS_OBJS)
-       $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(HS_OBJS) $(HC_BOOT_LIBS)
+$(HS_PROG) :: $(OBJS)
+       $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(OBJS) $(HC_BOOT_LIBS)
 endif
 endif
 
@@ -290,12 +288,14 @@ endif
 # whether HS_SRCS is empty or not.
 #
 
+# can't split objs in way 'u', so we disable it here
+ifeq "$(way)" "u"
+SplitObjs = NO
+endif
+
 ifneq "$(HS_SRCS)" ""
 ifeq "$(SplitObjs)" "YES"
 
-# can't split objs in way 'u', so we disable it here
-ifneq "$(way)" "u"
-
 SRC_HC_OPTS += -split-objs
 
 # We generate the archive into a temporary file libfoo.a.tmp, then
@@ -304,7 +304,7 @@ SRC_HC_OPTS += -split-objs
 ifeq "$(ArSupportsInput)" ""
 define BUILD_LIB
 $(RM) $@ $@.tmp
-(echo $(STUBOBJS) $(C_OBJS); $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print) | xargs $(AR) $@
+(echo $(STUBOBJS) $(C_OBJS) $(GC_C_OBJS); $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print) | xargs $(AR) $@
 $(RANLIB) $@
 endef
 else
@@ -312,6 +312,7 @@ define BUILD_LIB
 $(RM) $@ $@.tmp
 echo $(STUBOBJS) > $@.list
 echo $(C_OBJS) >> $@.list
+echo $(GC_C_OBJS) >> $@.list
 $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print >> $@.list
 $(AR) $(AR_OPTS) $@ $(ArSupportsInput) $@.list
 $(RM) $@.list
@@ -321,18 +322,6 @@ endif
 
 # Extra stuff for compiling Haskell files with $(SplitObjs):
 
-HC_SPLIT_PRE = \
-    $(RM) $@; if [ ! -d $(basename $@)_split ]; then mkdir $(basename $@)_split; else \
-    $(FIND) $(basename $@)_split -name '*.$(way_)o' -print | xargs $(RM) __rm_food; fi
-ifeq "$(GhcWithInterpreter)" "YES"
-HC_SPLIT_POST = (cd $(dir $@) && $(LD) -r $(LD_X) -o $(notdir $@) $(basename $(notdir $@))_split/*.$(way_)o)
-else
-HC_SPLIT_POST = touch $@
-endif # GhcWithInterpreter == YES
-
-SRC_HC_PRE_OPTS  += $(HC_SPLIT_PRE);
-SRC_HC_POST_OPTS += $(HC_SPLIT_POST);
-
 #
 # If (Haskell) object files are split, cleaning up 
 # consist of descending into the directories where
@@ -340,10 +329,9 @@ SRC_HC_POST_OPTS += $(HC_SPLIT_POST);
 #
 
 extraclean ::
-       $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
+       $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print -o -name ld.script -print | xargs $(RM) __rm_food
        -rmdir $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) > /dev/null 2>&1
 
-endif # $(way) == u
 endif # $(SplitObjs)
 endif # $(HS_SRCS)
 
@@ -354,7 +342,7 @@ endif # $(HS_SRCS)
 ifeq "$(StripLibraries)" "YES"
 ifeq "$(SplitObjs)" "YES"
 SRC_HC_POST_OPTS += \
-  for i in $(basename $@)_split/*; do \
+  for i in $(basename $@)_split/*.$(way_)o; do \
        $(LD) -r $(LD_X) -o $$i.tmp $$i; \
        $(MV) $$i.tmp $$i; \
   done
@@ -385,7 +373,7 @@ SRC_BLD_DLL_OPTS += --export-all --output-def=HS$(PACKAGE)$(_cbits)$(_way).def D
 ifneq "$(PACKAGE) $(IS_CBITS_LIB)" "std YES"
 ifneq "$(PACKAGE)" "rts"
 SRC_BLD_DLL_OPTS += -lHSstd_cbits_imp -L$(GHC_LIB_DIR)/std/cbits
-SRC_BLD_DLL_OPTS += -lHSrts_$(way_)imp -L$(GHC_RUNTIME_DIR)
+SRC_BLD_DLL_OPTS += -lHSrts_$(way_)imp -L$(GHC_RTS_DIR)
 ifneq "$(PACKAGE)" "std"
   ifeq "$(IS_CBITS_LIB)" ""
   SRC_BLD_DLL_OPTS += -lHSstd_$(way_)imp -L$(GHC_LIB_DIR)/std 
@@ -394,7 +382,7 @@ endif
 endif
 endif
 
-SRC_BLD_DLL_OPTS += -lgmp -L. -L$(GHC_RUNTIME_DIR)/gmp
+SRC_BLD_DLL_OPTS += -lgmp -L. -L$(GHC_RTS_DIR)/gmp
 ifeq "$(IS_CBITS_LIB)" ""
 SRC_BLD_DLL_OPTS += $(patsubst %,-lHS%_$(way_)imp, $(PACKAGE_DEPS))
 SRC_BLD_DLL_OPTS += $(patsubst %,-L../%, $(PACKAGE_DEPS))
@@ -682,7 +670,18 @@ install-dirs ::
 # within the various install targets instead.
 #install:: install-dirs
 
-ifneq "$(INSTALL_PROGS)" ""
+#
+# Setting user/group ownership for the installed entities
+#
+ifneq "$(INSTALL_OWNER)" ""
+SRC_INSTALL_OPTS += -o $(INSTALL_OWNER)
+endif
+ifneq "$(INSTALL_GROUP)" ""
+SRC_INSTALL_OPTS += -g $(INSTALL_GROUP)
+endif
+
+
+ifneq "$(strip $(INSTALL_PROGS))" ""
 
 #
 # Here's an interesting one - when using the win32 version
@@ -700,6 +699,9 @@ install:: $(INSTALL_PROGS)
        @for i in $(INSTALL_PROGS); do \
                    echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \
                    $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;  \
+                    if test "$(darwin_TARGET_OS)" = "1"; then \
+                      sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(bindir)/$$i ; \
+                    fi ; \
        done
 endif
 
@@ -707,7 +709,7 @@ endif
 # Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and
 # install without stripping.
 #
-ifneq "$(INSTALL_SCRIPTS)" ""
+ifneq "$(strip $(INSTALL_SCRIPTS))" ""
 install:: $(INSTALL_SCRIPTS)
        @$(INSTALL_DIR) $(bindir)
        for i in $(INSTALL_SCRIPTS); do \
@@ -715,7 +717,7 @@ install:: $(INSTALL_SCRIPTS)
        done
 endif
 
-ifneq "$(INSTALL_LIB_SCRIPTS)" ""
+ifneq "$(strip $(INSTALL_LIB_SCRIPTS))" ""
 install:: $(INSTALL_LIB_SCRIPTS)
        @$(INSTALL_DIR) $(libdir)
        for i in $(INSTALL_LIB_SCRIPTS); do \
@@ -723,7 +725,7 @@ install:: $(INSTALL_LIB_SCRIPTS)
        done
 endif
 
-ifneq "$(INSTALL_LIBEXEC_SCRIPTS)" ""
+ifneq "$(strip $(INSTALL_LIBEXEC_SCRIPTS))" ""
 install:: $(INSTALL_LIBEXEC_SCRIPTS)
        @$(INSTALL_DIR) $(libexecdir)
        for i in $(INSTALL_LIBEXEC_SCRIPTS); do \
@@ -731,7 +733,7 @@ install:: $(INSTALL_LIBEXEC_SCRIPTS)
        done
 endif
 
-ifneq "$(INSTALL_LIBS)" ""
+ifneq "$(strip $(INSTALL_LIBS))" ""
 install:: $(INSTALL_LIBS)
        @$(INSTALL_DIR) $(libdir)
        for i in $(INSTALL_LIBS); do \
@@ -743,13 +745,16 @@ install:: $(INSTALL_LIBS)
                    $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
                  *.so) \
                    $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
+                 *.dylib) \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir); \
+                   install_name_tool -id $(libdir)/`basename $$i` $(libdir)/`basename $$i` ;; \
                  *) \
                    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
                esac; \
        done
 endif
 
-ifneq "$(INSTALL_LIBEXECS)" ""
+ifneq "$(strip $(INSTALL_LIBEXECS))" ""
 #
 # See above comment next to defn of INSTALL_PROGS for what
 # the purpose of this one-liner is.
@@ -760,10 +765,13 @@ install:: $(INSTALL_LIBEXECS)
        @$(INSTALL_DIR) $(libexecdir)
        -for i in $(INSTALL_LIBEXECS); do \
                $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \
+                if test "$(darwin_TARGET_OS)" = "1"; then \
+                        sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(libexecdir)/`basename $$i` ; \
+                fi ; \
        done
 endif
 
-ifneq "$(INSTALL_DATAS)" ""
+ifneq "$(strip $(INSTALL_DATAS))" ""
 install:: $(INSTALL_DATAS)
        @$(INSTALL_DIR) $(datadir)
        for i in $(INSTALL_DATAS); do \
@@ -771,7 +779,7 @@ install:: $(INSTALL_DATAS)
        done
 endif
 
-ifneq "$(INSTALL_IFACES)" ""
+ifneq "$(strip $(INSTALL_IFACES))" ""
 install:: $(INSTALL_IFACES)
        @$(INSTALL_DIR) $(ifacedir)
        for i in $(INSTALL_IFACES); do \
@@ -779,7 +787,7 @@ install:: $(INSTALL_IFACES)
        done
 endif
 
-ifneq "$(INSTALL_IFACES_WITH_DIRS)" ""
+ifneq "$(strip $(INSTALL_IFACES_WITH_DIRS))" ""
 install:: $(INSTALL_IFACES_WITH_DIRS)
        @$(INSTALL_DIR) $(ifacedir)
        for i in $(INSTALL_IFACES_WITH_DIRS); do \
@@ -787,7 +795,7 @@ install:: $(INSTALL_IFACES_WITH_DIRS)
        done
 endif
 
-ifneq "$(INSTALL_INCLUDES)" ""
+ifneq "$(strip $(INSTALL_INCLUDES))" ""
 install:: $(INSTALL_INCLUDES)
        @$(INSTALL_DIR) $(includedir)
        for i in $(INSTALL_INCLUDES); do \
@@ -795,26 +803,35 @@ install:: $(INSTALL_INCLUDES)
        done
 endif
 
-ifneq "$(INSTALL_DOCS)" ""
+ifneq "$(strip $(INSTALL_DOCS))" ""
+ifneq "$(XMLDocWays)" ""
 install-docs:: $(INSTALL_DOCS)
        @$(INSTALL_DIR) $(datadir)      
        for i in $(INSTALL_DOCS); do \
                $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
        done
 endif
+endif
 
-ifneq "$(INSTALL_SGML_DOC)" ""
-ifneq "$(SGMLDocWays)" ""
-install-docs:: $(foreach i,$(SGMLDocWays),$(INSTALL_SGML_DOC).$i)
+# TODO: The following could be an entry for an Obfuscated Makefile Contest...
+ifneq "$(strip $(INSTALL_XML_DOC))" ""
+ifneq "$(XMLDocWays)" ""
+install-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-chunks,%.html,$(patsubst %.html,%/index.html,.$(i))))
        @$(INSTALL_DIR) $(datadir)      
-       @for i in $(SGMLDocWays); do \
+       @for i in $(XMLDocWays); do \
                if [ $$i = "html" ]; then \
                        $(INSTALL_DIR) $(datadir)/html; \
-                       echo $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \
-                       $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \
+                       $(INSTALL_DIR) $(datadir)/html/$(INSTALL_XML_DOC); \
+                       echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) )" ; \
+                       ( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) ) ; \
                else \
-                       echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
-                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
+                       $(INSTALL_DIR) $(datadir)/doc; \
+                       echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \
+                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \
+               fi; \
+               if [ $$i = "html-no-chunks" ]; then \
+                       echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \
+                       $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \
                fi \
        done
 endif
@@ -903,48 +920,50 @@ show:
 
 ################################################################################
 #
-#                      SGML Documentation
+#                      DocBook XML Documentation
 #
 ################################################################################
 
-.PHONY: dvi ps html pdf rtf
+.PHONY: html html-no-chunks chm HxS fo dvi ps pdf
 
-ifneq "$(SGML_DOC)" ""
+ifneq "$(XML_DOC)" ""
 
-all :: $(SGMLDocWays)
+all :: $(XMLDocWays)
 
-# multi-file SGML document: main document name is specified in $(SGML_DOC),
-# sub-documents (.sgml files) listed in $(SGML_SRCS).
+# multi-file XML document: main document name is specified in $(XML_DOC),
+# sub-documents (.xml files) listed in $(XML_SRCS).
 
-ifeq "$(SGML_SRCS)" ""
-SGML_SRCS = $(wildcard *.sgml)
+ifeq "$(XML_SRCS)" ""
+XML_SRCS = $(wildcard *.xml)
 endif
 
-SGML_TEX  = $(addsuffix .tex,$(SGML_DOC))
-SGML_DVI  = $(addsuffix .dvi,$(SGML_DOC))
-SGML_PS   = $(addsuffix .ps,$(SGML_DOC))
-SGML_PDF  = $(addsuffix .pdf,$(SGML_DOC))
-SGML_RTF  = $(addsuffix .rtf,$(SGML_DOC))
-SGML_HTML = $(addsuffix .html,$(SGML_DOC))
-# HTML output goes in a subdirectory on its own.
-SGML_TEXT = $(addsuffix .txt,$(SGML_DOC))
+XML_HTML           = $(addsuffix /index.html,$(basename $(XML_DOC)))
+XML_HTML_NO_CHUNKS = $(addsuffix .html,$(XML_DOC))
+XML_CHM            = $(addsuffix .chm,$(XML_DOC))
+XML_HxS            = $(addsuffix .HxS,$(XML_DOC))
+XML_FO             = $(addsuffix .fo,$(XML_DOC))
+XML_DVI            = $(addsuffix .dvi,$(XML_DOC))
+XML_PS             = $(addsuffix .ps,$(XML_DOC))
+XML_PDF            = $(addsuffix .pdf,$(XML_DOC))
 
-$(SGML_DVI) $(SGML_PS) $(SGML_HTML) $(SGML_TEXT) $(SGML_PDF) :: $(SGML_SRCS)
+$(XML_HTML) $(XML_NO_CHUNKS_HTML) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF) :: $(XML_SRCS)
 
-dvi  :: $(SGML_DVI)
-ps   :: $(SGML_PS)
-pdf  :: $(SGML_PDF)
-rtf  :: $(SGML_RTF)
-html :: $(SGML_HTML)
-txt  :: $(SGML_TEXT)
+html           :: $(XML_HTML)
+html-no-chunks :: $(XML_HTML_NO_CHUNKS)
+chm            :: $(XML_CHM)
+HxS            :: $(XML_HxS)
+fo             :: $(XML_FO)
+dvi            :: $(XML_DVI)
+ps             :: $(XML_PS)
+pdf            :: $(XML_PDF)
 
-CLEAN_FILES += $(SGML_TEXT) $(SGML_TEX) $(SGML_PS) $(SGML_DVI) $(SGML_PDF) $(SGML_RTF) $(SGML_HTML) $(SGML_DOC)-*.html
-# can't use $(SGML_SRCS) here, it was maybe used elsewhere
+CLEAN_FILES += $(XML_HTML_NO_CHUNKS) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF)
 
 extraclean ::
-       $(RM) -rf DBTOHTML_OUTPUT_*
-       $(RM) -rf *.junk/
-       $(RM) -rf $(SGML_DOC)
+       $(RM) -rf $(XML_DOC).out $(FPTOOLS_CSS) $(basename $(XML_DOC)) $(basename $(XML_DOC))-htmlhelp
+
+validate ::
+       $(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml
 endif
 
 ##############################################################################
@@ -990,6 +1009,11 @@ maintainer-clean:: extraclean
 # Expects:     $(WAYS)                 the possible "way" strings to one of 
 #                                      which $(way) will be set
 
+ifneq "$(way)" ""
+ifeq "$(findstring $(way), $(WAYS))" ""
+$(error Unknown way $(way))
+endif
+endif
 
 # So how does $(way) ever get set to anything?  Answer, we recursively
 # invoke make, setting $(way) on the command line.
@@ -1053,21 +1077,21 @@ ifeq "$(way)" ""
 # since these are way-independent
 all docs TAGS clean distclean mostlyclean maintainer-clean install ::
        @echo "------------------------------------------------------------------------"
-       @echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..."
+       @echo "== Recursively making \`$@' for ways: $(WAYS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
 # Don't rely on -e working, instead we check exit return codes from sub-makes.
        @case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
        for i in $(WAYS) ; do \
          echo "------------------------------------------------------------------------"; \
-         echo "==fptools== $(MAKE) way=$$i $@;"; \
+         echo "== $(MAKE) way=$$i $@;"; \
          echo "PWD = $(shell pwd)"; \
          echo "------------------------------------------------------------------------"; \
          $(MAKE) way=$$i --no-print-directory $(MFLAGS) $@ ; \
          if [ $$? -eq 0 ] ; then true; else exit $$x_on_err; fi; \
        done
        @echo "------------------------------------------------------------------------"
-       @echo "===fptools== Finished recursively making \`$@' for ways: $(WAYS) ..."
+       @echo "== Finished recursively making \`$@' for ways: $(WAYS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
 
@@ -1119,7 +1143,7 @@ endif
 # the --no-print-directory flag which is passed to recursive
 # invocations of make.
 #
-#ifeq "$(way)" ""
+ifeq "$(way)" ""
 ifneq "$(SUBDIRS)" ""
 
 # we override the 'boot', 'all' and 'install' targets in the top
@@ -1145,28 +1169,28 @@ INSTALL_TARGET = install
 INSTALL_DOCS_TARGET = install-docs
 endif
 
-$(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean maintainer-clean $(INSTALL_TARGET) $(INSTALL_DOCS_TARGET) html ps dvi txt::
+$(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean maintainer-clean $(INSTALL_TARGET) $(INSTALL_DOCS_TARGET) html chm HxS ps dvi txt::
        @echo "------------------------------------------------------------------------"
-       @echo "===fptools== Recursively making \`$@' in $(SUBDIRS) ..."
+       @echo "== Recursively making \`$@' in $(SUBDIRS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
 # Don't rely on -e working, instead we check exit return codes from sub-makes.
        @case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \
        for i in $(SUBDIRS); do \
          echo "------------------------------------------------------------------------"; \
-         echo "==fptools== $(MAKE) $@ $(MFLAGS);"; \
+         echo "== $(MAKE) $@ $(MFLAGS);"; \
          echo " in $(shell pwd)/$$i"; \
          echo "------------------------------------------------------------------------"; \
          $(MAKE) --no-print-directory -C $$i $(MFLAGS) $@; \
          if [ $$? -eq 0 -o $$x_on_err -eq 0 ] ;  then true; else exit 1; fi; \
        done
        @echo "------------------------------------------------------------------------"
-       @echo "===fptools== Finished making \`$@' in $(SUBDIRS) ..."
+       @echo "== Finished making \`$@' in $(SUBDIRS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
 
 endif
-#endif
+endif
 
 #
 # Selectively building subdirectories.
@@ -1176,3 +1200,17 @@ ifneq "$(SUBDIRS)" ""
 $(SUBDIRS) ::
          $(MAKE) -C $@ $(MFLAGS)
 endif
+
+# -----------------------------------------------------------------------------
+# Further cleaning
+
+# Sometimes we want to clean things only after the recursve cleaning
+# has heppened (eg. if the files we're about to remove would affect
+# the recursive traversal).
+
+distclean::
+       rm -f $(LATE_DIST_CLEAN_FILES)
+
+maintainer-clean::
+       rm -f $(LATE_DIST_CLEAN_FILES)
+