X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=mk%2Ftarget.mk;h=2c297b0972045bd6aedec3a80d4ac50fca407607;hb=ea79fe9020185332b7c79134f7bdb0f1bc5f1857;hp=59f00efc02b4a9b7a0e61452f1c2f6b60f5863f8;hpb=d3bd93cf2747fabb8bd7c6df434c9ce98d0fc253;p=ghc-hetmet.git diff --git a/mk/target.mk b/mk/target.mk index 59f00ef..2c297b0 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -34,6 +34,22 @@ # ################################################################## +# 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 # # depend: @@ -61,7 +77,11 @@ # Compiler produced files that are targets of the source's imports. MKDEPENDHS_OBJ_SUFFICES=o -depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) +ifneq "$(BootingFromHc)" "YES" +PKGCONF_DEP = $(STAMP_PKG_CONF) +endif + +depend :: $(MKDEPENDHS_SRCS) $(MKDEPENDC_SRCS) $(PKGCONF_DEP) @$(RM) .depend @touch .depend ifneq "$(DOC_SRCS)" "" @@ -158,7 +178,7 @@ endif # `TAGS' # Update a tags table for this program. # -# `dvi' `ps' `pdf' `html' `pdf' +# `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. @@ -214,16 +234,13 @@ ifneq "$(HS_PROG)" "" all :: $(HS_PROG) ifneq "$(BootingFromHc)" "YES" -$(HS_PROG) :: $(HS_OBJS) - $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) +$(HS_PROG) :: $(OBJS) + $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(OBJS) else # see bootstrap.mk -$(HS_PROG) :: $(HS_OBJS) - $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(HS_OBJS) $(HC_BOOT_LIBS) +$(HS_PROG) :: $(OBJS) + $(CC) -o $@ $(HC_BOOT_CC_OPTS) $(HC_BOOT_LD_OPTS) $(OBJS) $(HC_BOOT_LIBS) endif - -# for building a Haskell program, we add FptoolsHcOpts -SRC_HC_OPTS += $(FptoolsHcOpts) endif #---------------------------------------- @@ -236,74 +253,6 @@ $(C_PROG) :: $(C_OBJS) $(CC) -o $@ $(CC_OPTS) $(LD_OPTS) $(C_OBJS) $(LIBS) endif - -#---------------------------------------- -# Building HsLibs libraries. -# -# Inputs: -# $(PACKAGE) is the name of the library to build -# $(IS_CBITS_LIB) should be "YES" for a "cbits" library -# -# Outputs: -# $(LIBRARY) the name of the library.a -# $(GHIC_LIBRARY) the name of the library.o (for GHCi) -# $(LIBOBJS) objects to put in library -# $(STUBOBJS) more objects to put in library -# -# $(LIBOBJS) is set to $(HS_OBJS) or $(C_OBJS) depending -# on whether or not it's a "cbits" library. But you can -# override this by setting $(LIBOBJS) yourself - -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 -C_SRCS += $(wildcard ../*_hsc.c) -# Make .hsc.h include files from the directory above visible -# (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) -endif - -ifeq "$(LIBOBJS)" "" - ifeq "$(IS_CBITS_LIB)" "YES" - LIBOBJS = $(C_OBJS) - else - LIBOBJS = $(HS_OBJS) - endif -endif - -ifeq "$(IS_CBITS_LIB)" "YES" -override datadir:=$(libdir)/include -else -SRC_CC_OPTS += -Icbits -endif - -endif # PACKAGE - #---------------------------------------- # Libraries/archives # @@ -353,29 +302,29 @@ SRC_HC_OPTS += -split-objs ifeq "$(ArSupportsInput)" "" define BUILD_LIB $(RM) $@ $@.tmp -(echo $(STUBOBJS); $(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o') | xargs ar q $@.tmp -$(RANLIB) $@.tmp -$(MV) $@.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 -$(FIND) $(patsubst %.$(way_)o,%,$(LIBOBJS)) -name '*.$(way_)o' >> $@.list -$(AR) $(AR_OPTS) $@.tmp $(ArSupportsInput) $@.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) $@.tmp -$(MV) $@.tmp $@ +$(RANLIB) $@ endef endif # Extra stuff for compiling Haskell files with $(SplitObjs): HC_SPLIT_PRE = \ - $(RM) $@; if [ ! -d $(basename $@) ]; then mkdir $(basename $@); else \ - $(FIND) $(basename $@) -name '*.$(way_)o' | xargs $(RM) __rm_food; fi + $(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 = $(LD) -r $(LD_X) -o $@ $(basename $@)/*.$(way_)o +HC_SPLIT_POST = (cd $(dir $@) && $(LD) -r $(LD_X) -o $(notdir $@) $(basename $(notdir $@))_split/*.$(way_)o) else HC_SPLIT_POST = touch $@ endif # GhcWithInterpreter == YES @@ -390,8 +339,8 @@ SRC_HC_POST_OPTS += $(HC_SPLIT_POST); # extraclean :: - $(FIND) $(patsubst %.$(way_)o,%,$(HS_OBJS)) -name '*.$(way_)o' -print | xargs $(RM) __rm_food - -rmdir $(patsubst %.$(way_)o,%,$(HS_OBJS)) > /dev/null 2>&1 + $(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) @@ -404,7 +353,7 @@ endif # $(HS_SRCS) ifeq "$(StripLibraries)" "YES" ifeq "$(SplitObjs)" "YES" SRC_HC_POST_OPTS += \ - for i in $(basename $@)/*; do \ + for i in $(basename $@)_split/*; do \ $(LD) -r $(LD_X) -o $$i.tmp $$i; \ $(MV) $$i.tmp $$i; \ done @@ -414,52 +363,13 @@ SRC_HC_POST_OPTS += \ endif # SplitObjs endif # StripLibraries -$(LIBRARY) :: $(STUBOBJS) $(LIBOBJS) +# 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 = "" -#-------------------------------------------------------------- -# Build dynamically-linkable libraries for GHCi -# -# Build $(GHCI_LIBRARY) from $(LIBOBJS)+$(STUBOBJS) -# -# Why? GHCi can only link .o files (at the moment), not .a files -# so we have to build libFoo.o as well as libFoo.a -# -# Furthermore, GHCi currently never loads -# profiling libraries (or other non-std ways) -# -# Inputs: -# $(GHCI_LIBRARY) -# -# Outputs: -# Rule to build $(GHCI_LIBRARY) - - -ifneq "$(GHCI_LIBRARY)" "" -ifeq "$(way)" "" -ifeq "$(GhcWithInterpreter)" "YES" - - -INSTALL_LIBS += $(GHCI_LIBRARY) -CLEAN_FILES += $(GHCI_LIBRARY) - -all :: $(GHCI_LIBRARY) - -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 $(LD_X) -o $@ $(LIBOBJS) $(STUBOBJS) - -endif # DONT_WANT_STD_GHCI_LIB_RULE -endif # GhcWithInterpreter -endif # way -endif # GHCI_LIBRARY != "" - - #---------------------------------------- # Building Win32 DLLs # @@ -712,11 +622,11 @@ $(LINK) : $(LINK_TARGET) install :: @$(INSTALL_DIR) $(bindir) @if ( $(PERL) -e '$$fn="$(bindir)/$(LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \ - echo "Creating a symbol link from $(LINK_TARGET) to $(LINK) in $(bindir)"; \ + 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 symbol link from $(LINK_TARGET) to $(LINK) in $(bindir) failed: \`$(bindir)/$(LINK)' already exists"; \ + 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; @@ -739,6 +649,7 @@ endif # LINK # 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. @@ -770,16 +681,6 @@ install-dirs :: # within the various install targets instead. #install:: install-dirs -# Install libraries automatically -ifneq "$(LIBRARY)" "" -INSTALL_LIBS += $(LIBRARY) -ifeq "$(DLLized)" "YES" -INSTALL_PROGS += $(DLL_NAME) -INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY)) -endif -INSTALL_DATAS += $(HS_IFACES) -endif - ifneq "$(INSTALL_PROGS)" "" # @@ -869,6 +770,22 @@ install:: $(INSTALL_DATAS) 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) @@ -878,21 +795,26 @@ install:: $(INSTALL_INCLUDES) endif ifneq "$(INSTALL_DOCS)" "" +ifneq "$(SGMLDocWays)" "" install-docs:: $(INSTALL_DOCS) @$(INSTALL_DIR) $(datadir) for i in $(INSTALL_DOCS); do \ $(INSTALL_DATA) $(INSTALL_OPTS) $$i $(datadir); \ done endif +endif ifneq "$(INSTALL_SGML_DOC)" "" ifneq "$(SGMLDocWays)" "" install-docs:: $(foreach i,$(SGMLDocWays),$(INSTALL_SGML_DOC).$i) @$(INSTALL_DIR) $(datadir) - for i in $(SGMLDocWays); do \ + @for i in $(SGMLDocWays); do \ if [ $$i = "html" ]; then \ - $(CP) -r $(INSTALL_SGML_DOC) $(datadir); \ + $(INSTALL_DIR) $(datadir)/html; \ + echo $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \ + $(CP) -r $(INSTALL_SGML_DOC) $(datadir)/html; \ else \ + echo $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \ $(INSTALL_DATA) $(INSTALL_OPTS) $(INSTALL_SGML_DOC).$$i $(datadir); \ fi \ done @@ -964,7 +886,7 @@ tags TAGS:: $(TAGS_HS_SRCS) $(TAGS_C_SRCS) @$(RM) TAGS @touch TAGS ifneq "$(TAGS_HS_SRCS)" "" - $(HSTAGS) $(HSTAGS_OPTS) -- $(TAGS_HS_SRCS) + $(HSTAGS) $(HSTAGS_OPTS) $(TAGS_HS_SRCS) endif ifneq "$(TAGS_C_SRCS)" "" etags -a $(TAGS_C_SRCS) @@ -1159,7 +1081,7 @@ 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 +# 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 @@ -1198,6 +1120,7 @@ endif # 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 @@ -1244,6 +1167,7 @@ $(ALL_TARGET) docs runtests $(BOOT_TARGET) TAGS clean distclean mostlyclean main @echo "------------------------------------------------------------------------" endif +#endif # # Selectively building subdirectories.