X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=mk%2Ftarget.mk;h=37a72bcc0c5243ea24035e699e072891191d3da0;hp=6a0b5aa8a8eaaeab46085d14b4c45dc6adc77682;hb=74e1368d4688ee16f6decdf2cd3ebe27506b26ba;hpb=ba69efdd1d74ce728e790ea8bb682a5b41aa51fb diff --git a/mk/target.mk b/mk/target.mk index 6a0b5aa..37a72bc 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -2,24 +2,24 @@ # # target.mk # -# Standard targets for fptools +# Standard targets for GHC # ################################################################################# # # This file contain three groups of target rules: # -# 1. FPtools targets +# 1. GHC targets # depend* # runtests* # # 2. GNU standard targets # all* -# install* uninstall installcheck installdirs +# install* installcheck installdirs # install-docs* # clean* distclean* mostlyclean* maintainer-clean* # tags* -# dvi ps (no info) FPTOOLS adds: pdf rtf html +# dvi ps (no info) GHC adds: pdf rtf html chm HxS # check # # 3. Some of the above targets have a version that @@ -41,6 +41,8 @@ PRE_SRCS := $(ALL_SRCS) ################################################################## # Include package building machinery +# NB. needs to be after PRE_SRCS setting above, because otherwise the +# rule dependencies won't be set correctly. include $(TOP)/mk/package.mk @@ -50,7 +52,7 @@ include $(TOP)/mk/package.mk include $(TOP)/mk/suffix.mk ################################################################## -# FPtools standard targets +# GHC standard targets # # depend: # @@ -81,6 +83,12 @@ ifneq "$(BootingFromHc)" "YES" PKGCONF_DEP = $(STAMP_PKG_CONF) endif +ifeq "$(USE_NEW_MKDEPEND_FLAGS)" "YES" +MKDEPENDHS_FLAGS = -dep-makefile .depend $(foreach way,$(WAYS),-dep-suffix $(way)) +else +MKDEPENDHS_FLAGS = -optdep-f -optdep.depend $(foreach way,$(WAYS),-optdep-s -optdep$(way)) +endif + depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP) @$(RM) .depend @touch .depend @@ -91,7 +99,7 @@ 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) $(filter-out -split-objs, $(HC_OPTS)) $(MKDEPENDHS_SRCS) + $(MKDEPENDHS) -M $(MKDEPENDHS_FLAGS) $(foreach obj,$(MKDEPENDHS_OBJ_SUFFICES),-osuf $(obj)) $(MKDEPENDHS_OPTS) $(filter-out -split-objs, $(HC_OPTS)) $(MKDEPENDHS_SRCS) endif @@ -134,11 +142,6 @@ endif # will ignore any errors. This is in case there are systems that # don't have the Unix man page documentation system installed. # -# `uninstall' -# Delete all the installed files that the `install' target would -# create (but not the noninstalled files such as `make all' would -# create). -# # `clean' # # Delete all files from the current directory that are normally @@ -178,7 +181,7 @@ endif # `TAGS' # Update a tags table for this program. # -# `dvi' `ps' `pdf' `html' `rtf' +# `dvi' `ps' `pdf' `html' `chm' `HxS' `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. @@ -202,7 +205,7 @@ endif # directories where files are installed, and their parent # directories. There is a script called `mkinstalldirs' which is # convenient for this; find it in the Texinfo package. -# (FPTOOLS: we use a close relative of the suggested script, situated +# (GHC: we use a close relative of the suggested script, situated # in glafp-utils/mkdirhier -- SOF) @@ -220,7 +223,6 @@ endif # HS_PROG Haskell program # C_PROG C program # LIBRARY Library -# SCRIPT_PROG Script (e.g. Perl script) # # For details of exactly what rule is generated, see the # relevant section below @@ -269,13 +271,13 @@ ifneq "$(LIBRARY)" "" all :: $(LIBRARY) ifneq "$(way)" "i" -define BUILD_LIB +define BUILD_STATIC_LIB $(RM) $@ $(AR) $(AR_OPTS) $@ $(STUBOBJS) $(LIBOBJS) $(RANLIB) $@ endef else -define BUILD_LIB +define BUILD_STATIC_LIB $(RM) $@ al -out:$@ $(STUBOBJS) $(LIBOBJS) endef @@ -302,13 +304,13 @@ SRC_HC_OPTS += -split-objs # 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 +define BUILD_STATIC_LIB $(RM) $@ $@.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 +define BUILD_STATIC_LIB $(RM) $@ $@.tmp echo $(STUBOBJS) > $@.list echo $(C_OBJS) >> $@.list @@ -322,34 +324,6 @@ endif # Extra stuff for compiling Haskell files with $(SplitObjs): -HC_SPLIT_PRE = \ - $(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" -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 - -SRC_HC_PRE_OPTS += $(HC_SPLIT_PRE); -SRC_HC_POST_OPTS += $(HC_SPLIT_POST); - # # If (Haskell) object files are split, cleaning up # consist of descending into the directories where @@ -383,70 +357,35 @@ endif # StripLibraries # 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 = "" +ifeq "$(LIBRARY:%.so=YES)" "YES" +# ELF styled DSO +$(LIBRARY): $(LIBOBJS) $(LIB_DEPS) + $(RM) $@ + $(HC) -shared -dynamic -o $@ $(STUBOBJS) $(LIBOBJS) $(LIB_LD_OPTS) +else +ifeq "$(LIBRARY:%.dylib=YES)" "YES" +$(LIBRARY): $(LIBOBJS) $(LIB_DEPS) + $(HC) -shared -dynamic -o $@ $(STUBOBJS) $(LIBOBJS) $(LIB_LD_OPTS) +else +ifeq "$(LIBRARY:%.dll=YES)" "YES" #---------------------------------------- # Building Win32 DLLs # +$(LIBRARY): $(LIBOBJS) $(LIBRARY).o $(LIB_DEPS) + $(HC) -shared -dynamic -o $@ $(STUBOBJS) $(LIBOBJS) $(LIBRARY).o $(LIB_LD_OPTS) -ifeq "$(DLLized)" "YES" -SRC_CC_OPTS += -DDLLized - -ifneq "$(PACKAGE)" "" - -SRC_BLD_DLL_OPTS += --export-all --output-def=HS$(PACKAGE)$(_cbits)$(_way).def DllVersionInfo.$(way_)o - -ifneq "$(PACKAGE) $(IS_CBITS_LIB)" "std YES" -ifneq "$(PACKAGE)" "rts" -SRC_BLD_DLL_OPTS += -lHSstd_cbits_imp -L$(GHC_LIB_DIR)/std/cbits -SRC_BLD_DLL_OPTS += -lHSrts_$(way_)imp -L$(GHC_RUNTIME_DIR) -ifneq "$(PACKAGE)" "std" - ifeq "$(IS_CBITS_LIB)" "" - SRC_BLD_DLL_OPTS += -lHSstd_$(way_)imp -L$(GHC_LIB_DIR)/std - endif -endif -endif -endif - -SRC_BLD_DLL_OPTS += -lgmp -L. -L$(GHC_RUNTIME_DIR)/gmp -ifeq "$(IS_CBITS_LIB)" "" -SRC_BLD_DLL_OPTS += $(patsubst %,-lHS%_$(way_)imp, $(PACKAGE_DEPS)) -SRC_BLD_DLL_OPTS += $(patsubst %,-L../%, $(PACKAGE_DEPS)) -endif -ifneq "$(HAS_CBITS)" "" -SRC_BLD_DLL_OPTS += -lHS$(PACKAGE)_cbits_imp -Lcbits -endif -SRC_BLD_DLL_OPTS += -lwsock32 -lwinmm - -endif # PACKAGE != "" - -SplitObjs = NO - -ifneq "$(LIBRARY)" "" - -all :: DllVersionInfo.$(way_)o +DLLTOOL=dlltool -ifeq "$(DLL_NAME)" "" -DLL_NAME = $(patsubst %.a,%.dll,$(subst lib,,$(LIBRARY))) -endif - -ifneq "$(DLL_NAME)" "" -DLL_NAME := $(DLL_PEN)/$(DLL_NAME) -endif +$(LIBRARY).def: $(LIBOBJS) + $(DLLTOOL) -D $(LIBRARY) --output-def $@ --export-all $(LIBOBJS) -all :: $(DLL_NAME) +$(LIBRARY).o: + $(DLLTOOL) -D $(LIBRARY) --output-exp $(LIBRARY).o $(LIBOBJS) -ifeq "$(DLL_IMPLIB_NAME)" "" -DLL_IMPLIB_NAME = $(patsubst %.a,%_imp.a,$(LIBRARY)) -endif - -$(DLL_NAME) :: $(LIBRARY) - $(BLD_DLL) --output-lib $(DLL_IMPLIB_NAME) -o $(DLL_NAME) $(LIBRARY) $(BLD_DLL_OPTS) -endif # LIBRARY != "" - -endif # DLLized +# Generates library.dll.a; by MinGW conventions, this is the dll's import library +$(LIBRARY).a: $(LIBOBJS) $(LIBRARY).def + $(DLLTOOL) -D $(LIBRARY) --def $(LIBRARY).def --output-lib $@ # # Version information is baked into a DLL by having the DLL include DllVersionInfo.o. @@ -515,391 +454,16 @@ DllVersionInfo.$(way_)rc ExeVersionInfo.$(way_)rc: echo " VALUE \"Translation\", 0x0409, 1200" >> $@ echo " END" >> $@ echo "END" >> $@ - -#---------------------------------------- -# Script programs - -ifneq "$(SCRIPT_PROG)" "" - -# To produce a fully functional script, you may -# have to add some configuration variables at the top of -# the script, i.e., the compiler driver needs to know -# the path to various utils in the build tree for instance. -# -# To have the build rule for the script automatically do this -# for you, set the variable SCRIPT_SUBST_VARS to the list of -# variables you need to put in. - -# -# SCRIPT_SUBST creates a string of echo commands that -# will when evaluated append the (perl)variable name and its value -# to the target it is used for, i.e., -# -# A=foo -# B=bar -# SCRIPT_SUBST_VARS = A B -# SCRIPT_SUBST=echo "$""A=\"foo\";" >> $@; echo "$""B=\"bar\";" >> $@ -# -# so if you have a rule like the following -# -# foo: -# @(RM) $@ -# @(TOUCH) $@ -# @eval $(SCRIPT_SUBST) -# -# `make foo' would create a file `foo' containing the following -# -# % cat foo -# $A=foo; -# $B=bar; -# % -# -# ToDo: make this work for shell scripts (drop the initial $). -# -ifeq "$(INTERP)" "$(SHELL)" -SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$(val)=\\\"$($(val))\\\";\" >> $@;") else -SCRIPT_SUBST=$(foreach val,$(SCRIPT_SUBST_VARS),"echo \"$$\"\"$(val)=\\\"$($(val))\\\";\" >> $@;") -endif - -all :: $(SCRIPT_PROG) - -$(SCRIPT_PROG) : $(SCRIPT_OBJS) - $(RM) $@ - @echo Creating $@... -ifeq "$(INTERP)" "perl" - echo "#! "$(PERL) > $@ -else -ifneq "$(INTERP)" "" - @echo "#!"$(INTERP) > $@ -else - @touch $@ -endif -endif -ifneq "$(SCRIPT_PREFIX_FILES)" "" - @cat $(SCRIPT_PREFIX_FILES) >> $@ -endif -ifneq "$(SCRIPT_SUBST)" "" - @eval $(SCRIPT_SUBST) -endif - @cat $(SCRIPT_OBJS) >> $@ - @chmod a+x $@ - @echo Done. -endif - -# --------------------------------------------------------------------------- -# Symbolic links - -# links to programs: we sometimes install a program as -# - with a link from to the real program. - -ifneq "$(LINK)" "" - -all :: $(LINK) - -CLEAN_FILES += $(LINK) - -ifeq "$(LINK_TARGET)" "" -ifneq "$(SCRIPT_PROG)" "" -LINK_TARGET = $(SCRIPT_PROG) -else -ifneq "$(HS_PROG)" "" -LINK_TARGET = $(HS_PROG) -else -ifneq "$(C_PROG)" "" -LINK_TARGET = $(C_PROG) -else -LINK_TARGET = dunno -endif -endif -endif -endif - -# -# Don't want to overwrite $(LINK)s that aren't symbolic -# links. Testing for symbolic links is problematic to do in -# a portable fashion using a /bin/sh test, so we simply rely -# on perl. -# -$(LINK) : $(LINK_TARGET) - @if ( $(PERL) -e '$$fn="$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \ - echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK)"; \ - $(RM) $(LINK); \ - $(LN_S) $(LINK_TARGET) $(LINK); \ - else \ - echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) failed: \`$(LINK)' already exists"; \ - echo "Perhaps remove \`$(LINK)' manually?"; \ - exit 1; \ - fi; - - -# -# install links to script drivers. -# -install :: - @$(INSTALL_DIR) $(bindir) - @if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \ - 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 symbolic link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \ - echo "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \ - exit 1; \ - fi; - -endif # LINK - - -########################################### -# -# Targets: install install-strip uninstall -# -########################################### - -# For each of these variables that is defined, you -# get one install rule -# -# INSTALL_PROGS executable programs in $(bindir) -# INSTALL_SCRIPTS executable scripts in $(bindir) -# INSTALL_LIBS platform-dependent libraries in $(libdir) (ranlib'ed) -# 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. -# -# Remember, too, that the installation directory variables ($(bindir) and -# friends can be overridden from their original settings in mk/config.mk.in -# || mk/build.mk -# -.PHONY: install install-docs installdirs install-strip install-dirs uninstall install-docs show-install - -show-install : - @echo "bindir = $(bindir)" - @echo "libdir = $(libdir)" - @echo "libexecdir = $(libexecdir) # by default, same as libdir" - @echo "datadir = $(datadir) # unused for ghc project" - -# -# Sometimes useful to separate out the creation of install directories -# from the installation itself. -# -install-dirs :: - @$(INSTALL_DIR) $(bindir) - @$(INSTALL_DIR) $(libdir) - @$(INSTALL_DIR) $(libexecdir) - @$(INSTALL_DIR) $(datadir) - -# Better do this first... -# but we won't for the moment, do it on-demand from -# within the various install targets instead. -#install:: install-dirs - -# -# Setting user/group ownership for the installed entities -# -ifneq "$(INSTALL_OWNER)" "" -SRC_INSTALL_OPTS += -o $(INSTALL_OWNER) -endif -ifneq "$(INSTALL_GROUP)" "" -SRC_INSTALL_OPTS += -g $(INSTALL_GROUP) -endif - - -ifneq "$(strip $(INSTALL_PROGS))" "" - -# -# Here's an interesting one - when using the win32 version -# of install (provided via the cygwin toolkit), we have to -# supply the .exe suffix, *if* there's no other suffix. -# -# The rule below does this by ferreting out the suffix of each -# entry in the INSTALL_PROGS list. If there's no suffix, use -# $(exeext). -# -INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(if $(suffix $(p)),,$(exeext)), $(basename $(p)))) - -install:: $(INSTALL_PROGS) - @$(INSTALL_DIR) $(bindir) - @for i in $(INSTALL_PROGS); do \ - echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \ - $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ; \ - if test "$(darwin_TARGET_OS)" = "1"; then \ - sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(bindir)/$$i ; \ - fi ; \ - done -endif - -# -# Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and -# install without stripping. -# -ifneq "$(strip $(INSTALL_SCRIPTS))" "" -install:: $(INSTALL_SCRIPTS) - @$(INSTALL_DIR) $(bindir) - for i in $(INSTALL_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \ - done -endif - -ifneq "$(strip $(INSTALL_LIB_SCRIPTS))" "" -install:: $(INSTALL_LIB_SCRIPTS) - @$(INSTALL_DIR) $(libdir) - for i in $(INSTALL_LIB_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir); \ - done -endif - -ifneq "$(strip $(INSTALL_LIBEXEC_SCRIPTS))" "" -install:: $(INSTALL_LIBEXEC_SCRIPTS) - @$(INSTALL_DIR) $(libexecdir) - for i in $(INSTALL_LIBEXEC_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \ - done -endif - -ifneq "$(strip $(INSTALL_LIBS))" "" -install:: $(INSTALL_LIBS) - @$(INSTALL_DIR) $(libdir) - for i in $(INSTALL_LIBS); do \ - case $$i in \ - *.a) \ - $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \ - $(RANLIB) $(libdir)/`basename $$i` ;; \ - *.dll) \ - $(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; \ - done -endif - -ifneq "$(strip $(INSTALL_LIBEXECS))" "" -# -# See above comment next to defn of INSTALL_PROGS for what -# the purpose of this one-liner is. -# -INSTALL_LIBEXECS := $(foreach p, $(INSTALL_LIBEXECS), $(addsuffix $(subst _,,$(subst __,$(exeext),_$(suffix $(p))_)), $(basename $(p)))) - -install:: $(INSTALL_LIBEXECS) - @$(INSTALL_DIR) $(libexecdir) - -for i in $(INSTALL_LIBEXECS); do \ - $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \ - if test "$(darwin_TARGET_OS)" = "1"; then \ - sh $(FPTOOLS_TOP)/mk/fix_install_names.sh $(libdir) $(libexecdir)/`basename $$i` ; \ - fi ; \ - done -endif - -ifneq "$(strip $(INSTALL_DATAS))" "" -install:: $(INSTALL_DATAS) - @$(INSTALL_DIR) $(datadir) - for i in $(INSTALL_DATAS); do \ - $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \ - done -endif - -ifneq "$(strip $(INSTALL_IFACES))" "" -install:: $(INSTALL_IFACES) - @$(INSTALL_DIR) $(ifacedir) - for i in $(INSTALL_IFACES); do \ - $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(ifacedir); \ - done -endif - -ifneq "$(strip $(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 "$(strip $(INSTALL_INCLUDES))" "" -install:: $(INSTALL_INCLUDES) - @$(INSTALL_DIR) $(includedir) - for i in $(INSTALL_INCLUDES); do \ - $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(includedir); \ - done -endif - -ifneq "$(strip $(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 +# Regular static library +$(LIBRARY): $(LIBOBJS) + $(BUILD_STATIC_LIB) +endif # %.dll +endif # %.dylib +endif # %.so +endif # LIBRARY = "" -# TODO: The following could be an entry for an Obfuscated Makefile Contest... -ifneq "$(strip $(INSTALL_XML_DOC))" "" -ifneq "$(XMLDocWays)" "" -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; \ - $(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); \ - fi; \ - if [ $$i = "html-no-chunks" ]; then \ - echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir); \ - $(CP) $(FPTOOLS_CSS_ABS) $(datadir); \ - fi \ - done -endif -endif - -# -# Use with care.. -# -uninstall:: - @for i in $(INSTALL_PROGS) "" ; do \ - if test "$$i"; then \ - echo rm -f $(bindir)/`basename $$i`; \ - rm -f $(bindir)/`basename $$i`; \ - fi; \ - done - @for i in $(INSTALL_LIBS) ""; do \ - if test "$$i"; then \ - echo rm -f $(libdir)/`basename $$i`; \ - rm -f $(libdir)/`basename $$i`; \ - fi; \ - done - @for i in $(INSTALL_LIBEXECS) ""; do \ - if test "$$i"; then \ - echo rm -f $(libexecdir)/`basename $$i`; \ - rm -f $(libexecdir)/`basename $$i`; \ - fi; \ - done - @for i in $(INSTALL_DATAS) ""; do \ - if test "$$i"; then \ - echo rm -f $(datadir)/`basename $$i`; \ - rm -f $(datadir)/`basename $$i`; \ - fi; \ - done - -# -# install-strip is from the GNU Makefile standard. -# -ifneq "$(way)" "" -install-strip:: - @$(MAKE) EXTRA_INSTALL_OPTS='-s' install -endif +include $(TOP)/mk/install.mk ############################################################################## # @@ -936,22 +500,13 @@ ifneq "$(TAGS_C_SRCS)" "" endif @( DEREFFED=`ls -l Makefile | sed -e 's/.*-> \(.*\)/\1/g'` && $(RM) `dirname $$DEREFFED`/TAGS && $(CP) TAGS `dirname $$DEREFFED` ) 2>/dev/null || echo TAGS file generated, perhaps copy over to source tree? -#------------------------------------------------------------ -# Makefile debugging -# to see the effective value used for a Makefile variable, do -# make show VALUE=MY_VALUE -# - -show: - @echo '$(VALUE)="$($(VALUE))"' - ################################################################################ # # DocBook XML Documentation # ################################################################################ -.PHONY: html html-no-chunks htmlhelp fo dvi ps pdf +.PHONY: html html-no-chunks chm HxS fo dvi ps pdf ifneq "$(XML_DOC)" "" @@ -966,7 +521,8 @@ endif 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_CHM = $(addsuffix .chm,$(XML_DOC)) +XML_HxS = $(addsuffix .HxS,$(XML_DOC)) XML_FO = $(addsuffix .fo,$(XML_DOC)) XML_DVI = $(addsuffix .dvi,$(XML_DOC)) XML_PS = $(addsuffix .ps,$(XML_DOC)) @@ -976,7 +532,8 @@ $(XML_HTML) $(XML_NO_CHUNKS_HTML) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF) :: $ html :: $(XML_HTML) html-no-chunks :: $(XML_HTML_NO_CHUNKS) -htmlhelp :: $(XML_HTMLHELP) +chm :: $(XML_CHM) +HxS :: $(XML_HxS) fo :: $(XML_FO) dvi :: $(XML_DVI) ps :: $(XML_PS) @@ -1036,7 +593,7 @@ maintainer-clean:: extraclean ifneq "$(way)" "" ifeq "$(findstring $(way), $(WAYS))" "" -$(error Unknown way $(way)) +$(error Unknown way $(way) of $(WAYS)) endif endif @@ -1064,7 +621,8 @@ ifeq "$(way)" "" FPTOOLS_SUFFIXES := o hi hc WAY_TARGETS = $(foreach way,$(WAYS),$(foreach suffix, $(FPTOOLS_SUFFIXES), %.$(way)_$(suffix))) -LIB_WAY_TARGETS = $(foreach way,$(WAYS),%_$(way).a %_$(way)) +LIB_WAY_TARGETS = $(foreach way,$(filter-out %dyn,$(WAYS)), %_$(way).a) +LIB_WAY_TARGETS_DYN = $(foreach way,$(filter %dyn,$(WAYS)), %$(subst dyn,-ghc$(ProjectVersion),$(subst _dyn,dyn,$(way)))$(soext)) # $@ will be something like Foo.p_o # $(suffix $@) returns .p_o @@ -1082,6 +640,9 @@ $(WAY_TARGETS) : $(LIB_WAY_TARGETS) : $(MAKE) $(MFLAGS) $@ way=$(subst .,,$(suffix $(subst _,.,$(basename $@)))) +$(LIB_WAY_TARGETS_DYN) : + $(MAKE) $(MFLAGS) $@ way=$(patsubst _dyn,dyn,$(subst .,,$(suffix $(subst _,.,$(basename $(subst -ghc$(ProjectVersion),,$@)))))_dyn) + endif # if way # ------------------------------------------------------------------------- @@ -1094,7 +655,7 @@ endif # ------------------------------------------------------------------------- # Rules to invoke the current target recursively for each way -ifneq "$(WAYS)" "" +ifneq "$(strip $(WAYS))" "" ifeq "$(way)" "" # NB: the targets exclude @@ -1102,129 +663,28 @@ ifeq "$(way)" "" # since these are way-independent all docs TAGS clean distclean mostlyclean maintainer-clean install :: @echo "------------------------------------------------------------------------" - @echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..." + @echo "== Recursively making \`$@' for ways: $(WAYS) ..." @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; \ + case '${MFLAGS}' in *-[ik]*) x_on_err=0;; *-r*[ik]*) x_on_err=0;; *) x_on_err=1;; esac; \ for i in $(WAYS) ; do \ echo "------------------------------------------------------------------------"; \ - echo "==fptools== $(MAKE) way=$$i $@;"; \ + echo "== $(MAKE) way=$$i $@;"; \ echo "PWD = $(shell pwd)"; \ echo "------------------------------------------------------------------------"; \ $(MAKE) way=$$i --no-print-directory $(MFLAGS) $@ ; \ if [ $$? -eq 0 ] ; then true; else exit $$x_on_err; fi; \ done @echo "------------------------------------------------------------------------" - @echo "===fptools== Finished recursively making \`$@' for ways: $(WAYS) ..." + @echo "== Finished recursively making \`$@' for ways: $(WAYS) ..." @echo "PWD = $(shell pwd)" @echo "------------------------------------------------------------------------" 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" -# propagates "make " to directories in SUBDIRS -# -# (b) when SUBDIRS is empty, -# for each "multi-way-target" -# calls "make way=w " 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. -# -ifeq "$(way)" "" -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 -endif - -# -# Selectively building subdirectories. -# -# -ifneq "$(SUBDIRS)" "" -$(SUBDIRS) :: - $(MAKE) -C $@ $(MFLAGS) -endif +include $(TOP)/mk/recurse.mk # ----------------------------------------------------------------------------- # Further cleaning