[project @ 2004-09-05 17:55:24 by panne]
[ghc-hetmet.git] / mk / target.mk
index b773430..c824dad 100644 (file)
 #
 
 ##################################################################
+# Pre-compute the list of sources so we don't have to do this 
+# multiple times.  See paths.mk.
+
+PRE_SRCS := $(ALL_SRCS)
+
+##################################################################
+# Include package building machinery
+
+include $(TOP)/mk/package.mk
+
+###################################################################
+# Suffix rules for Haskell, C and literate 
+
+include $(TOP)/mk/suffix.mk
+
+##################################################################
 #              FPtools standard targets
 #
 # depend:
 # Compiler produced files that are targets of the source's imports.
 MKDEPENDHS_OBJ_SUFFICES=o
 
-depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS)
+ifneq "$(BootingFromHc)" "YES"
+PKGCONF_DEP = $(STAMP_PKG_CONF)
+endif
+
+depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP)
        @$(RM) .depend
        @touch .depend
 ifneq "$(DOC_SRCS)" ""
@@ -158,7 +178,7 @@ endif
 # `TAGS'
 #      Update a tags table for this program.
 # 
-# `dvi' `ps' `pdf' `html' `pdf'
+# `dvi' `ps' `pdf' `html' `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.
@@ -214,16 +234,13 @@ 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
-
-# for building a Haskell program, we add FptoolsHcOpts
-SRC_HC_OPTS += $(FptoolsHcOpts)
 endif
 
 #----------------------------------------
@@ -236,74 +253,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
-
-# HACK!!! The conditional below is needed because we pass $(HC_OPTS)
-# directly to mkdependC and sometimes the C compiler in ghc/rts. Todo.
-ifneq "$(PACKAGE)" "rts"
-SRC_HC_OPTS += -package-name $(PACKAGE)
-endif
-
-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.
-SRC_HSC2HS_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
-else
-SRC_CC_OPTS += -Icbits
-endif
-
-endif # PACKAGE
-
 #----------------------------------------
 #      Libraries/archives
 #
@@ -353,29 +302,29 @@ SRC_HC_OPTS += -split-objs
 ifeq "$(ArSupportsInput)" ""
 define BUILD_LIB
 $(RM) $@ $@.tmp
-(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@.tmp
-$(RANLIB) $@.tmp
-$(MV) $@.tmp $@
+(echo $(STUBOBJS) $(C_OBJS) $(GC_C_OBJS); $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print) | xargs $(AR) $@
+$(RANLIB) $@
 endef
 else
 define BUILD_LIB
 $(RM) $@ $@.tmp
 echo $(STUBOBJS) > $@.list
-$(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o' >> $@.list
-$(AR) $(AR_OPTS) $@.tmp $(ArSupportsInput) $@.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
-$(RANLIB) $@.tmp
-$(MV) $@.tmp $@
+$(RANLIB) $@
 endef
 endif
 
 # Extra stuff for compiling Haskell files with $(SplitObjs):
 
 HC_SPLIT_PRE = \
-    $(RM) $@; if [ ! -d $(basename $@) ]; then mkdir $(basename $@); else \
-    $(FIND) $(basename $@) -name '*.$(way_)o' | xargs $(RM) __rm_food; fi
+    $(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 = $(LD) -r $(LD_X) -o $@ $(basename $@)/*.$(way_)o
+HC_SPLIT_POST = (cd $(basename $@)_split && $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o)
 else
 HC_SPLIT_POST = touch $@
 endif # GhcWithInterpreter == YES
@@ -390,8 +339,8 @@ SRC_HC_POST_OPTS += $(HC_SPLIT_POST);
 #
 
 extraclean ::
-       $(FIND) $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
-       -rmdir $(patsubst %.$(way_)o,%,$(HS_OBJS)) > /dev/null 2>&1
+       $(FIND) $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food
+       -rmdir $(patsubst %.$(way_)o,%_split,$(HS_OBJS)) > /dev/null 2>&1
 
 endif # $(way) == u
 endif # $(SplitObjs)
@@ -404,7 +353,7 @@ endif # $(HS_SRCS)
 ifeq "$(StripLibraries)" "YES"
 ifeq "$(SplitObjs)" "YES"
 SRC_HC_POST_OPTS += \
-  for i in $(basename $@)/*; do \
+  for i in $(basename $@)_split/*; do \
        $(LD) -r $(LD_X) -o $$i.tmp $$i; \
        $(MV) $$i.tmp $$i; \
   done
@@ -414,52 +363,13 @@ SRC_HC_POST_OPTS += \
 endif # SplitObjs
 endif # StripLibraries
 
-$(LIBRARY) :: $(STUBOBJS) $(LIBOBJS)
+# Note: $(STUBOBJS) isn't depended on here, but included when building the lib.
+#       (i.e., the assumption is that $(STUBOBJS) are created as a side-effect
+#       of building $(LIBOBJS)).
+$(LIBRARY) : $(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 $(LD_X) -o $@ $(LIBOBJS) $(STUBOBJS)
-
-endif # DONT_WANT_STD_GHCI_LIB_RULE
-endif # GhcWithInterpreter
-endif # way
-endif # GHCI_LIBRARY != ""
-
-
 #----------------------------------------
 #      Building Win32 DLLs
 #
@@ -712,11 +622,11 @@ $(LINK) : $(LINK_TARGET)
 install ::
        @$(INSTALL_DIR) $(bindir)
        @if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \
-          echo "Creating a symbol link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \
+          echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \
           $(RM) $(bindir)/$(LINK); \
           $(LN_S) $(LINK_TARGET) $(bindir)/$(LINK); \
         else \
-          echo "Creating a symbol link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \
+          echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \
           echo "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \
           exit 1; \
         fi;
@@ -739,6 +649,7 @@ endif # LINK
 #      INSTALL_LIB_SCRIPTS  platform-dependent scripts   in $(libdir)
 #      INSTALL_LIBEXECS     platform-dependent execs in $(libdir)
 #      INSTALL_DATAS        platform-independent files in $(datadir)
+#      INSTALL_IFACES       platform-dependent interface files in $(ifacedir)
 #
 # If the installation directory variable is undefined, the install rule simply
 # emits a suitable error message.
@@ -770,16 +681,17 @@ install-dirs ::
 # within the various install targets instead.
 #install:: install-dirs
 
-# Install libraries automatically
-ifneq "$(LIBRARY)" ""
-INSTALL_LIBS  += $(LIBRARY)
-ifeq "$(DLLized)" "YES"
-INSTALL_PROGS += $(DLL_NAME)
-INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY))
+#
+# Setting user/group ownership for the installed entities
+#
+ifneq "$(INSTALL_OWNER)" ""
+SRC_INSTALL_OPTS += -o $(INSTALL_OWNER)
 endif
-INSTALL_DATAS += $(HS_IFACES)
+ifneq "$(INSTALL_GROUP)" ""
+SRC_INSTALL_OPTS += -g $(INSTALL_GROUP)
 endif
 
+
 ifneq "$(INSTALL_PROGS)" ""
 
 #
@@ -839,6 +751,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; \
@@ -867,6 +781,22 @@ install:: $(INSTALL_DATAS)
        done
 endif
 
+ifneq "$(INSTALL_IFACES)" ""
+install:: $(INSTALL_IFACES)
+       @$(INSTALL_DIR) $(ifacedir)
+       for i in $(INSTALL_IFACES); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir); \
+       done
+endif
+
+ifneq "$(INSTALL_IFACES_WITH_DIRS)" ""
+install:: $(INSTALL_IFACES_WITH_DIRS)
+       @$(INSTALL_DIR) $(ifacedir)
+       for i in $(INSTALL_IFACES_WITH_DIRS); do \
+               $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir)/`dirname $$i`; \
+       done
+endif
+
 ifneq "$(INSTALL_INCLUDES)" ""
 install:: $(INSTALL_INCLUDES)
        @$(INSTALL_DIR) $(includedir)
@@ -876,22 +806,32 @@ install:: $(INSTALL_INCLUDES)
 endif
 
 ifneq "$(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 "$(INSTALL_XML_DOC)" ""
+ifneq "$(XMLDocWays)" ""
+install-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-chunks,%.html,$(patsubst %.htmlhelp,%.chm,$(patsubst %.html,%-html/index.html,.$(i)))))
        @$(INSTALL_DIR) $(datadir)      
-       for i in $(SGMLDocWays); do \
+       @for i in $(XMLDocWays); do \
                if [ $$i = "html" ]; then \
-                       $(CP) -r $(INSTALL_SGML_DOC) $(datadir); \
+                       $(INSTALL_DIR) $(datadir)/html; \
+                       echo "( cd $(INSTALL_XML_DOC)-html && $(CP) * $(datadir)/html )" ; \
+                       ( cd $(INSTALL_XML_DOC)-html && $(CP) * $(datadir)/html ) ; \
                else \
-                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
+                       echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
+                       $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.htmlhelp/.chm/ | sed s/\.html-no-chunks/.html/` $(datadir); \
+               fi; \
+               if [ $$i = "html-no-chunks" ]; then \
+                       echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir); \
+                       $(CP) $(FPTOOLS_CSS_ABS) $(datadir); \
                fi \
        done
 endif
@@ -962,7 +902,7 @@ tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS)
        @$(RM) TAGS
        @touch TAGS
 ifneq "$(TAGS_HS_SRCS)" ""
-       $(HSTAGS) $(HSTAGS_OPTS) -- $(TAGS_HS_SRCS)
+       $(HSTAGS) $(HSTAGS_OPTS) $(TAGS_HS_SRCS)
 endif
 ifneq "$(TAGS_C_SRCS)" ""
        etags -a $(TAGS_C_SRCS)
@@ -980,48 +920,48 @@ show:
 
 ################################################################################
 #
-#                      SGML Documentation
+#                      DocBook XML Documentation
 #
 ################################################################################
 
-.PHONY: dvi ps html pdf rtf
+.PHONY: html html-no-chunks htmlhelp 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 -html/index.html,$(basename $(XML_DOC)))
+XML_HTML_NO_CHUNKS = $(addsuffix .html,$(XML_DOC))
+XML_HTMLHELP       = $(addsuffix -htmlhelp/index.html,$(basename $(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)
+htmlhelp       :: $(XML_HTMLHELP)
+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))-html $(basename $(XML_DOC))-htmlhelp
+
+validate ::
+       $(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml
 endif
 
 ##############################################################################
@@ -1157,7 +1097,7 @@ 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 hslibs.  But
+# 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
@@ -1196,6 +1136,7 @@ endif
 # the --no-print-directory flag which is passed to recursive
 # invocations of make.
 #
+#ifeq "$(way)" ""
 ifneq "$(SUBDIRS)" ""
 
 # we override the 'boot', 'all' and 'install' targets in the top
@@ -1242,6 +1183,7 @@ $(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean main
        @echo "------------------------------------------------------------------------"
 
 endif
+#endif
 
 #
 # Selectively building subdirectories.