X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=mk%2Ftarget.mk;h=e34948933d4187728772e1fbb4222a25ff5c28c6;hp=6e2f0d6940130752bcee0f2a7ad2e2dcf2a442eb;hb=9ac03f0b59ea5a6274309c6915666f4a79c0cb09;hpb=430453c5131592b6147a80202dc5f7fbe3f3d5fd diff --git a/mk/target.mk b/mk/target.mk index 6e2f0d6..e349489 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -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 @@ -263,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 @@ -296,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 @@ -349,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 - -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)" "" +DLLTOOL=dlltool -all :: DllVersionInfo.$(way_)o +$(LIBRARY).def: $(LIBOBJS) + $(DLLTOOL) -D $(LIBRARY) --output-def $@ --export-all $(LIBOBJS) -ifeq "$(DLL_NAME)" "" -DLL_NAME = $(patsubst %.a,%.dll,$(subst lib,,$(LIBRARY))) -endif +$(LIBRARY).o: + $(DLLTOOL) -D $(LIBRARY) --output-exp $(LIBRARY).o $(LIBOBJS) -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 +# 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. @@ -481,266 +448,16 @@ DllVersionInfo.$(way_)rc ExeVersionInfo.$(way_)rc: echo " VALUE \"Translation\", 0x0409, 1200" >> $@ echo " END" >> $@ echo "END" >> $@ - -# --------------------------------------------------------------------------- -# Symbolic links - -# links to programs: we sometimes install a program as -# - with a link from to the real program. - -ifneq "$(LINK)" "" - -ifeq "$(LINK_TARGET)" "" -ifneq "$(HS_PROG)" "" -LINK_TARGET = $(HS_PROG) -else -ifneq "$(C_PROG)" "" -LINK_TARGET = $(C_PROG) else -$(error Cannot deduce LINK_TARGET) -endif -endif -endif - -# -# 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 -# -########################################### - -# 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 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 %.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 - -# -# install-strip is from the GNU Makefile standard. -# -ifneq "$(way)" "" -install-strip:: - @$(MAKE) EXTRA_INSTALL_OPTS='-s' install -endif +include $(TOP)/mk/install.mk ############################################################################## # @@ -879,7 +596,7 @@ maintainer-clean:: extraclean ifneq "$(way)" "" ifeq "$(findstring $(way), $(WAYS))" "" -$(error Unknown way $(way)) +$(error Unknown way $(way) of $(WAYS)) endif endif @@ -907,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 @@ -925,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 # ------------------------------------------------------------------------- @@ -966,114 +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; \ - if [ $$x_on_err -eq 0 ]; \ - then echo "Won't exit on error due to MFLAGS: ${MFLAGS}"; \ - fi; \ - 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 echo "Finished making $@ in $$i": $$?; \ - else echo "Failed making $@ in $$i": $$?; 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