X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=mk%2Ftarget.mk;h=92188257c1eebd50564805237ace2810658a7ed5;hp=bf82fd430a8eeea24a07f54f199f3531c2fe7afa;hb=741b2b95de4b016a34cf58fb822368fa90244dfc;hpb=1994438bb2a4e052a267744dcec9efb6f8bd3e97 diff --git a/mk/target.mk b/mk/target.mk index bf82fd4..9218825 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -15,7 +15,7 @@ # # 2. GNU standard targets # all* -# install* uninstall installcheck installdirs +# install* installcheck installdirs # install-docs* # clean* distclean* mostlyclean* maintainer-clean* # tags* @@ -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 @@ -134,11 +136,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 @@ -220,7 +217,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 +265,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 +298,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 @@ -355,70 +351,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 +DLLTOOL=dlltool -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_RTS_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_RTS_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 +$(LIBRARY).def: $(LIBOBJS) + $(DLLTOOL) --output-def $@ --export-all $(LIBOBJS) -$(DLL_NAME) :: $(LIBRARY) - $(BLD_DLL) --output-lib $(DLL_IMPLIB_NAME) -o $(DLL_NAME) $(LIBRARY) $(BLD_DLL_OPTS) -endif # LIBRARY != "" +$(LIBRARY).o: + $(DLLTOOL) --output-exp $(LIBRARY).o $(LIBOBJS) -endif # DLLized +# Generates library.dll.a; by MinGW conventions, this is the dll's import library +$(LIBRARY).a: $(LIBOBJS) $(LIBRARY).def + $(DLLTOOL) --def $(LIBRARY).def --output-lib $@ # # Version information is baked into a DLL by having the DLL include DllVersionInfo.o. @@ -487,392 +448,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 - -# 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 %.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 \ - $(INSTALL_DIR) $(datadir)/doc; \ - echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \ - $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_XML_DOC)`echo .$$i | sed s/\.html-no-chunks/.html/` $(datadir)/doc; \ - fi; \ - if [ $$i = "html-no-chunks" ]; then \ - echo $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \ - $(CP) $(FPTOOLS_CSS_ABS) $(datadir)/doc; \ - 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 +# Regular static library +$(LIBRARY): $(LIBOBJS) + $(BUILD_STATIC_LIB) +endif # %.dll +endif # %.dylib +endif # %.so +endif # LIBRARY = "" -# -# install-strip is from the GNU Makefile standard. -# -ifneq "$(way)" "" -install-strip:: - @$(MAKE) EXTRA_INSTALL_OPTS='-s' install -endif +include $(TOP)/mk/install.mk ############################################################################## # @@ -1039,7 +624,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 @@ -1057,6 +643,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 # ------------------------------------------------------------------------- @@ -1098,108 +687,7 @@ 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 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 chm HxS ps dvi txt:: - @echo "------------------------------------------------------------------------" - @echo "== 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 "== $(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 "== 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