# whether HS_SRCS is empty or not.
#
+# can't split objs in way 'u', so we disable it here
+ifeq "$(way)" "u"
+SplitObjs = NO
+endif
+
ifneq "$(HS_SRCS)" ""
ifeq "$(SplitObjs)" "YES"
-# can't split objs in way 'u', so we disable it here
-ifneq "$(way)" "u"
-
SRC_HC_OPTS += -split-objs
# We generate the archive into a temporary file libfoo.a.tmp, then
$(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 = (cd $(basename $@)_split && $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o)
+ifeq "$(LdIsGNULd)" "YES"
+# If ld is GNU ld, we can use a linker script to pass the names of the
+# input files. This avoids problems with limits on the length of the
+# ld command line, which we run into for large Haskell modules.
+HC_SPLIT_POST = \
+ ( cd $(basename $@)_split; \
+ $(RM) ld.script; \
+ touch ld.script; \
+ echo "INPUT(" *.$(way_)o ")" >>ld.script; \
+ $(LD) -r $(LD_X) -o ../$(notdir $@) ld.script; \
+ )
+else
+HC_SPLIT_POST = \
+ ( cd $(basename $@)_split; \
+ $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o; \
+ )
+endif # LdIsGNULd == YES
else
HC_SPLIT_POST = touch $@
endif # GhcWithInterpreter == YES
$(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)
endif # $(HS_SRCS)
ifeq "$(StripLibraries)" "YES"
ifeq "$(SplitObjs)" "YES"
SRC_HC_POST_OPTS += \
- for i in $(basename $@)_split/*; do \
+ for i in $(basename $@)_split/*.$(way_)o; do \
$(LD) -r $(LD_X) -o $$i.tmp $$i; \
$(MV) $$i.tmp $$i; \
done
$(INSTALL_DATA) -s $(INSTALL_OPTS) $$i $(libdir) ;; \
*.so) \
$(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir) ;; \
+ *.dylib) \
+ $(INSTALL_SHLIB) $(INSTALL_OPTS) $$i $(libdir); \
+ install_name_tool -id $(libdir)/`basename $$i` $(libdir)/`basename $$i` ;; \
*) \
$(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \
esac; \
# 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-docs:: $(foreach i,$(XMLDocWays),$(INSTALL_XML_DOC)$(patsubst %.html-no-chunks,%.html,$(patsubst %.htmlhelp,%.chm,$(patsubst %.html,%/index.html,.$(i)))))
@$(INSTALL_DIR) $(datadir)
@for i in $(XMLDocWays); do \
if [ $$i = "html" ]; then \
$(INSTALL_DIR) $(datadir)/html; \
- echo "( cd $(INSTALL_XML_DOC)-html && $(CP) * $(datadir)/html )" ; \
- ( cd $(INSTALL_XML_DOC)-html && $(CP) * $(datadir)/html ) ; \
+ $(INSTALL_DIR) $(datadir)/html/$(INSTALL_XML_DOC); \
+ echo "( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) )" ; \
+ ( cd $(INSTALL_XML_DOC) && $(CP) * $(datadir)/html/$(INSTALL_XML_DOC) ) ; \
else \
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); \
XML_SRCS = $(wildcard *.xml)
endif
-XML_HTML = $(addsuffix -html/index.html,$(basename $(XML_DOC)))
+XML_HTML = $(addsuffix /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))
CLEAN_FILES += $(XML_HTML_NO_CHUNKS) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF)
extraclean ::
- $(RM) -rf $(XML_DOC).out $(FPTOOLS_CSS) $(basename $(XML_DOC))-html $(basename $(XML_DOC))-htmlhelp
+ $(RM) -rf $(XML_DOC).out $(FPTOOLS_CSS) $(basename $(XML_DOC)) $(basename $(XML_DOC))-htmlhelp
validate ::
$(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml
$(SUBDIRS) ::
$(MAKE) -C $@ $(MFLAGS)
endif
+
+# -----------------------------------------------------------------------------
+# Further cleaning
+
+# Sometimes we want to clean things only after the recursve cleaning
+# has heppened (eg. if the files we're about to remove would affect
+# the recursive traversal).
+
+distclean::
+ rm -f $(LATE_DIST_CLEAN_FILES)
+
+maintainer-clean::
+ rm -f $(LATE_DIST_CLEAN_FILES)
+