X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=mk%2Ftarget.mk;h=59f00efc02b4a9b7a0e61452f1c2f6b60f5863f8;hb=d3bd93cf2747fabb8bd7c6df434c9ce98d0fc253;hp=8b09305914385537b16442fbb57b8ab142e2179e;hpb=e99733ffee71d1f3737f3ea39a31e9449f51be94;p=ghc-hetmet.git diff --git a/mk/target.mk b/mk/target.mk index 8b09305..59f00ef 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -16,6 +16,7 @@ # 2. GNU standard targets # all* # install* uninstall installcheck installdirs +# install-docs* # clean* distclean* mostlyclean* maintainer-clean* # tags* # dvi ps (no info) FPTOOLS adds: pdf rtf html @@ -32,91 +33,6 @@ # # - -################################################################## -# -# Recursive stuff -# -# At the top of the file so that recursive makes happen before -# makes in the main directory. This is needed for some targets, -# e.g. when building DLLs in hslibs. -# -################################################################## - -# 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. -# -# NOTE: Truly weird use of exit below to stop the for loop dead in -# its tracks should any of the sub-makes fail. By my reckoning, -# "cmd || exit $?" should be equivalent to "cmd" - -ifneq "$(SUBDIRS)" "" - -# we override the boot & all targets in the top level Makefile -ifneq "$(NO_ALL_TARGETS)" "YES" -ALL_TARGET = all -BOOT_TARGET = boot -INSTALL_TARGET = install -endif - -$(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean maintainer-clean $(INSTALL_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 - -# -# Selectively building subdirectories. -# -# -ifneq "$(SUBDIRS)" "" -$(SUBDIRS) :: - $(MAKE) -C $@ $(MFLAGS) -endif - ################################################################## # FPtools standard targets # @@ -165,8 +81,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 @@ -297,23 +217,12 @@ ifneq "$(BootingFromHc)" "YES" $(HS_PROG) :: $(HS_OBJS) $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) else -# see bootstrp.mk +# see bootstrap.mk $(HS_PROG) :: $(HS_OBJS) $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(HS_OBJS) $(HC_BOOT_LIBS) endif -endif -# 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 - -# add syslib dependencies and current package name -SRC_HC_OPTS += $(patsubst %, -package %, $(PACKAGE_DEPS)) -ifneq "$(PACKAGE)" "" -SRC_HC_OPTS += -package-name $(PACKAGE) -else -# No library, we are actually building the tools +# for building a Haskell program, we add FptoolsHcOpts SRC_HC_OPTS += $(FptoolsHcOpts) endif @@ -347,17 +256,33 @@ endif 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 -SRCS += $(wildcard ../*_hsc.c) +C_SRCS += $(wildcard ../*_hsc.c) # Make .hsc.h include files from the directory above visible -SRC_CC_OPTS += -I.. +# (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) @@ -371,11 +296,8 @@ ifeq "$(LIBOBJS)" "" endif endif -SRC_CC_OPTS += -I$(GHC_INCLUDE_DIR) -I$(GHC_RUNTIME_DIR) - ifeq "$(IS_CBITS_LIB)" "YES" override datadir:=$(libdir)/include -INSTALL_DATAS += Hs$(shell perl -e 'print ucfirst "$(PACKAGE)"').h else SRC_CC_OPTS += -Icbits endif @@ -385,7 +307,7 @@ endif # PACKAGE #---------------------------------------- # Libraries/archives # -# Build $(LIBRARY) from $(LIBOJBS)+$(STUBOBJS) +# Build $(LIBRARY) from $(LIBOBJS)+$(STUBOBJS) # # Inputs: # $(LIBOBJS) @@ -397,11 +319,18 @@ endif # PACKAGE ifneq "$(LIBRARY)" "" all :: $(LIBRARY) +ifneq "$(way)" "i" define BUILD_LIB $(RM) $@ $(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 @@ -418,20 +347,25 @@ 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) $@ -(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@ -$(RANLIB) $@ +$(RM) $@ $@.tmp +(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@.tmp +$(RANLIB) $@.tmp +$(MV) $@.tmp $@ endef else define BUILD_LIB -$(RM) $@ +$(RM) $@ $@.tmp echo $(STUBOBJS) > $@.list $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o' >> $@.list -$(AR) $(AR_OPTS) $@ $(ArSupportsInput) $@.list +$(AR) $(AR_OPTS) $@.tmp $(ArSupportsInput) $@.list $(RM) $@.list -$(RANLIB) $@ +$(RANLIB) $@.tmp +$(MV) $@.tmp $@ endef endif @@ -441,7 +375,7 @@ HC_SPLIT_PRE = \ $(RM) $@; if [ ! -d $(basename $@) ]; then mkdir $(basename $@); else \ $(FIND) $(basename $@) -name '*.$(way_)o' | xargs $(RM) __rm_food; fi ifeq "$(GhcWithInterpreter)" "YES" -HC_SPLIT_POST = ld -r -x -o $@ $(basename $@)/*.$(way_)o +HC_SPLIT_POST = $(LD) -r $(LD_X) -o $@ $(basename $@)/*.$(way_)o else HC_SPLIT_POST = touch $@ endif # GhcWithInterpreter == YES @@ -471,12 +405,12 @@ ifeq "$(StripLibraries)" "YES" ifeq "$(SplitObjs)" "YES" SRC_HC_POST_OPTS += \ for i in $(basename $@)/*; do \ - ld -r -x -o $$i.tmp $$i; \ + $(LD) -r $(LD_X) -o $$i.tmp $$i; \ $(MV) $$i.tmp $$i; \ done else SRC_HC_POST_OPTS += \ - ld -r -x -o $@.tmp $@; $(MV) $@.tmp $@ + $(LD) -r $(LD_X) -o $@.tmp $@; $(MV) $@.tmp $@ endif # SplitObjs endif # StripLibraries @@ -512,21 +446,18 @@ CLEAN_FILES += $(GHCI_LIBRARY) all :: $(GHCI_LIBRARY) -ifneq "$(GHCI_LIBRARY)" "HSstd.o" -# An annoying gotcha is that the Prelude is a bit special, -# for reasons described in ghc/lib/std/Makefile. -# So we only put in this standard rule for packages other than std -# The rule for the Prelude is in ghc/lib/std/Makefile -# We check for GHCI_LIBRARY being HSstd.o rather than -# PACKAGE being std, because we want to still use the boilerplate rule -# for cbits. +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 -x -o $@ $(LIBOBJS) $(STUBOBJS) -endif + $(LD) -r $(LD_X) -o $@ $(LIBOBJS) $(STUBOBJS) +endif # DONT_WANT_STD_GHCI_LIB_RULE endif # GhcWithInterpreter endif # way -endif # GHCI_LIBRARY +endif # GHCI_LIBRARY != "" #---------------------------------------- @@ -816,7 +747,7 @@ endif # LINK # 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 show-install +.PHONY: install install-docs installdirs install-strip install-dirs uninstall install-docs show-install show-install : @echo "bindir = $(bindir)" @@ -860,13 +791,7 @@ ifneq "$(INSTALL_PROGS)" "" # entry in the INSTALL_PROGS list. If there's no suffix, use # $(exeext). # -# This is bit of a pain to express since GNU make doesn't have -# something like $(if ...), but possible using $(subst ...) -# [Aside: I added support for $(if ...) to my local copy of GNU -# make at one stage, perhaps I should propagate the patch to -# the GNU make maintainers...] -# -INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(subst _,,$(subst __,$(exeext),_$(suffix $(p))_)), $(basename $(p)))) +INSTALL_PROGS := $(foreach p, $(INSTALL_PROGS), $(addsuffix $(if $(suffix $(p)),,$(exeext)), $(basename $(p)))) install:: $(INSTALL_PROGS) @$(INSTALL_DIR) $(bindir) @@ -914,6 +839,8 @@ install:: $(INSTALL_LIBS) $(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; \ @@ -950,6 +877,28 @@ install:: $(INSTALL_INCLUDES) done endif +ifneq "$(INSTALL_DOCS)" "" +install-docs:: $(INSTALL_DOCS) + @$(INSTALL_DIR) $(datadir) + for i in $(INSTALL_DOCS); do \ + $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \ + done +endif + +ifneq "$(INSTALL_SGML_DOC)" "" +ifneq "$(SGMLDocWays)" "" +install-docs:: $(foreach i,$(SGMLDocWays),$(INSTALL_SGML_DOC).$i) + @$(INSTALL_DIR) $(datadir) + for i in $(SGMLDocWays); do \ + if [ $$i = "html" ]; then \ + $(CP) -r $(INSTALL_SGML_DOC) $(datadir); \ + else \ + $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \ + fi \ + done +endif +endif + # # Use with care.. # @@ -987,11 +936,11 @@ install-strip:: @$(MAKE) EXTRA_INSTALL_OPTS='-s' install endif -########################################### +############################################################################## # # Targets: check tags show # -########################################### +############################################################################## #------------------------------------------------------------ # Check @@ -1029,15 +978,20 @@ endif # show: - @echo '$(VALUE)=$($(VALUE))' + @echo '$(VALUE)="$($(VALUE))"' -#-------------------------------------------------------------------------- -# SGML Documentation +################################################################################ +# +# SGML Documentation # +################################################################################ + .PHONY: dvi ps html pdf rtf ifneq "$(SGML_DOC)" "" +all :: $(SGMLDocWays) + # multi-file SGML document: main document name is specified in $(SGML_DOC), # sub-documents (.sgml files) listed in $(SGML_SRCS). @@ -1072,11 +1026,11 @@ extraclean :: $(RM) -rf $(SGML_DOC) endif -########################################### +############################################################################## # # Targets: clean # -########################################### +############################################################################## # 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 @@ -1101,11 +1055,11 @@ maintainer-clean:: extraclean @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. @@ -1160,6 +1114,16 @@ $(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)" "" @@ -1188,3 +1152,104 @@ all docs TAGS clean distclean mostlyclean maintainer-clean install :: 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 hslibs. 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. +# +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 + +# +# Selectively building subdirectories. +# +# +ifneq "$(SUBDIRS)" "" +$(SUBDIRS) :: + $(MAKE) -C $@ $(MFLAGS) +endif