X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=mk%2Ftarget.mk;h=e23a6b6cf8f3c9786572dfaa630874b9c9932bb1;hb=31b58a939468fb6c245a4beb5dcbd75f03c4e76c;hp=93469dc6f95c416f85dbb8a3866633bf6177ae15;hpb=f7fd588d8549b81d0ebcd1857a520052a94de9d2;p=ghc-hetmet.git diff --git a/mk/target.mk b/mk/target.mk index 93469dc..e23a6b6 100644 --- a/mk/target.mk +++ b/mk/target.mk @@ -365,6 +365,74 @@ $(DLL_NAME) :: $(LIBRARY) touch dLL_ifs.hi endif +# +# Version information is baked into a DLL by having the DLL include DllVersionInfo.o. +# The version info contains two user tweakables: DLL_VERSION and DLL_VERSION_NAME. +# (both are given sensible defaults though.) +# +# Note: this will not work as expected with Cygwin B20.1; you need a more recent +# snapshot of binutils (to pick up windres bugfixes.) + +ifndef DLL_VERSION +DLL_VERSION=$(ProjectVersion) +endif + +ifndef DLL_VERSION_NAME +DLL_VERSION_NAME="http://www.haskell.org/ghc" +endif + +ifndef DLL_DESCRIPTION +DLL_DESCRIPTION="A GHC-compiled DLL" +endif + +ifndef EXE_VERSION +EXE_VERSION=$(ProjectVersion) +endif + +ifndef EXE_VERSION_NAME +EXE_VERSION_NAME="http://www.haskell.org/ghc" +endif + +ifndef EXE_DESCRIPTION +EXE_DESCRIPTION="A GHC-compiled binary" +endif + +# +# Little bit of lo-fi mangling to get at the right set of settings depending +# on whether we're generating the VERSIONINFO for a DLL or EXE +# +DLL_OR_EXE=$(subst VersionInfo.rc,,$@) +VERSION_FT=$(subst Dll, 0x2L, $(subst Exe, 0x1L, $(DLL_OR_EXE))) +VERSION_RES_NAME=$(subst Exe,$(EXE_VERSION_NAME), $(subst Dll, $(DLL_VERSION_NAME),$(DLL_OR_EXE))) +VERSION_RES=$(subst Exe,$(EXE_VERSION), $(subst Dll, $(DLL_VERSION),$(DLL_OR_EXE))) +VERSION_DESC=$(subst Exe,$(EXE_DESCRIPTION), $(subst Dll, $(DLL_DESCRIPTION),$(DLL_OR_EXE))) + +DllVersionInfo.rc ExeVersionInfo.rc: + $(RM) DllVersionInfo.rc + echo "1 VERSIONINFO" > $@ + echo "FILEVERSION 1,0,0,1" >> $@ + echo "PRODUCTVERSION 1,0,0,1" >> $@ + echo "FILEFLAGSMASK 0x3fL" >> $@ + echo "FILEOS 0x4L" >> $@ + echo "FILETYPE $(VERSION_FT)" >> $@ + echo "FILESUBTYPE 0x0L" >> $@ + echo "BEGIN" >> $@ + echo " BLOCK \"StringFileInfo\"" >> $@ + echo " BEGIN" >> $@ + echo " BLOCK \"040904B0\"" >> $@ + echo " BEGIN" >> $@ + echo " VALUE \"CompanyName\", \"$(VERSION_RES_NAME)\\0\"" >> $@ + echo " VALUE \"FileVersion\", \"$(VERSION_RES)\\0\"" >> $@ + echo " VALUE \"ProductVersion\", \"$(VERSION_RES)\\0\"" >> $@ + echo " VALUE \"FileDescription\", \"$(VERSION_DESC)\\0\"" >> $@ + echo " END" >> $@ + echo " END" >> $@ + echo " BLOCK \"VarFileInfo\"" >> $@ + echo " BEGIN" >> $@ + echo " VALUE \"Translation\", 0x0409, 1200" >> $@ + echo " END" >> $@ + echo "END" >> $@ + #---------------------------------------- # Script programs @@ -423,12 +491,8 @@ $(SCRIPT_PROG) :: $(SCRIPT_OBJS) $(RM) $@ @echo Creating $@... ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" echo "#! "$(PERL) > $@ else - @touch $@ -endif -else ifneq "$(INTERP)" "" @echo "#!"$(INTERP) > $@ else @@ -452,17 +516,17 @@ all :: $(SCRIPT_LINK) # # Don't want to overwrite $(SCRIPT_LINK)s that aren't symbolic -# links. Testing for symbol links is problematic to do in +# 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 symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK)"; \ + echo "Creating a symbolic link from $(SCRIPT_PROG) to $(SCRIPT_LINK)"; \ $(RM) $(SCRIPT_LINK); \ $(LN_S) $(SCRIPT_PROG) $(SCRIPT_LINK); \ else \ - echo "Creating a symbol link from $(SCRIPT_PROG) to $(SCRIPT_LINK) failed: \`$(SCRIPT_LINK)' already exists"; \ + echo "Creating a symbolic link from $(SCRIPT_PROG) to $(SCRIPT_LINK) failed: \`$(SCRIPT_LINK)' already exists"; \ echo "Perhaps remove \`$(SCRIPT_LINK)' manually?"; \ exit 1; \ fi; @@ -517,17 +581,29 @@ install-dirs :: #install:: install-dirs ifneq "$(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). +# +# 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:: $(INSTALL_PROGS) @$(INSTALL_DIR) $(bindir) @for i in $(INSTALL_PROGS); do \ - case $$i in \ - *.dll) \ - echo $(INSTALL_DATA) $(INSTALL_BIN_OPTS) $$i $(bindir); \ - $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ;; \ - *) \ - echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir); \ - $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i$(exeext) $(bindir) ;; \ - esac; \ + echo $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir); \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(bindir) ; \ done endif @@ -538,89 +614,26 @@ endif ifneq "$(INSTALL_SCRIPTS)" "" install:: $(INSTALL_SCRIPTS) @$(INSTALL_DIR) $(bindir) -ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" - @for i in $(INSTALL_SCRIPTS); do \ - $(RM) $$i.tmp; \ - echo "#! $(PERL)" > $$i.tmp ; \ - echo '$$'"bindir='$(bindir)';" >> $$i.tmp ; \ - echo '$$'"libdir='$(libdir)';" >> $$i.tmp ; \ - echo '$$'"libexecdir='$(libexecdir)';" >> $$i.tmp ; \ - echo '$$'"datadir='$(datadir)';" >> $$i.tmp ; \ - cat $$i >> $$i.tmp ; \ - echo $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i.tmp $(bindir)/$$i ; \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i.tmp $(bindir)/$$i ; \ - $(RM) $$i.tmp; \ - done -else - for i in $(INSTALL_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir)/$$i; \ - done -endif -else for i in $(INSTALL_SCRIPTS); do \ $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(bindir); \ done endif -endif ifneq "$(INSTALL_LIB_SCRIPTS)" "" install:: $(INSTALL_LIB_SCRIPTS) @$(INSTALL_DIR) $(libdir) -ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" - @for i in $(INSTALL_LIB_SCRIPTS); do \ - $(RM) $$i.tmp; \ - echo "#! $(PERL)" > $$i.tmp ; \ - echo '$$'"bindir='$(bindir)';" >> $$i.tmp ; \ - echo '$$'"libdir='$(libdir)';" >> $$i.tmp ; \ - echo '$$'"libexecdir='$(libexecdir)';" >> $$i.tmp ; \ - echo '$$'"datadir='$(datadir)';" >> $$i.tmp ; \ - cat $$i >> $$i.tmp ; \ - echo $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir)/$$i ; \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i.tmp $(libdir)/$$i ; \ - $(RM) $$i.tmp; \ - done -else - for i in $(INSTALL_LIB_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir)/$$i ; \ - done -endif -else for i in $(INSTALL_LIB_SCRIPTS); do \ $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libdir); \ done endif -endif ifneq "$(INSTALL_LIBEXEC_SCRIPTS)" "" install:: $(INSTALL_LIBEXEC_SCRIPTS) @$(INSTALL_DIR) $(libexecdir) -ifeq "$(INTERP)" "perl" -ifneq "$(BIN_DIST)" "1" - @for i in $(INSTALL_LIBEXEC_SCRIPTS); do \ - $(RM) $$i.tmp; \ - echo "#! $(PERL)" > $$i.tmp ; \ - echo '$$'"bindir='$(bindir)';" >> $$i.tmp ; \ - echo '$$'"libdir='$(libdir)';" >> $$i.tmp ; \ - echo '$$'"libexecdir='$(libexecdir)';" >> $$i.tmp ; \ - echo '$$'"datadir='$(datadir)';" >> $$i.tmp ; \ - cat $$i >> $$i.tmp ; \ - echo $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir) ; \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i.tmp $(libexecdir)/$$i ; \ - $(RM) $$i.tmp; \ - done -else - for i in $(INSTALL_LIBEXEC_SCRIPTS); do \ - $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \ - done -endif -else for i in $(INSTALL_LIBEXEC_SCRIPTS); do \ $(INSTALL_SCRIPT) $(INSTALL_OPTS) $$i $(libexecdir); \ done endif -endif ifneq "$(INSTALL_LIBS)" "" install:: $(INSTALL_LIBS) @@ -639,10 +652,16 @@ install:: $(INSTALL_LIBS) endif ifneq "$(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$(exeext) $(libexecdir); \ + $(INSTALL_PROGRAM) $(INSTALL_BIN_OPTS) $$i $(libexecdir); \ done endif @@ -787,59 +806,6 @@ dist-package-tar-gz :: dist-package-zip :: cd $(SRC_DIST_DIR); cd ..; $(ZIP) $(ZIP_OPTS) -r $(SRC_DIST_NAME).zip $(SRC_DIST_NAME) -# -# binary-dist creates a binary bundle, set BIN_DIST_NAME -# to package name and do `make binary-dist' (normally this -# just a thing you would do from the toplevel of fptools or) -# from the top of a project. -# -.PHONY: binary-dist-pre binary-dist binary-pack - -binary-dist-pre:: - -rm -rf $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) - -rm -f $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME).tar.gz - @for i in $(BIN_DIST_DIRS); do \ - if test -d "$$i"; then \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion); \ - echo $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion); \ - $(MKDIRHIER) $(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion); \ - echo $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \ - prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion) ; \ - $(MAKE) -C $$i $(MFLAGS) install BIN_DIST=1 BIN_DIST_NAME=$(BIN_DIST_NAME) \ - prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - exec_prefix=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME) \ - bindir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/bin/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - libdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - libexecdir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/lib/$(TARGETPLATFORM)/$(ProjectNameShort)-$(ProjectVersion) \ - datadir=$(BIN_DIST_TMPDIR)/$(BIN_DIST_NAME)/share/$(ProjectNameShort)-$(ProjectVersion) ; \ - fi; \ - done - -# -# Do this separately for now -# -binary-pack:: - ( cd $(BIN_DIST_TMPDIR); $(TAR) chzf $(BIN_DIST_NAME).tar.gz $(BIN_DIST_NAME); rm -rf $(BIN_DIST_NAME) ) - -ifneq "$(way)" "" -package-way-dist:: - ( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print | xargs tar cvf $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar ) - gzip $(BIN_DIST_TMPDIR)/ghc-$(ProjectVersion)-$(way)-$(TARGETPLATFORM).tar -endif - -ifneq "$(way)" "" -remove-way-dist:: - ( cd $(BIN_DIST_TMPDIR); find $(BIN_DIST_NAME)/ \( -name "*$(_way).a" -o -name "*.$(way_)hi" \) -print -exec rm -f {} \; ) -endif - ########################################### # # Targets: check tags show info @@ -887,7 +853,7 @@ show: #-------------------------------------------------------------------------- # SGML Documentation # -.PHONY: dvi ps html info txt +.PHONY: dvi ps html pdf rtf ifneq "$(SGML_DOC)" "" @@ -906,21 +872,30 @@ SGML_SRCS = $(wildcard *.sgml) endif endif +SGML_TEX = $(SGML_DOC).tex SGML_DVI = $(SGML_DOC).dvi SGML_PS = $(SGML_DOC).ps -SGML_INFO = $(SGML_DOC).info +SGML_PDF = $(SGML_DOC).pdf +SGML_RTF = $(SGML_DOC).rtf SGML_HTML = $(SGML_DOC).html +# HTML output goes in a subdirectory on its own. SGML_TEXT = $(SGML_DOC).txt $(SGML_DVI) $(SGML_PS) $(SGML_INFO) $(SGML_HTML) $(SGML_TEXT) :: $(SGML_SRCS) dvi :: $(SGML_DVI) -info :: $(SGML_INFO) -html :: $(SGML_HTML) -txt :: $(SGML_TXT) ps :: $(SGML_PS) +pdf :: $(SGML_PDF) +rtf :: $(SGML_RTF) +html :: $(SGML_HTML) +txt :: $(SGML_TEXT) -CLEAN_FILES += $(SGML_TEXT) $(SGML_DOC)*.html $(SGML_PS) $(SGML_DVI) +CLEAN_FILES += $(SGML_TEXT) $(SGML_TEX) $(SGML_PS) $(SGML_DVI) $(SGML_PDF) $(SGML_RTF) $(SGML_HTML) $(SGML_DOC)-*.html +# can't use $(SGML_SRCS) here, it was maybe used elsewhere +MOSTLY_CLEAN_FILES += $(patsubst %.vsgml, %.sgml, $(VSGML_SRCS)) + +clean :: + $(RM) -rf $(SGML_DOC) endif @@ -1075,10 +1050,9 @@ endif # if way # its tracks should any of the sub-makes fail. By my reckoning, # "cmd || exit $?" should be equivalent to "cmd" -ifeq "$(way)" "" ifneq "$(SUBDIRS)" "" -all docs runtests boot TAGS clean veryclean maintainer-clean install info :: +all docs runtests boot TAGS clean veryclean maintainer-clean install info html ps dvi txt:: @echo "------------------------------------------------------------------------" @echo "===fptools== Recursively making \`$@' in $(SUBDIRS) ..." @echo "PWD = $(shell pwd)" @@ -1107,7 +1081,6 @@ dist :: if [ $$? -eq 0 ] ; then true; else exit $$x_on_err; fi; \ done endif -endif # The default dist rule: #