[project @ 2001-03-23 16:36:20 by simonmar]
[ghc-hetmet.git] / mk / target.mk
index aae3cfd..81ac73b 100644 (file)
 # 
 #
 
-##################################################################
-#              FPtools standard targets
-#
-# depend:
-#
-#  The depend target has to cope with a set of files that may have
-#  different ways of computing their dependencies, i.e., a Haskell
-#  module's dependencies are computed differently from C files.
-#
-.PHONY: depend
-
-# Compiler produced files that are targets of the source's imports.
-MKDEPENDHS_OBJ_SUFFICES=o
-
-DEPEND_SRCS = $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS)
-
-ifneq "$(DEPEND_SRCS)" ""
-depend :: .depend
-
-# Build .depend, then recursively invoke $(MAKE) to carry on.  Because the
-# build system includes .depend (from boilerplate.mk), GNU make records .depend
-# as a Makefile and automatically tries to rebuild it if it is out-of-date.
-# this will happen before any other targets are processed.
-.depend : $(DEPEND_SRCS)
-       @echo "------------------------------------------------------------------------"
-       @echo "===fptools== Rebuilding dependencies..."
-       @echo "PWD = $(shell pwd)"
-       @echo "------------------------------------------------------------------------"
-       @$(RM) .depend
-       @touch .depend
-ifneq "$(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),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(HC_OPTS) $(MKDEPENDHS_SRCS)
-endif
-
-else # no dependencies required
-depend ::
-endif
 
 ##################################################################
 #
@@ -158,6 +118,48 @@ $(SUBDIRS) ::
 endif
 
 ##################################################################
+#              FPtools standard targets
+#
+# depend:
+#
+#  The depend target has to cope with a set of files that may have
+#  different ways of computing their dependencies, i.e., a Haskell
+#  module's dependencies are computed differently from C files.
+#
+# Note that we don't compute dependencies automatically, i.e., have the
+# .depend file be a target that is dependent on the Haskell+C sources,
+# and then have the `depend' target depend on `.depend'. The reason for
+# this is that when GNU make is processing the `include .depend' statement
+# it records .depend as being a Makefile. Before doing any other processing,
+# `make' will try to check to see if the Makefiles are up-to-date. And,
+# surprisingly enough, .depend has a rule for it, so if any of the source
+# files change, it will be invoked, *regardless* of what target you're making.
+#
+# So, for now, the dependencies has to be re-computed manually via `make depend'
+# whenever a module changes its set of imports. Doing what was outlined above
+# is only a small optimisation anyway, it would avoid the recomputation of
+# dependencies if the .depend file was newer than any of the source modules.
+#
+.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
+ifneq "$(DOC_SRCS)" ""
+       $(MKDEPENDLIT) -o .depend $(MKDEPENDLIT_OPTS) $(filter %.lit,$(DOC_SRCS))
+endif
+ifneq "$(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),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(HC_OPTS) $(MKDEPENDHS_SRCS)
+endif
+
+
+##################################################################
 #                      boot
 #
 #  The boot target, at a minimum generates dependency information
@@ -295,41 +297,60 @@ $(HS_PROG) :: $(HS_OBJS)
        $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) $(LIBS)
 endif
 
+# Object and interface files have suffixes tagged with their ways
+ifneq "$(way)" ""
+SRC_HC_OPTS += -hisuf $(way_)hi
+endif
+
 #----------------------------------------
 #      C programs
 
 ifneq "$(C_PROG)" ""
 all :: $(C_PROG)
 
+ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
+CC_OPTS += -mno-cygwin
+endif
+
 $(C_PROG) :: $(C_OBJS)
        $(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS)
 endif
 
 
 #----------------------------------------
-#      Libraries/archives
+#      Building HsLibs libraries.
+
+ifneq "$(HSLIB)" ""
 
 ifeq "$(IS_CBITS_LIB)" "YES"
 _cbits := _cbits
 endif
 
-ifneq "$(HSLIB)" ""
 LIBRARY      = libHS$(HSLIB)$(_cbits)$(_way).a
 GHCI_LIBRARY = HS$(HSLIB)$(_cbits)$(_way).o
+
+ifneq "$(IS_CBITS_LIB)" "YES"
+WAYS=$(GhcLibWays)
+endif
+
 ifeq "$(LIBOBJS)" ""
-  ifneq "$(IS_CBITS_LIB)" "YES"
-  LIBOBJS = $(HS_OBJS)
-  else
+  ifeq "$(IS_CBITS_LIB)" "YES"
   LIBOBJS = $(C_OBJS)
+  else
+  LIBOBJS = $(HS_OBJS)
   endif
 endif
-ifneq "$(IS_CBITS_LIB)" ""
-CC = $(HC)
+
+ifeq "$(IS_CBITS_LIB)" "YES"
 override datadir:=$(libdir)/includes
 INSTALL_DATAS += Hs$(shell perl -e 'print ucfirst "$(HSLIB)"').h
 SRC_CC_OPTS += -I$(GHC_INCLUDE_DIR) -I$(GHC_RUNTIME_DIR)
 endif
-endif
+
+endif # HSLIB
+
+#----------------------------------------
+#      Libraries/archives
 
 ifneq "$(LIBRARY)" ""
 all :: $(LIBRARY)
@@ -605,12 +626,6 @@ 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 $@...
@@ -748,11 +763,8 @@ ifneq "$(LIBRARY)" ""
 INSTALL_LIBS  += $(LIBRARY)
 ifeq "$(DLLized)" "YES"
 INSTALL_PROGS += $(DLL_NAME)
-else
-ifeq "$(DLLized)" "YES"
 INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY))
 endif
-endif
 INSTALL_DATAS += $(HS_IFACES)
 endif