X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=mk%2Ftarget.mk;h=57b5628c86228cd66ea714c699a2d06cbd4b9897;hb=90fdf6fe22eebb4140f0b26bf138be6fdad43198;hp=8a552cea27df9f70985a93a02225743445f22317;hpb=89e8dbabaffd5fa5cae535fd8e360bd8df78967a;p=ghc-hetmet.git diff --git a/mk/target.mk b/mk/target.mk index 8a552ce..57b5628 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -293,8 +293,25 @@ boot :: depend ifneq "$(HS_PROG)" "" all :: $(HS_PROG) +ifneq "$(BootingFromHc)" "YES" $(HS_PROG) :: $(HS_OBJS) - $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) $(LIBS) + $(HC) -o $@ $(HC_OPTS) $(LD_OPTS) $(HS_OBJS) +else +# see bootstrp.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) endif #---------------------------------------- @@ -309,29 +326,66 @@ endif #---------------------------------------- -# Libraries/archives +# 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 GHCi0 +# $(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)" "" ifeq "$(IS_CBITS_LIB)" "YES" _cbits := _cbits endif -ifneq "$(HSLIB)" "" -LIBRARY = libHS$(HSLIB)$(_cbits)$(_way).a -GHCI_LIBRARY = HS$(HSLIB)$(_cbits)$(_way).o +LIBRARY = libHS$(PACKAGE)$(_cbits)$(_way).a +GHCI_LIBRARY = HS$(PACKAGE)$(_cbits)$(_way).o + +ifneq "$(IS_CBITS_LIB)" "YES" +WAYS=$(GhcLibWays) +endif + ifeq "$(LIBOBJS)" "" - ifneq "$(IS_CBITS_LIB)" "YES" - LIBOBJS = $(HS_OBJS) - else + ifeq "$(IS_CBITS_LIB)" "YES" LIBOBJS = $(C_OBJS) + else + LIBOBJS = $(HS_OBJS) endif endif -ifneq "$(IS_CBITS_LIB)" "" -CC = $(HC) -override datadir:=$(libdir)/includes -INSTALL_DATAS += Hs$(shell perl -e 'print ucfirst "$(HSLIB)"').h + +STUBOBJS += $(HSC_C_OBJS) SRC_CC_OPTS += -I$(GHC_INCLUDE_DIR) -I$(GHC_RUNTIME_DIR) + +ifeq "$(IS_CBITS_LIB)" "YES" +override datadir:=$(libdir)/includes +INSTALL_DATAS += Hs$(shell perl -e 'print ucfirst "$(PACKAGE)"').h +else +SRC_CC_OPTS += -Icbits endif -endif + +endif # PACKAGE + +#---------------------------------------- +# Libraries/archives +# +# Build $(LIBRARY) from $(LIBOJBS)+$(STUBOBJS) +# +# Inputs: +# $(LIBOBJS) +# $(STUBOBJS) +# +# Outputs: +# Rule to build $(LIBRARY) ifneq "$(LIBRARY)" "" all :: $(LIBRARY) @@ -372,7 +426,7 @@ ifeq "$(GhcWithInterpreter)" "YES" HC_SPLIT_POST = ld -r -x -o $@ $(basename $@)/*.$(way_)o else HC_SPLIT_POST = touch $@ -endif +endif # GhcWithInterpreter == YES SRC_HC_PRE_OPTS += $(HC_SPLIT_PRE); SRC_HC_POST_OPTS += $(HC_SPLIT_POST); @@ -405,32 +459,57 @@ SRC_HC_POST_OPTS += \ else SRC_HC_POST_OPTS += \ ld -r -x -o $@.tmp $@; $(MV) $@.tmp $@ -endif -endif +endif # SplitObjs +endif # StripLibraries $(LIBRARY) :: $(STUBOBJS) $(LIBOBJS) $(BUILD_LIB) -endif +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) -ifeq "$(GHCI_LIBOBJS)" "" -GHCI_LIBOBJS = $(LIBOBJS) +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. +$(GHCI_LIBRARY) :: $(LIBOBJS) + ld -r -x -o $@ $(LIBOBJS) $(STUBOBJS) endif -$(GHCI_LIBRARY) :: $(GHCI_LIBOBJS) - ld -r -x -o $@ $(GHCI_LIBOBJS) $(STUBOBJS) +endif # GhcWithInterpreter +endif # way +endif # GHCI_LIBRARY -CLEAN_FILES += $(GHCI_LIBRARY) -endif -endif #---------------------------------------- # Building Win32 DLLs @@ -438,13 +517,13 @@ endif ifeq "$(DLLized)" "YES" -ifneq "$(HSLIB)" "" +ifneq "$(PACKAGE)" "" -SRC_BLD_DLL_OPTS += --export-all --output-def=HS$(HSLIB)$(_cbits)$(_way).def DllVersionInfo.$(way_)o -ifneq "$(HSLIB)" "rts" +SRC_BLD_DLL_OPTS += --export-all --output-def=HS$(PACKAGE)$(_cbits)$(_way).def DllVersionInfo.$(way_)o +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 "$(HSLIB)" "std" +ifneq "$(PACKAGE)" "std" ifeq "$(IS_CBITS_LIB)" "" SRC_BLD_DLL_OPTS += -lHSstd_$(way_)imp -L$(GHC_LIB_DIR)/std endif @@ -452,15 +531,15 @@ 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, $(HSLIB_DEPS)) -SRC_BLD_DLL_OPTS += $(patsubst %,-L../%, $(HSLIB_DEPS)) +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$(HSLIB)_cbits_imp -Lcbits +SRC_BLD_DLL_OPTS += -lHS$(PACKAGE)_cbits_imp -Lcbits endif SRC_BLD_DLL_OPTS += -lwsock32 -lwinmm -endif # HSLIB != "" +endif # PACKAGE != "" SplitObjs = NO @@ -604,12 +683,6 @@ endif all :: $(SCRIPT_PROG) -# -# #! support under cygwin32 is not quite there yet, -# so we rely on the eval `trick' instead. On all other -# platforms, we prepend #!$(INTERP) -- SOF 6/97 -# - $(SCRIPT_PROG) : $(SCRIPT_OBJS) $(RM) $@ @echo Creating $@... @@ -633,31 +706,69 @@ endif @echo Done. endif -# links to script programs: we sometimes install a script as -# - with a link from to the real script. +# --------------------------------------------------------------------------- +# Symbolic links + +# links to programs: we sometimes install a program as +# - with a link from to the real program. + +ifneq "$(LINK)" "" -ifneq "$(SCRIPT_LINK)" "" -all :: $(SCRIPT_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 $(SCRIPT_LINK)s that aren't symbolic +# 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. # -$(SCRIPT_LINK) : $(SCRIPT_PROG) - @if ( $(PERL) -e '$$fn="$(SCRIPT_LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \ - echo "Creating a symbolic link from $(SCRIPT_PROG) to $(SCRIPT_LINK)"; \ - $(RM) $(SCRIPT_LINK); \ - $(LN_S) $(SCRIPT_PROG) $(SCRIPT_LINK); \ +$(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 $(SCRIPT_PROG) to $(SCRIPT_LINK) failed: \`$(SCRIPT_LINK)' already exists"; \ - echo "Perhaps remove \`$(SCRIPT_LINK)' manually?"; \ + echo "Creating a symbolic link from $(LINK_TARGET) to $(LINK) failed: \`$(LINK)' already exists"; \ + echo "Perhaps remove \`$(LINK)' manually?"; \ exit 1; \ fi; -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 symbol 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 "Perhaps remove \`$(bindir)/$(LINK)' manually?"; \ + exit 1; \ + fi; + +endif # LINK + ########################################### # @@ -710,11 +821,8 @@ ifneq "$(LIBRARY)" "" INSTALL_LIBS += $(LIBRARY) ifeq "$(DLLized)" "YES" INSTALL_PROGS += $(DLL_NAME) -else -ifeq "$(DLLized)" "YES" INSTALL_LIBS += $(patsubst %.a,%_imp.a, $(LIBRARY)) endif -endif INSTALL_DATAS += $(HS_IFACES) endif @@ -856,23 +964,6 @@ install-strip:: @$(MAKE) EXTRA_INSTALL_OPTS='-s' install endif -# -# install links to script drivers. -# -ifneq "$(SCRIPT_LINK)" "" -install :: - @if ( $(PERL) -e '$$fn="$(bindir)/$(SCRIPT_LINK)"; exit ((! -f $$fn || -l $$fn) ? 0 : 1);' ); then \ - echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) in $(bindir)"; \ - $(RM) $(bindir)/$(SCRIPT_LINK); \ - $(LN_S) $(SCRIPT_PROG) $(bindir)/$(SCRIPT_LINK); \ - else \ - echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) in $(bindir) failed: \`$(bindir)/$(SCRIPT_LINK)' already exists"; \ - echo "Perhaps remove \`$(bindir)/$(SCRIPT_LINK)' manually?"; \ - exit 1; \ - fi; - -endif - ########################################### # # Targets: check tags show @@ -940,7 +1031,7 @@ SGML_HTML = $(addsuffix .html,$(SGML_DOC)) # HTML output goes in a subdirectory on its own. SGML_TEXT = $(addsuffix .txt,$(SGML_DOC)) -$(SGML_DVI) $(SGML_PS) $(SGML_HTML) $(SGML_TEXT) :: $(SGML_SRCS) +$(SGML_DVI) $(SGML_PS) $(SGML_HTML) $(SGML_TEXT) $(SGML_PDF) :: $(SGML_SRCS) dvi :: $(SGML_DVI) ps :: $(SGML_PS)