[project @ 2002-02-12 15:17:13 by simonmar]
[ghc-hetmet.git] / mk / target.mk
index f48ebbd..cf73e23 100644 (file)
 # 
 #
 
-
-##################################################################
-#
-#              Recursive stuff
-#
-# At the top of the file so that recursive makes happen before
-# makes in the main directory. This is needed for some targets,
-# e.g. when building DLLs in hslibs.
-#
 ##################################################################
+# Pre-compute the list of sources so we don't have to do this 
+# multiple times.  See paths.mk.
 
-# Here are the diabolically clever rules that
-# 
-# (a) for each "recursive target" <t>
-#     propagates "make <t>" to directories in SUBDIRS
-#
-# (b) when SUBDIRS is empty,
-#     for each "multi-way-target" <t>
-#     calls "make way=w <t>" for each w in $(WAYS)
-#
-#     This has the effect of making the standard target
-#     in each of the specified ways (as well as in the normal way
-
-# Controlling variables
-#      WAYS    = extra (beyond the normal way) ways to build things in
-#      SUBDIRS = subdirectories to recurse into
-
-# 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.
-#
-ifneq "$(SUBDIRS)" ""
-
-# we override the 'boot', 'all' and 'install' targets in the top
-# level Makefile. Some of the sub-projects also set 'boot' to empty.
-
-ifeq "$(NO_ALL_TARGET)" "YES"
-ALL_TARGET     =
-else
-ALL_TARGET     = all
-endif
-
-ifeq "$(NO_BOOT_TARGET)" "YES"
-BOOT_TARGET    =
-else
-BOOT_TARGET    = boot
-endif
-
-ifeq "$(NO_INSTALL_TARGET)" "YES"
-INSTALL_TARGET =
-INSTALL_DOCS_TARGET =
-else
-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::
-       @echo "------------------------------------------------------------------------"
-       @echo "===fptools== 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 " 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 "PWD = $(shell pwd)"
-       @echo "------------------------------------------------------------------------"
+PRE_SRCS := $(ALL_SRCS)
 
-endif
+##################################################################
+# Include package building machinery
 
-#
-# Selectively building subdirectories.
-#
-#
-ifneq "$(SUBDIRS)" ""
-$(SUBDIRS) ::
-         $(MAKE) -C $@ $(MFLAGS)
-endif
+include $(TOP)/mk/package.mk
 
 ##################################################################
 #              FPtools standard targets
@@ -333,68 +247,6 @@ $(C_PROG) :: $(C_OBJS)
        $(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS)
 endif
 
-
-#----------------------------------------
-#      Building HsLibs libraries.
-#
-# Inputs:
-#   $(PACKAGE) is the name of the library to build
-#   $(IS_CBITS_LIB) should be "YES" for a "cbits" library
-#
-# Outputs:
-#   $(LIBRARY)         the name of the library.a
-#   $(GHIC_LIBRARY)    the name of the library.o (for GHCi)
-#   $(LIBOBJS)         objects to put in library
-#   $(STUBOBJS)                more objects to put in library
-# 
-# $(LIBOBJS) is set to $(HS_OBJS) or $(C_OBJS) depending
-# on whether or not it's a "cbits" library.  But you can
-# override this by setting $(LIBOBJS) yourself
-
-ifneq "$(PACKAGE)" ""
-
-# add syslib dependencies and current package name
-SRC_HC_OPTS += -package-name $(PACKAGE)
-SRC_HC_OPTS += $(patsubst %, -package %, $(PACKAGE_DEPS))
-
-ifeq "$(IS_CBITS_LIB)" "YES"
-_cbits := _cbits
-STUBOBJS += $(HSC_C_OBJS)
-# Add _hsc.c files to the cbits library
-C_SRCS += $(wildcard ../*_hsc.c)
-# Make .hsc.h include files from the directory above visible
-# (and the cbits/ library too).
-SRC_CC_OPTS += -I.. -I.
-endif
-
-ifneq "$(way)" "i"
-LIBRARY      = libHS$(PACKAGE)$(_cbits)$(_way).a
-GHCI_LIBRARY = HS$(PACKAGE)$(_cbits)$(_way).o
-else
-LIBRARY      = $(PACKAGE).dll
-endif
-
-ifneq "$(IS_CBITS_LIB)" "YES"
-WAYS=$(GhcLibWays)
-endif
-
-ifeq "$(LIBOBJS)" ""
-  ifeq "$(IS_CBITS_LIB)" "YES"
-  LIBOBJS = $(C_OBJS)
-  else
-  LIBOBJS = $(HS_OBJS)
-  endif
-endif
-
-ifeq "$(IS_CBITS_LIB)" "YES"
-override datadir:=$(libdir)/include
-INSTALL_DATAS += Hs$(shell perl -e 'print ucfirst "$(PACKAGE)"').h
-else
-SRC_CC_OPTS += -Icbits
-endif
-
-endif # PACKAGE
-
 #----------------------------------------
 #      Libraries/archives
 #
@@ -438,20 +290,25 @@ ifneq "$(way)" "u"
 
 SRC_HC_OPTS += -split-objs
 
+# We generate the archive into a temporary file libfoo.a.tmp, then
+# rename it at the end.  This avoids the problem that ar may sometimes
+# fail, leaving a partially built archive behind.
 ifeq "$(ArSupportsInput)" ""
 define BUILD_LIB
-$(RM) $@
-(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@
-$(RANLIB) $@
+$(RM) $@ $@.tmp
+(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@.tmp
+$(RANLIB) $@.tmp
+$(MV) $@.tmp $@
 endef
 else
 define BUILD_LIB
-$(RM) $@
+$(RM) $@ $@.tmp
 echo $(STUBOBJS) > $@.list
 $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o' >> $@.list
-$(AR) $(AR_OPTS) $@ $(ArSupportsInput) $@.list
+$(AR) $(AR_OPTS) $@.tmp $(ArSupportsInput) $@.list
 $(RM) $@.list
-$(RANLIB) $@
+$(RANLIB) $@.tmp
+$(MV) $@.tmp $@
 endef
 endif
 
@@ -461,7 +318,7 @@ HC_SPLIT_PRE = \
     $(RM) $@; if [ ! -d $(basename $@) ]; then mkdir $(basename $@); else \
     $(FIND) $(basename $@) -name '*.$(way_)o' | xargs $(RM) __rm_food; fi
 ifeq "$(GhcWithInterpreter)" "YES"
-HC_SPLIT_POST = $(LD) -r -x -o $@ $(basename $@)/*.$(way_)o
+HC_SPLIT_POST = $(LD) -r $(LD_X) -o $@ $(basename $@)/*.$(way_)o
 else
 HC_SPLIT_POST = touch $@
 endif # GhcWithInterpreter == YES
@@ -491,61 +348,19 @@ ifeq "$(StripLibraries)" "YES"
 ifeq "$(SplitObjs)" "YES"
 SRC_HC_POST_OPTS += \
   for i in $(basename $@)/*; do \
-       $(LD) -r -x -o $$i.tmp $$i; \
+       $(LD) -r $(LD_X) -o $$i.tmp $$i; \
        $(MV) $$i.tmp $$i; \
   done
 else
 SRC_HC_POST_OPTS += \
-  $(LD) -r -x -o $@.tmp $@; $(MV) $@.tmp $@
+  $(LD) -r $(LD_X) -o $@.tmp $@; $(MV) $@.tmp $@
 endif # SplitObjs
 endif # StripLibraries
 
-$(LIBRARY) :: $(STUBOBJS) $(LIBOBJS)
+$(LIBRARY) : $(STUBOBJS) $(LIBOBJS)
        $(BUILD_LIB)
 endif # LIBRARY = ""
 
-#--------------------------------------------------------------
-#      Build dynamically-linkable libraries for GHCi
-#
-# Build $(GHCI_LIBRARY) from $(LIBOBJS)+$(STUBOBJS)
-#
-# Why?  GHCi can only link .o files (at the moment), not .a files
-# so we have to build libFoo.o as well as libFoo.a
-#
-# Furthermore, GHCi currently never loads 
-# profiling libraries (or other non-std ways)
-#
-# Inputs:
-#   $(GHCI_LIBRARY)
-#
-# Outputs:
-#   Rule to build $(GHCI_LIBRARY)
-
-
-ifneq "$(GHCI_LIBRARY)" ""
-ifeq "$(way)" ""
-ifeq "$(GhcWithInterpreter)" "YES"
-
-
-INSTALL_LIBS += $(GHCI_LIBRARY)
-CLEAN_FILES += $(GHCI_LIBRARY)
-
-all :: $(GHCI_LIBRARY)
-
-ifneq "$(DONT_WANT_STD_GHCI_LIB_RULE)" "YES"
-# If you don't want to build GHCI_LIBRARY the 'standard' way,
-# set DONT_WANT_STD_GHCI_LIB_RULE to YES. The Prelude and
-# hslibs/Win32 uses this 'feature'.
-#
-$(GHCI_LIBRARY) :: $(LIBOBJS)
-       $(LD) -r -x -o $@ $(LIBOBJS) $(STUBOBJS)
-
-endif # DONT_WANT_STD_GHCI_LIB_RULE
-endif # GhcWithInterpreter
-endif # way
-endif # GHCI_LIBRARY != ""
-
-
 #----------------------------------------
 #      Building Win32 DLLs
 #
@@ -857,6 +672,7 @@ install-dirs ::
 #install:: install-dirs
 
 # Install libraries automatically
+# ToDo: this is a bit magical, maybe do this for packages only? --SDM
 ifneq "$(LIBRARY)" ""
 INSTALL_LIBS  += $(LIBRARY)
 ifeq "$(DLLized)" "YES"
@@ -925,6 +741,8 @@ install:: $(INSTALL_LIBS)
                    $(RANLIB) $(libdir)/`basename $$i` ;; \
                  *.dll) \
                    $(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
+                 *.so) \
+                   $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
                  *) \
                    $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
                esac; \
@@ -961,22 +779,27 @@ install:: $(INSTALL_INCLUDES)
        done
 endif
 
-ifneq "$(INSTALL_DOCS) $(INSTALL_SGML_DOCS)" ""
-install-docs:: $(INSTALL_DOCS) $(foreach i,$(INSTALL_SGML_DOCS),$(foreach j,$(SGMLDocWays),$i.$j))
-       @$(INSTALL_DIR) $(datadir)
+ifneq "$(INSTALL_DOCS)" ""
+install-docs:: $(INSTALL_DOCS)
+       @$(INSTALL_DIR) $(datadir)      
        for i in $(INSTALL_DOCS); do \
                $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \
        done
-       for i in $(INSTALL_SGML_DOCS); do \
-               for j in $(SGMLDocWays); do \
-                       if [ $$j = "html" ]; then \
-                               $(CP) -r $$i $(datadir); \
-                       else \
-                               $(INSTALL_DATA) $(INSTALL_OPTS) $$i.$$j $(datadir); \
-                       fi \
-               done \
+endif
+
+ifneq "$(INSTALL_SGML_DOC)" ""
+ifneq "$(SGMLDocWays)" ""
+install-docs:: $(foreach i,$(SGMLDocWays),$(INSTALL_SGML_DOC).$i)
+       @$(INSTALL_DIR) $(datadir)      
+       for i in $(SGMLDocWays); do \
+               if [ $$i = "html" ]; then \
+                       $(CP) -r $(INSTALL_SGML_DOC) $(datadir); \
+               else \
+                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
+               fi \
        done
 endif
+endif
 
 #
 # Use with care..
@@ -1231,3 +1054,104 @@ all docs TAGS clean distclean mostlyclean maintainer-clean install ::
 
 endif
 endif
+
+
+##################################################################
+#
+#              Recursive stuff
+#
+# This was once at the top of the file, allegedly because it was
+# needed for some targets, e.g. when building DLLs in libraries.  But
+# since this reason is a little short on information, and I'm having
+# trouble with subdirectory builds happening before the current
+# directory when building hslibs (bad interaction with including
+# _hsc.o files in the cbits lib) so I'm moving the recursive makes to
+# the end --SDM 12/12/2001
+#
+##################################################################
+
+# Here are the diabolically clever rules that
+# 
+# (a) for each "recursive target" <t>
+#     propagates "make <t>" to directories in SUBDIRS
+#
+# (b) when SUBDIRS is empty,
+#     for each "multi-way-target" <t>
+#     calls "make way=w <t>" for each w in $(WAYS)
+#
+#     This has the effect of making the standard target
+#     in each of the specified ways (as well as in the normal way
+
+# Controlling variables
+#      WAYS    = extra (beyond the normal way) ways to build things in
+#      SUBDIRS = subdirectories to recurse into
+
+# 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.
+#
+ifneq "$(SUBDIRS)" ""
+
+# we override the 'boot', 'all' and 'install' targets in the top
+# level Makefile. Some of the sub-projects also set 'boot' to empty.
+
+ifeq "$(NO_ALL_TARGET)" "YES"
+ALL_TARGET     =
+else
+ALL_TARGET     = all
+endif
+
+ifeq "$(NO_BOOT_TARGET)" "YES"
+BOOT_TARGET    =
+else
+BOOT_TARGET    = boot
+endif
+
+ifeq "$(NO_INSTALL_TARGET)" "YES"
+INSTALL_TARGET =
+INSTALL_DOCS_TARGET =
+else
+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::
+       @echo "------------------------------------------------------------------------"
+       @echo "===fptools== 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 " 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 "PWD = $(shell pwd)"
+       @echo "------------------------------------------------------------------------"
+
+endif
+
+#
+# Selectively building subdirectories.
+#
+#
+ifneq "$(SUBDIRS)" ""
+$(SUBDIRS) ::
+         $(MAKE) -C $@ $(MFLAGS)
+endif