X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=mk%2Ftarget.mk;h=0e18308a984a9b4e4dc4b1de6908b6c620e79315;hb=c0be61743a875b59a1ffe6f0af6a50d4f9d091ef;hp=970a69bcc17f6b41c5bd200321428dae98a3a097;hpb=32e5291f88d946e86519cb2e9d9c400e8d311f46;p=ghc-hetmet.git diff --git a/mk/target.mk b/mk/target.mk index 970a69b..c824dad 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -16,10 +16,10 @@ # 2. GNU standard targets # all* # install* uninstall installcheck installdirs +# install-docs* # clean* distclean* mostlyclean* maintainer-clean* # tags* -# info dvi ps -# dist binary-dist +# dvi ps (no info) FPTOOLS adds: pdf rtf html # check # # 3. Some of the above targets have a version that @@ -33,6 +33,21 @@ # # +################################################################## +# 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 @@ -59,25 +74,24 @@ # .PHONY: depend -depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) +# Compiler produced files that are targets of the source's imports. +MKDEPENDHS_OBJ_SUFFICES=o + +ifneq "$(BootingFromHc)" "YES" +PKGCONF_DEP = $(STAMP_PKG_CONF) +endif + +depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP) @$(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) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS) + $(MKDEPENDC) -f .depend $(MKDEPENDC_OPTS) $(foreach way,$(WAYS),-s $(way)) -- $(CC_OPTS) -- $(MKDEPENDC_SRCS) endif ifneq "$(MKDEPENDHS_SRCS)" "" -ifeq ($(notdir $(MKDEPENDHS)),ghc) -# New way of doing dependencies: the ghc driver knows how to invoke script - $(MKDEPENDHS) -M -optdep-f -optdep.depend $(foreach way,$(WAYS),-optdep-s -optdep$(way)) $(MKDEPENDHS_OPTS) $(HC_OPTS) $(MKDEPENDHS_SRCS) -else -# Old way: call mkdependHS-1.2 - $(MKDEPENDHS) -f .depend $(MKDEPENDHS_OPTS) \ - $(foreach way,$(WAYS),-s $(way)) \ - -- $(HC_OPTS) -- $(MKDEPENDHS_SRCS) -endif + $(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) endif @@ -87,8 +101,12 @@ endif # The boot target, at a minimum generates dependency information .PHONY: boot -boot :: depend +ifeq "$(NO_BOOT_TARGET)" "YES" +boot :: +else +boot :: depend +endif ################################################################## # GNU Standard targets @@ -97,9 +115,7 @@ boot :: depend # # `all' # Compile the entire program. This should be the default target. -# This target need not rebuild any documentation files; Info files -# should normally be included in the distribution, and DVI files -# should be made only when explicitly asked for. +# This target need not rebuild any documentation files # # `install' # Compile the program and copy the executables, libraries, and so on @@ -118,27 +134,6 @@ boot :: depend # will ignore any errors. This is in case there are systems that # don't have the Unix man page documentation system installed. # -# The way to install Info files is to copy them into `$(infodir)' -# with $(INSTALL_DATA) (see Command Variables), and then run the -# install-info program if it is present. install-info is a script -# that edits the Info `dir' file to add or update the menu entry for -# the given Info file; it will be part of the Texinfo package. Here -# is a sample rule to install an Info file: -# -# $(infodir)/foo.info: foo.info # There may be a newer info -# file in . than in srcdir. -# -if test -f foo.info; then d=.; \ -# else d=$(srcdir); fi; \ $(INSTALL_DATA) -# $$d/foo.info $@; \ # Run install-info only if it -# exists. # Use `if' instead of just prepending `-' to the -# # line so we notice real errors from install-info. # We -# use `$(SHELL) -c' because some shells do not # fail -# gracefully when there is an unknown command. -# if $(SHELL) -c 'install-info --version' \ -# >/dev/null 2>&1; then \ install-info -# --infodir=$(infodir) $$d/foo.info; \ else true; -# fi -# # `uninstall' # Delete all the installed files that the `install' target would # create (but not the noninstalled files such as `make all' would @@ -172,7 +167,7 @@ boot :: depend # Delete everything from the current directory that can be # reconstructed with this Makefile. This typically includes # everything deleted by distclean , plus more: C source files -# produced by Bison, tags tables, Info files, and so on. +# produced by Bison, tags tables, and so on. # # One exception, however: `make maintainer-clean' should not delete # `configure' even if `configure' can be remade using a rule in the @@ -183,53 +178,11 @@ boot :: depend # `TAGS' # Update a tags table for this program. # -# `info' -# Generate any Info files needed. The best way to write the rules is -# as follows: -# -# info: foo.info -# -# foo.info: foo.texi chap1.texi chap2.texi -# $(MAKEINFO) $(srcdir)/foo.texi -# -# You must define the variable MAKEINFO in the Makefile. It should -# run the makeinfo program, which is part of the Texinfo -# distribution. -# -# `dvi' `ps' -# Generate DVI files for all TeXinfo documentation. For example: -# -# dvi: foo.dvi -# -# foo.dvi: foo.texi chap1.texi chap2.texi -# $(TEXI2DVI) $(srcdir)/foo.texi -# -# You must define the variable TEXI2DVI in the Makefile. It should -# run the program texi2dvi , which is part of the Texinfo -# distribution. Alternatively, write just the dependencies, and -# allow GNU Make to provide the command. +# `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. # -# ps is a FPtools addition for Postscript files -# -# `dist' `binary-dist' -# Create a distribution tar file for this program. The tar file -# should be set up so that the file names in the tar file start with -# a subdirectory name which is the name of the package it is a -# distribution for. This name can include the version number. -# -# For example, the distribution tar file of GCC version 1.40 unpacks -# into a subdirectory named `gcc-1.40'. -# -# The easiest way to do this is to create a subdirectory -# appropriately named, use ln or cp to install the proper files in -# it, and then tar that subdirectory. -# -# The dist target should explicitly depend on all non-source files -# that are in the distribution, to make sure they are up to date in -# the distribution. See Making Releases. -# -# binary-dist is an FPtools addition for binary distributions -# # `check' # Perform self-tests (if any). The user must build the program # before running the tests, but need not install the program; you @@ -249,8 +202,8 @@ boot :: depend # 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 don't use the suggested script, but rather the -# mkdirhier script in glafp_utils -- SOF) +# (FPTOOLS: we use a close relative of the suggested script, situated +# in glafp-utils/mkdirhier -- SOF) @@ -280,8 +233,14 @@ boot :: depend ifneq "$(HS_PROG)" "" all :: $(HS_PROG) -$(HS_PROG) :: $(HS_OBJS) - $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) $(LIBS) +ifneq "$(BootingFromHc)" "YES" +$(HS_PROG) :: $(OBJS) + $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(OBJS) +else +# see bootstrap.mk +$(HS_PROG) :: $(OBJS) + $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(OBJS) $(HC_BOOT_LIBS) +endif endif #---------------------------------------- @@ -294,19 +253,33 @@ $(C_PROG) :: $(C_OBJS) $(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS) endif - #---------------------------------------- # Libraries/archives +# +# Build $(LIBRARY) from $(LIBOBJS)+$(STUBOBJS) +# +# Inputs: +# $(LIBOBJS) +# $(STUBOBJS) +# +# Outputs: +# Rule to build $(LIBRARY) ifneq "$(LIBRARY)" "" all :: $(LIBRARY) - +ifneq "$(way)" "i" define BUILD_LIB $(RM) $@ -$(AR) $(AR_OPTS) $@ $(LIBOBJS) +$(AR) $(AR_OPTS) $@ $(STUBOBJS) $(LIBOBJS) $(RANLIB) $@ endef +else +define BUILD_LIB +$(RM) $@ +al -out:$@ $(STUBOBJS) $(LIBOBJS) +endef +endif # # For Haskell object files, we might have chosen to split @@ -316,19 +289,216 @@ endef # ifneq "$(HS_SRCS)" "" -ifneq "$(filter -split-objs,$(HC_OPTS))" "" +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 +# 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 -$(RM) $@ -TMPDIR=$(TMPDIR); export TMPDIR; find $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o' -print | xargs ar q $@ +$(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 +$(RM) $@ $@.tmp +echo $(STUBOBJS) > $@.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) $@ endef -endif # $(filter... endif -$(LIBRARY) :: $(LIBOBJS) +# 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" +HC_SPLIT_POST = (cd $(basename $@)_split && $(LD) -r $(LD_X) -o ../$(notdir $@) *.$(way_)o) +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 +# the myriads of object files have been put. +# + +extraclean :: + $(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) + +# +# Remove local symbols from library objects if requested. +# + +ifeq "$(StripLibraries)" "YES" +ifeq "$(SplitObjs)" "YES" +SRC_HC_POST_OPTS += \ + for i in $(basename $@)_split/*; do \ + $(LD) -r $(LD_X) -o $$i.tmp $$i; \ + $(MV) $$i.tmp $$i; \ + done +else +SRC_HC_POST_OPTS += \ + $(LD) -r $(LD_X) -o $@.tmp $@; $(MV) $@.tmp $@ +endif # SplitObjs +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 = "" + +#---------------------------------------- +# Building Win32 DLLs +# + +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 + +ifeq "$(DLL_NAME)" "" +DLL_NAME = $(patsubst %.a,%.dll,$(subst lib,,$(LIBRARY))) endif +ifneq "$(DLL_NAME)" "" +DLL_NAME := $(DLL_PEN)/$(DLL_NAME) +endif + +all :: $(DLL_NAME) + +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 + +# +# Version information is baked into a DLL by having the DLL include DllVersionInfo.o. +# The version info contains two user tweakables: DLL_VERSION and DLL_VERSION_NAME. +# (both are given sensible defaults though.) +# +# Note: this will not work as expected with Cygwin B20.1; you need a more recent +# version of binutils (to pick up windres bugfixes.) + +ifndef DLL_VERSION +DLL_VERSION=$(ProjectVersion) +endif + +ifndef DLL_VERSION_NAME +DLL_VERSION_NAME="http://www.haskell.org/ghc" +endif + +ifndef DLL_DESCRIPTION +DLL_DESCRIPTION="A GHC-compiled DLL" +endif + +ifndef EXE_VERSION +EXE_VERSION=$(ProjectVersion) +endif + +ifndef EXE_VERSION_NAME +EXE_VERSION_NAME="http://www.haskell.org/ghc" +endif + +ifndef EXE_DESCRIPTION +EXE_DESCRIPTION="A GHC-compiled binary" +endif + +# +# Little bit of lo-fi mangling to get at the right set of settings depending +# on whether we're generating the VERSIONINFO for a DLL or EXE +# +DLL_OR_EXE=$(subst VersionInfo.$(way_)rc,,$@) +VERSION_FT=$(subst Dll, 0x2L, $(subst Exe, 0x1L, $(DLL_OR_EXE))) +VERSION_RES_NAME=$(subst Exe,$(EXE_VERSION_NAME), $(subst Dll, $(DLL_VERSION_NAME),$(DLL_OR_EXE))) +VERSION_RES=$(subst Exe,$(EXE_VERSION), $(subst Dll, $(DLL_VERSION),$(DLL_OR_EXE))) +VERSION_DESC=$(subst Exe,$(EXE_DESCRIPTION), $(subst Dll, $(DLL_DESCRIPTION),$(DLL_OR_EXE))) + +DllVersionInfo.$(way_)rc ExeVersionInfo.$(way_)rc: + $(RM) DllVersionInfo.$(way_)rc + echo "1 VERSIONINFO" > $@ + echo "FILEVERSION 1,0,0,1" >> $@ + echo "PRODUCTVERSION 1,0,0,1" >> $@ + echo "FILEFLAGSMASK 0x3fL" >> $@ + echo "FILEOS 0x4L" >> $@ + echo "FILETYPE $(VERSION_FT)" >> $@ + echo "FILESUBTYPE 0x0L" >> $@ + echo "BEGIN" >> $@ + echo " BLOCK \"StringFileInfo\"" >> $@ + echo " BEGIN" >> $@ + echo " BLOCK \"040904B0\"" >> $@ + echo " BEGIN" >> $@ + echo " VALUE \"CompanyName\", \"$(VERSION_RES_NAME)\\0\"" >> $@ + echo " VALUE \"FileVersion\", \"$(VERSION_RES)\\0\"" >> $@ + echo " VALUE \"ProductVersion\", \"$(VERSION_RES)\\0\"" >> $@ + echo " VALUE \"FileDescription\", \"$(VERSION_DESC)\\0\"" >> $@ + echo " END" >> $@ + echo " END" >> $@ + echo " BLOCK \"VarFileInfo\"" >> $@ + echo " BEGIN" >> $@ + echo " VALUE \"Translation\", 0x0409, 1200" >> $@ + echo " END" >> $@ + echo "END" >> $@ + #---------------------------------------- # Script programs @@ -369,20 +539,19 @@ ifneq "$(SCRIPT_PROG)" "" # # 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) +$(SCRIPT_PROG) : $(SCRIPT_OBJS) $(RM) $@ @echo Creating $@... ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" - @echo "eval 'exec perl -S $$$""0 $$""{1+\"$$$""@\"}'" > $@ - @echo " if $$""running_under_some_shell;" >> $@ -else - @touch $@ -endif + echo "#! "$(PERL) > $@ else ifneq "$(INTERP)" "" @echo "#!"$(INTERP) > $@ @@ -393,12 +562,77 @@ 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 + ########################################### # @@ -409,11 +643,13 @@ endif # For each of these variables that is defined, you # get one install rule # -# INSTALL_PROGS install these executable programs in $(bindir) -# INSTALL_SCRIPTS install these executable scripts in $(bindir) -# INSTALL_LIBS install these platform-dependent libraries in $(libdir) -# INSTALL_LIBEXECS install these platform-dependent execs in $(libdir) -# INSTALL_DATAS install these platform-independent files in $(datadir) +# 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. @@ -422,94 +658,213 @@ endif # friends can be overridden from their original settings in mk/config.mk.in # || mk/build.mk # -.PHONY: install installdirs install-strip install-dirs uninstall install-docs +.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. # -installdirs :: +install-dirs :: @$(INSTALL_DIR) $(bindir) @$(INSTALL_DIR) $(libdir) @$(INSTALL_DIR) $(libexecdir) @$(INSTALL_DIR) $(datadir) # Better do this first... -install:: installdirs +# 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 "$(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_PROGRAM) $(INSTALL_BIN_OPTS) $(INSTALL_PROGS) $(bindir) + @$(INSTALL_DIR) $(bindir) + @for i in $(INSTALL_PROGS); do \ + echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ; \ + done endif - +# +# Just like INSTALL_PROGS, but prefix with install sites bin/lib/data and +# install without stripping. +# ifneq "$(INSTALL_SCRIPTS)" "" install:: $(INSTALL_SCRIPTS) -ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" - @for i in $(INSTALL_SCRIPTS); do \ - $(RM) $$i.tmp; \ - echo "eval 'exec $(PERL) -S $$$""0 $$""{1+\"$$$""@\"}'" > $$i.tmp ; \ - echo " if $$""running_under_some_shell;" >> $$i.tmp ; \ - echo $$"bindir='$(bindir);'" >> $$i.tmp ; \ - echo $$"libdir='$(real_libdir)';" >> $$i.tmp ; \ - echo $$"datadir='$(real_datadir)';" >> $$i.tmp ; \ - cat $$i >> $$i.tmp ; \ - echo $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i $(bindir) ; \ - $(INSTALL_PROGRAM) $(INSTALL_OPTS) $$i.tmp $(bindir)/$$i ; \ - $(RM) $$i.tmp; \ + @$(INSTALL_DIR) $(bindir) + for i in $(INSTALL_SCRIPTS); do \ + $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \ done -else - $(INSTALL_PROGRAM) $(INSTALL_OPTS) $(INSTALL_SCRIPTS) $(bindir) endif -else - $(INSTALL_PROGRAM) $(INSTALL_OPTS) $(INSTALL_SCRIPTS) $(bindir) + +ifneq "$(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 "$(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 "$(INSTALL_LIBS)" "" install:: $(INSTALL_LIBS) - $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_LIBS) $(libdir) + @$(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) ;; \ + *) \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(libdir); \ + esac; \ + done endif ifneq "$(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_PROGRAM) $(INSTALL_BIN_OPTS) $(INSTALL_LIBEXECS) $(libexecdir) + @$(INSTALL_DIR) $(libexecdir) + -for i in $(INSTALL_LIBEXECS); do \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \ + done endif ifneq "$(INSTALL_DATAS)" "" install:: $(INSTALL_DATAS) - $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_DATAS) $(datadir) + @$(INSTALL_DIR) $(datadir) + for i in $(INSTALL_DATAS); do \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \ + 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) + for i in $(INSTALL_INCLUDES); do \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(includedir); \ + done +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 + +# 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 $(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 ) ; \ + 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:: -ifeq ($(INSTALL_PROGS),) - @for i in $(INSTALL_PROGS) ; do \ + @for i in $(INSTALL_PROGS) "" ; do \ + if test "$$i"; then \ echo rm -f $(bindir)/`basename $$i`; \ rm -f $(bindir)/`basename $$i`; \ + fi; \ done -endif -ifeq ($(INSTALL_LIBS),) - @for i in $(INSTALL_LIBS); do \ + @for i in $(INSTALL_LIBS) ""; do \ + if test "$$i"; then \ echo rm -f $(libdir)/`basename $$i`; \ rm -f $(libdir)/`basename $$i`; \ + fi; \ done -endif -ifeq ($(INSTALL_LIBEXECS),) - @for i in $(INSTALL_LIBEXECS); do \ + @for i in $(INSTALL_LIBEXECS) ""; do \ + if test "$$i"; then \ echo rm -f $(libexecdir)/`basename $$i`; \ rm -f $(libexecdir)/`basename $$i`; \ + fi; \ done -endif -ifeq ($(INSTALL_DATAS),) - @for i in $(INSTALL_DATAS); do \ + @for i in $(INSTALL_DATAS) ""; do \ + if test "$$i"; then \ echo rm -f $(datadir)/`basename $$i`; \ rm -f $(datadir)/`basename $$i`; \ + fi; \ done -endif # # install-strip is from the GNU Makefile standard. @@ -519,146 +874,11 @@ install-strip:: @$(MAKE) EXTRA_INSTALL_OPTS='-s' install endif -########################################### -# -# Targets: dist binary-dist -# -########################################### - - +############################################################################## # -# dist-pre is a canned rule the toplevel of your source tree -# would use as follows, +# Targets: check tags show # -# dist :: dist-pre -# -# it performs two tasks, first creating the distribution directory -# tree and it then decorates the new tree with symbolic links pointing -# to the symbolic links in the build tree. -# -# The dist-pre relies on (at least) the `find' in GNU findutils -# (only tested with version 4.1). All non-GNU `find's I have -# laid on my hands locally, has a restrictive treatment of {} in -# -exec commands, i.e., -# -# find . -print echo a{} \; -# -# does not expand the {}, it has to be a separate argument (i.e. `a {}'). -# GNU find is (IMHO) more sensible here, expanding any {} it comes across -# inside an -exec, whether it is a separate arg or part of a word: -# -# $ touch yes -# $ find --version -# GNU find version 4.1 -# $ find yes -exec echo oh,{}! \; -# oh,yes! -# -# Of course, the above is not impossible toi achieve with other finds, -# just that GNU find does the Patently Right Thing here :) -# -# ====> if you're using these dist rules, get hold of GNU findutils. -# -# --SOF 2/97 -# -.PHONY: dist dist-pre dist-post - -dist-pre:: - -rm -rf $(SRC_DIST_DIR) - -rm -f $(SRC_DIST_NAME).tar.gz - (cd $(FPTOOLS_TOP_ABS); find $(SRC_DIST_DIRS) -type d \( -name CVS -prune -o -name SRC -prune -o -exec $(MKDIRHIER) $(SRC_DIST_DIR)/{} \; \) ; ) - (cd $(FPTOOLS_TOP_ABS); find $(SRC_DIST_DIRS) -name CVS -prune -o -name SRC -prune -o -name "*~" -prune -o -name ".cvsignore" -prune -o -type l -exec $(LN_S) $(FPTOOLS_TOP_ABS)/{} $(SRC_DIST_DIR)/{} \; ) - -# -# After having created a shadow distribution tree and copied/linked -# all the necessary files to it, `dist-post' makes sure the permissions -# are set right and packages up the tree. -# -# For now, we make the packaging a separate rule, so as to allow -# the inspection of the dist tree before eventually packaging it up. -# -dist-post:: - ( cd $(SRC_DIST_DIR) ; cd .. ; chmod -R a+rw $(SRC_DIST_NAME) ) - -dist-package:: - cd $(SRC_DIST_DIR); cd ..; $(TAR) chzf $(SRC_DIST_NAME).tar.gz $(SRC_DIST_NAME) - -# -# The default dist rule: -# -# copy/link the contents of $(SRC_DIST_FILES) into the -# shadow distribution tree. SRC_DIST_FILES contain the -# build-generated files that you want to include in -# a source distribution. -# -# -ifneq "$(SRC_DIST_FILES)" "" -dist:: - @for i in $(SRC_DIST_FILES); do \ - if (test -f "$$i"); then \ - echo $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ; \ - $(LN_S) `pwd`/$$i $(SRC_DIST_DIR)/$$i ; \ - fi; \ - done; -endif - -# -# binary-dist creates a binary bundle, set BIN_DIST_NAME -# to package name and do `make binary-dist' (normally this -# just a thing you would do from the toplevel of fptools or) -# from the top of a project. -# -.PHONY: binary-dist-pre binary-dist binary-pack - -binary-dist-pre:: - -rm -rf $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) - -rm -f $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME).tar.gz - @for i in $(BIN_DIST_DIRS); do \ - if (test -d "$$i"); then \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion); \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion); \ - echo $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \ - prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion) ; \ - $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \ - prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$$i-$(ProjectVersion) \ - datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$$i-$(ProjectVersion) ; \ - fi; \ - done - -# -# Do this separately for now -# -binary-pack:: - ( cd $(BIN_DIST_TMPDIR); $(TAR) chzf $(BIN_DIST_NAME).tar.gz $(BIN_DIST_NAME); rm -rf $(BIN_DIST_NAME) ) - -ifneq "$(way)" "" -package-way-dist:: - ( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print | xargs tar cvf $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar ) - gzip $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar -endif - -ifneq "$(way)" "" -remove-way-dist:: - ( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print -exec rm -f {} \; ) -endif - -########################################### -# -# Targets: check tags show info -# -########################################### +############################################################################## #------------------------------------------------------------ # Check @@ -676,17 +896,18 @@ check:: $(TESTS) #------------------------------------------------------------ # Tags -.PHONY: TAGS +.PHONY: TAGS tags -TAGS:: $(SOURCES) +tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS) @$(RM) TAGS @touch TAGS -ifneq "$(HS_SRCS)" "" - $(HSTAGS) $(HSTAGS_OPTS) -- $(HS_SRCS) +ifneq "$(TAGS_HS_SRCS)" "" + $(HSTAGS) $(HSTAGS_OPTS) $(TAGS_HS_SRCS) endif -ifneq "$(C_SRCS)" "" - etags -a $(C_SRCS) +ifneq "$(TAGS_C_SRCS)" "" + etags -a $(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 @@ -695,120 +916,88 @@ endif # show: - @echo '$(VALUE)=$($(VALUE))' + @echo '$(VALUE)="$($(VALUE))"' -#------------------------------------------------------------ -# Documentation - -.PHONY: dvi ps html info txt - -info:: $(DOC_INFO) -dvi:: $(DOC_DVI) -ps:: $(DOC_PS) -html:: $(DOC_HTML) -texi:: $(DOC_TEXI) -txt:: $(DOC_TEXT) - -# -# Building literate root documents requires extra treatment, -# as the root files need to be processed different from other -# literate files (`compile' them into .itex with the -S (standalone) -# option) and then link together a master TeX document with -# a -S option. -# -$(filter %.tex,$(patsubst %.lit,%.tex,$(DOC_SRCS))) : - @$(RM) $@ - $(LIT2LATEX) -S -c $(LIT2LATEX_OPTS) -o $(patsubst %.tex,%.itex,$@) $(addsuffix .lit,$(basename $@)) - $(LIT2LATEX) -S $(LIT2LATEX_OPTS) -o $@ $(addsuffix .itex,$(basename $@)) - @chmod 444 $@ -# -# Ditto for texi and html -# -$(filter %.texi,$(patsubst %.lit,%.texi,$(DOC_SRCS))) : - @$(RM) $@ - $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.texi,%.itxi,$@) $(addsuffix .lit,$(basename $@)) - $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o $@ $(addsuffix .itxi,$(basename $@)) - @chmod 444 $@ -# -# Rather than using lit2html, we opt for the lit-texi-html route, -# and use texi2html as our HTML backend. -# (Note: we need to change mkdependlit to get this really off the ground) -# -# If the generated html representation is split up into a myriad of files, -# put the files in a subdirectory html/, if a monolith is created, park -# the generated file in the same dir as the .lit file. -# -$(filter %.html,$(patsubst %.lit,%.html,$(DOC_SRCS))) : $(filter %.lit,$(DOC_SRCS)) - $(RM) $@ $(patsubst %.html,%.texi,$@) $(patsubst %.html,%.itxi,$@) -ifneq "$(filter -monolithic,$(TEXI2HTML_OPTS))" "" - $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.itxi,$@) $(addsuffix .lit,$(basename $@)) - $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.texi,$@) $(addsuffix .itxi,$(basename $@)) - $(TEXI2HTML) $(TEXI2HTML_OPTS) $(patsubst %.html,%.texi,$@) - cp $(TEXI2HTML_PREFIX)invisible.xbm . -else - $(RM) html/$(basename $@)* - $(MKDIRHIER) html - $(LIT2TEXI) -S -c $(LIT2TEXI_OPTS) -o $(patsubst %.html,%.itxi,$@) $(addsuffix .lit,$(basename $@)) - $(LIT2TEXI) -S $(LIT2TEXI_OPTS) -o html/$(patsubst %.html,%.texi,$@) $(addsuffix .itxi,$(basename $@)) - (cd html; ../$(TEXI2HTML) $(TEXI2HTML_OPTS) $(patsubst %.html,%.texi,$@); cd ..) - cp $(TEXI2HTML_PREFIX)invisible.xbm html/ - @touch $@ -endif -########################################### +################################################################################ # -# Targets: clean +# DocBook XML Documentation # -########################################### +################################################################################ -.PHONY: realclean mostlyclean clean distclean maintainer-clean +.PHONY: html html-no-chunks htmlhelp fo dvi ps pdf -# realclean is just a synonym for maintainer-clean -realclean: maintainer-clean +ifneq "$(XML_DOC)" "" +all :: $(XMLDocWays) -ifneq "$(MOSTLY_CLEAN_FILES)" "" -mostlyclean:: - rm -f $(MOSTLY_CLEAN_FILES) -endif +# multi-file XML document: main document name is specified in $(XML_DOC), +# sub-documents (.xml files) listed in $(XML_SRCS). -ifneq "$(CLEAN_FILES)" "" -clean:: mostlyclean - rm -f $(CLEAN_FILES) +ifeq "$(XML_SRCS)" "" +XML_SRCS = $(wildcard *.xml) endif +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)) -ifneq "$(DIST_CLEAN_FILES)" "" -distclean:: mostlyclean clean - rm -f $(DIST_CLEAN_FILES) -endif +$(XML_HTML) $(XML_NO_CHUNKS_HTML) $(XML_FO) $(XML_DVI) $(XML_PS) $(XML_PDF) :: $(XML_SRCS) +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) -ifneq "$(MAINTAINER_CLEAN_FILES)" "" -maintainer-clean:: mostlyclean clean distclean - @echo 'This command is intended for maintainers to use; it' - @echo 'deletes files that may need special tools to rebuild.' - rm -f $(MAINTAINER_CLEAN_FILES) +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 + +validate :: + $(XMLLINT) --valid --noout $(XMLLINT_OPTS) $(XML_DOC).xml endif +############################################################################## # -# If (Haskell) object files are split, cleaning up -# consist of descending into the directories where -# the myriads of object files have been put. +# Targets: clean # +############################################################################## -ifneq "$(HS_OBJS)" "" -ifneq "$(filter -split-objs,$(HC_OPTS))" "" -clean :: - find $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food; -endif -endif +# we have to be careful about recursion here; since all the clean +# targets are recursive, we don't want to make eg. distclean depend on +# clean because that would result in far too many recursive calls. +.PHONY: mostlyclean clean distclean maintainer-clean -################################################################################# +mostlyclean:: + rm -f $(MOSTLY_CLEAN_FILES) + +# extraclean is used for adding actions to the clean target. +extraclean:: + +clean:: extraclean + rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) + +distclean:: extraclean + rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) $(DIST_CLEAN_FILES) + +maintainer-clean:: extraclean + @echo 'This command is intended for maintainers to use; it' + @echo 'deletes files that may need special tools to rebuild.' + rm -f $(MOSTLY_CLEAN_FILES) $(CLEAN_FILES) $(DIST_CLEAN_FILES) $(MAINTAINER_CLEAN_FILES) + +################################################################################ # # Way management # -################################################################################# +################################################################################ # Here is the ingenious jiggery pokery that allows you to build multiple versions # of a program in a single build tree. @@ -846,9 +1035,11 @@ WAY_TARGETS = $(foreach way,$(WAYS),$(foreach suffix, $(FPTOOLS_SUFFIXES), % LIB_WAY_TARGETS = $(foreach way,$(WAYS),%_$(way).a %_$(way)) # $@ will be something like Foo.p_o -# $(suffix $@) will be .p_o -# The sed script extracts the "p" part. - +# $(suffix $@) returns .p_o +# $(subst .,.p_o) returns p_o +# $(subst _,.,p_o) returns p.o (clever) +# $(basename p.o) returns p +# $(WAY_TARGETS) : $(MAKE) way=$(basename $(subst _,.,$(subst .,,$(suffix $@)))) $@ @@ -861,11 +1052,58 @@ $(LIB_WAY_TARGETS) : endif # if way +# ------------------------------------------------------------------------- +# Object and interface files have suffixes tagged with their ways + +ifneq "$(way)" "" +SRC_HC_OPTS += -hisuf $(way_)hi -hcsuf $(way_)hc -osuf $(way_)o +endif + +# ------------------------------------------------------------------------- +# Rules to invoke the current target recursively for each way + +ifneq "$(WAYS)" "" +ifeq "$(way)" "" + +# NB: the targets exclude +# boot runtests +# since these are way-independent +all docs TAGS clean distclean mostlyclean maintainer-clean install :: + @echo "------------------------------------------------------------------------" + @echo "===fptools== 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; \ + for i in $(WAYS) ; do \ + echo "------------------------------------------------------------------------"; \ + echo "==fptools== $(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 "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 @@ -875,7 +1113,7 @@ endif # if way # # (b) when SUBDIRS is empty, # for each "multi-way-target" -# calls "make -way=w " for each w in $(WAYS) +# 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 @@ -886,35 +1124,66 @@ endif # if way # No ways, so iterate over the SUBDIRS -ifeq "$(way)" "" +# 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)" "" -all docs runtests boot TAGS clean veryclean maintainer-clean install info :: - @case '${MFLAGS}' in *[ik]*) set +e;; esac; +# 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 "------------------------------------------------------------------------" - @for i in $(SUBDIRS) ; do \ +# 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) $@;"; \ + 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 "------------------------------------------------------------------------" -dist :: - @case '${MFLAGS}' in *[ik]*) set +e;; esac; \ - for i in $(SUBDIRS) ; do \ - $(MKDIRHIER_PREFIX)mkdirhier $(SRC_DIST_DIR)/$$i; \ - $(MAKE) -C $$i $(MFLAGS) $@ SRC_DIST_DIR=$(SRC_DIST_DIR)/$$i; \ - done -endif endif +#endif # # Selectively building subdirectories. @@ -924,30 +1193,3 @@ ifneq "$(SUBDIRS)" "" $(SUBDIRS) :: $(MAKE) -C $@ $(MFLAGS) endif - -ifneq "$(WAYS)" "" -ifeq "$(way)" "" - -# NB: the targets exclude -# boot info TAGS -# since these are way-independent -all docs runtests TAGS clean veryclean maintainer-clean install :: - @echo "------------------------------------------------------------------------" - @echo "===fptools== Recursively making \`$@' for ways: $(WAYS) ..." - @echo "PWD = $(shell pwd)" - @echo "------------------------------------------------------------------------" - @for i in $(WAYS) ; do \ - echo "------------------------------------------------------------------------"; \ - echo "==fptools== $(MAKE) way=$$i $@;"; \ - echo "PWD = $(shell pwd)"; \ - echo "------------------------------------------------------------------------"; \ - $(MAKE) way=$$i --no-print-directory $(MFLAGS) $@ ; \ - done - @echo "------------------------------------------------------------------------" - @echo "===fptools== Finished recusrively making \`$@' for ways: $(WAYS) ..." - @echo "PWD = $(shell pwd)" - @echo "------------------------------------------------------------------------" - -endif -endif -