[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / mk / target.mk
index 5474bb8..3011f21 100644 (file)
@@ -69,7 +69,7 @@ ifneq "$(DOC_SRCS)" ""
        $(MKDEPENDLIT) -o .depend $(MKDEPENDLIT_OPTS) $(filter %.lit,$(DOC_SRCS))
 endif
 ifneq "$(MKDEPENDC_SRCS)" ""
-       $(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS)
+       $(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS) 
 endif
 ifneq "$(MKDEPENDHS_SRCS)" ""
        $(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)
@@ -324,6 +324,23 @@ endef
 endif # $(filter...
 endif
 
+#
+# Remove local symbols from library objects if requested.
+#
+
+ifeq "$(StripLibraries)" "YES"
+ifneq "$(filter -split-objs,$(HC_OPTS))" ""
+SRC_HC_POST_OPTS += \
+  for i in $(basename $@)/*; do \
+       ld -r -x -o $$i.tmp $$i; \
+       $(MV) $$i.tmp $$i; \
+  done
+else
+SRC_HC_POST_OPTS += \
+  ld -r -x -o $@.tmp $@; $(MV) $@.tmp $@
+endif
+endif
+
 $(LIBRARY) :: $(LIBOBJS)
        $(BUILD_LIB)
 endif
@@ -407,6 +424,31 @@ endif
        @echo Done.
 endif
 
+# links to script programs: we sometimes install a script as
+# <name>-<version> with a link from <name> to the real script.
+
+ifneq "$(SCRIPT_LINK)" ""
+all :: $(SCRIPT_LINK)
+
+#
+# Don't want to overwrite $(SCRIPT_LINK)s that aren't symbolic
+# links. Testing for symbol links is problematic to do in
+# a portable fashion using a /bin/sh test, so we simply rely
+# on perl.
+#
+$(SCRIPT_LINK) : $(SCRIPT_PROG)
+       @if ( $(PERL) -e '$$fn="$(SCRIPT_LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
+          echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK)"; \
+          $(RM) $(SCRIPT_LINK); \
+          $(LN_S) $(SCRIPT_PROG) $(SCRIPT_LINK); \
+        else \
+          echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) failed: \`$(SCRIPT_LINK)' already exists"; \
+          echo "Perhaps remove \`$(SCRIPT_LINK)' manually?"; \
+          exit 1; \
+        fi;
+endif
+
+
 
 ###########################################
 #
@@ -456,8 +498,9 @@ install-dirs ::
 ifneq "$(INSTALL_PROGS)" ""
 install:: $(INSTALL_PROGS)
        @$(INSTALL_DIR) $(bindir)
-       for i in $(INSTALL_PROGS); do \
-               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir); \
+       @for i in $(INSTALL_PROGS); do \
+               echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir); \
+               $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir);      \
        done
 endif
 
@@ -478,7 +521,7 @@ ifneq "$(BIN_DIST)" "1"
           echo '$$'"libexecdir='$(libexecdir)';"                    >> $$i.tmp ; \
           echo '$$'"datadir='$(datadir)';"                          >> $$i.tmp ; \
           cat  $$i                                                >> $$i.tmp ; \
-          echo $(INSTALL_PROGRAM) $(filter-out -s,$(INSTALL_OPTS)) $$i.tmp $(bindir)/$$i ;    \
+          echo $(INSTALL_PROGRAM) $(filter-out -s,$(INSTALL_BIN_OPTS)) $$i.tmp $(bindir)/$$i ;    \
           $(INSTALL_PROGRAM) $(filter-out -s,$(INSTALL_BIN_OPTS)) $$i.tmp $(bindir)/$$i ; \
           $(RM) $$i.tmp; \
        done
@@ -586,30 +629,30 @@ endif
 # Use with care..
 #
 uninstall:: 
-ifeq ($(INSTALL_PROGS),)
-       @for i in $(INSTALL_PROGS) ; do                         \
+       @for i in $(INSTALL_PROGS) "" ; do                      \
+         if test "$$i"; then                                   \
                echo rm -f $(bindir)/`basename $$i`;            \
                rm -f $(bindir)/`basename $$i`;                 \
+         fi;                                                   \
        done
-endif
-ifeq ($(INSTALL_LIBS),)
-       @for i in $(INSTALL_LIBS); do                           \
+       @for i in $(INSTALL_LIBS) ""; do                        \
+         if test "$$i"; then                                   \
                echo rm -f $(libdir)/`basename $$i`;            \
                rm -f $(libdir)/`basename $$i`;                 \
+         fi;                                                   \
        done
-endif
-ifeq ($(INSTALL_LIBEXECS),)
-       @for i in $(INSTALL_LIBEXECS); do                       \
+       @for i in $(INSTALL_LIBEXECS) ""; do                    \
+         if test "$$i"; then                                   \
                echo rm -f $(libexecdir)/`basename $$i`;        \
                rm -f $(libexecdir)/`basename $$i`;             \
+         fi;                                                   \
        done
-endif
-ifeq ($(INSTALL_DATAS),)
-       @for i in $(INSTALL_DATAS); do                          \
+       @for i in $(INSTALL_DATAS) ""; do                       \
+         if test "$$i"; then                                   \
                echo rm -f $(datadir)/`basename $$i`;           \
                rm -f $(datadir)/`basename $$i`;                \
+         fi;                                                   \
        done
-endif
 
 #
 # install-strip is from the GNU Makefile standard.
@@ -619,6 +662,23 @@ install-strip::
        @$(MAKE) EXTRA_INSTALL_OPTS='-s' install                                        
 endif
 
+#
+# install links to script drivers.
+#
+ifneq "$(SCRIPT_LINK)" ""
+install ::
+       @if ( $(PERL) -e '$$fn="$(bindir)/$(SCRIPT_LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
+          echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) in $(bindir)"; \
+          $(RM) $(bindir)/$(SCRIPT_LINK); \
+          $(LN_S) $(SCRIPT_PROG) $(bindir)/$(SCRIPT_LINK); \
+        else \
+          echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) in $(bindir) failed: \`$(bindir)/$(SCRIPT_LINK)' already exists"; \
+          echo "Perhaps remove \`$(bindir)/$(SCRIPT_LINK)' manually?"; \
+          exit 1; \
+        fi;
+
+endif
+
 ###########################################
 #
 #      Targets: dist binary-dist
@@ -685,29 +745,18 @@ dist-post::
        ( cd $(SRC_DIST_DIR) ; cd .. ; find $(SRC_DIST_NAME) -type d -exec sh -c 'test x`ls $$0 | wc -l | sed -e "s/ //g"` = x0' {} \; -print -exec rm -rf {} \; -prune )
        ( cd $(SRC_DIST_DIR) ; cd .. ; chmod -R a+rw $(SRC_DIST_NAME) ) 
 
-dist-package::
-       cd $(SRC_DIST_DIR); cd ..; $(TAR) chzf $(SRC_DIST_NAME).tar.gz $(SRC_DIST_NAME)
+# Automatic generation of a MANIFEST file for a source distribution
+# tree that is ready to go.
+dist-manifest ::
+       cd $(SRC_DIST_DIR); find . \( -type l -o -type f \) -exec ls -lLG {} \; | sed -e 's/\.\///' > /tmp/MANIFEST ; mv /tmp/MANIFEST MANIFEST
 
-#
+dist-package:: dist-package-tar-gz
 
+dist-package-tar-gz ::
+       cd $(SRC_DIST_DIR); cd ..; $(TAR) chzf $(SRC_DIST_NAME).tar.gz $(SRC_DIST_NAME)
 
-# The default dist rule:
-#
-# copy/link the contents of $(SRC_DIST_FILES) into the
-# shadow distribution tree. SRC_DIST_FILES contain the
-# build-generated files that you want to include in
-# a source distribution.
-#
-#
-ifneq "$(SRC_DIST_FILES)" ""
-dist::
-       @for i in $(SRC_DIST_FILES); do                  \
-         if (test -f "$$i"); then                       \
-           echo $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ; \
-           $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ;      \
-         fi;                                            \
-       done;
-endif
+dist-package-zip ::
+       cd $(SRC_DIST_DIR); cd ..; $(ZIP) $(ZIP_OPTS) -r $(SRC_DIST_NAME).zip $(SRC_DIST_NAME)
 
 #
 # binary-dist creates a binary bundle, set BIN_DIST_NAME
@@ -784,18 +833,18 @@ check:: $(TESTS)
 #------------------------------------------------------------
 #                      Tags
 
-.PHONY: TAGS
+.PHONY: TAGS tags
 
-TAGS:: $(SOURCES)
+tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS)
        @$(RM) TAGS
        @touch TAGS
-ifneq "$(HS_SRCS)" ""
+ifneq "$(TAGS_HS_SRCS)" ""
        $(HSTAGS) $(HSTAGS_OPTS) -- $(TAGS_HS_SRCS)
 endif
-ifneq "$(C_SRCS)" ""
+ifneq "$(TAGS_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?
+       @( DEREFFED=`ls -l Makefile | sed -e 's/.*-> \(.*\)/\1/g'` && $(RM) `dirname $$DEREFFED`/TAGS && $(CP) TAGS `dirname $$DEREFFED` ) 2>/dev/null || echo TAGS file generated, perhaps copy over to source tree?
 
 #------------------------------------------------------------
 #                      Makefile debugging
@@ -816,32 +865,25 @@ 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
-
+ifeq "$(VSGML_SRCS)" ""
 VSGML_SRCS = $(wildcard *.vsgml)
+endif
 
+ifeq "$(SGML_SRCS)" ""
 ifneq "$(VSGML_SRCS)" ""
-SGML_SRCS  = $(addsuffix .sgml, $(basename $(VSGML_SRCS)))
+SGML_SRCS = $(patsubst %.vsgml, %.sgml, $(VSGML_SRCS))
 else
-SGML_SRCS  = $(wildcard *.sgml)
+SGML_SRCS = $(wildcard *.sgml)
+endif
 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)))
+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
 
-endif # SGML_DOC
+$(SGML_DVI) $(SGML_PS) $(SGML_INFO) $(SGML_HTML) $(SGML_TEXT) :: $(SGML_SRCS)
 
 dvi  :: $(SGML_DVI)
 info :: $(SGML_INFO)
@@ -849,7 +891,9 @@ html :: $(SGML_HTML)
 txt  :: $(SGML_TXT)
 ps   :: $(SGML_PS)
 
-CLEAN_FILES += $(SGML_TEXT) $(SGML_HTML) $(SGML_PS) $(SGML_DVI)
+CLEAN_FILES += $(SGML_TEXT) $(SGML_DOC)*.html $(SGML_PS) $(SGML_DVI)
+
+endif
 
 ###########################################
 #
@@ -897,7 +941,7 @@ ifneq "$(HS_OBJS)" ""
 ifneq "$(filter -split-objs,$(HC_OPTS))" ""
 clean ::
        find $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
-       -rmdir $(patsubst %.$(way_)o,%,$(HS_OBJS))
+       -rmdir $(patsubst %.$(way_)o,%,$(HS_OBJS)) > /dev/null 2>&1
 endif
 endif
 
@@ -997,6 +1041,10 @@ endif     # if way
 # 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.
+#
+# NOTE: Truly weird use of exit below to stop the for loop dead in
+# its tracks should any of the sub-makes fail. By my reckoning, 
+#  "cmd || exit $?" should be equivalent to "cmd"
 
 ifeq "$(way)" ""
 ifneq "$(SUBDIRS)" ""
@@ -1006,13 +1054,15 @@ all docs runtests boot TAGS clean veryclean maintainer-clean install info ::
        @echo "===fptools== Recursively making \`$@' in $(SUBDIRS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
-       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
-       for i in $(SUBDIRS) ; do \
+# 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 " 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) ..."
@@ -1020,14 +1070,40 @@ all docs runtests boot TAGS clean veryclean maintainer-clean install info ::
        @echo "------------------------------------------------------------------------"
 
 dist ::
-       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
+# 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 \
          $(MKDIRHIER_PREFIX)mkdirhier $(SRC_DIST_DIR)/$$i; \
          $(MAKE) -C $$i $(MFLAGS) $@ SRC_DIST_DIR=$(SRC_DIST_DIR)/$$i; \
+         if [ $$? -eq 0 ] ;  then true; else exit $$x_on_err; fi; \
        done
 endif
 endif
 
+# The default dist rule:
+#
+# copy/link the contents of $(SRC_DIST_FILES) into the
+# shadow distribution tree. SRC_DIST_FILES contain the
+# build-generated files that you want to include in
+# a source distribution.
+#
+#
+ifneq "$(SRC_DIST_FILES)" ""
+dist::
+       @for i in $(SRC_DIST_FILES); do                  \
+         if ( echo "$$i" | grep "~" >/dev/null 2>&1 ); then     \
+           echo $(LN_S) `pwd`/`echo $$i | sed -e "s/^\([^~]*\)~.*/\1/g"` $(SRC_DIST_DIR)/`echo $$i | sed -e "s/.*~\(.*\)/\1/g"` ; \
+           $(LN_S) `pwd`/`echo $$i | sed -e "s/^\([^~]*\)~.*/\1/g"` $(SRC_DIST_DIR)/`echo $$i | sed -e "s/.*~\(.*\)/\1/g"` ; \
+         else \
+           if (test -f "$$i"); then                       \
+             echo $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ; \
+             $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ;      \
+            fi;                                           \
+         fi; \
+       done;
+endif
+
+
 #
 # Selectively building subdirectories.
 #
@@ -1041,20 +1117,22 @@ ifneq "$(WAYS)" ""
 ifeq "$(way)" ""
 
 # NB: the targets exclude 
-#      boot info TAGS
+#      boot info TAGS runtests
 # since these are way-independent
-all docs runtests TAGS clean veryclean maintainer-clean install ::
+all docs TAGS clean veryclean maintainer-clean install ::
        @echo "------------------------------------------------------------------------"
        @echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..."
        @echo "PWD = $(shell pwd)"
        @echo "------------------------------------------------------------------------"
-       @case '${MFLAGS}' in *-[ik]*) set +e;; *-r*[ik]*) set +e;; *) set -e;; esac; \
+# 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 "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) ..."