#
##################################################################
+# 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)" ""
# `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.
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
#----------------------------------------
$(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
#
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
#
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)
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
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
#
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;
# 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.
# 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))
-endif
-INSTALL_DATAS += $(HS_IFACES)
-endif
-
ifneq "$(INSTALL_PROGS)" ""
#
$(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; \
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)
endif
ifneq "$(INSTALL_DOCS)" ""
+ifneq "$(SGMLDocWays)" ""
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)
@$(INSTALL_DIR) $(datadir)
- for i in $(SGMLDocWays); do \
+ @for i in $(SGMLDocWays); do \
if [ $$i = "html" ]; then \
- $(CP) -r $(INSTALL_SGML_DOC) $(datadir); \
+ $(INSTALL_DIR) $(datadir)/html; \
+ echo $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \
+ $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \
else \
+ echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
$(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \
fi \
done
@$(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)
# 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
# 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
@echo "------------------------------------------------------------------------"
endif
+#endif
#
# Selectively building subdirectories.