X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=utils%2Fghc-pkg%2FMakefile;h=adce82949b77cbd5a38bd68eeb1f5a6074a21198;hb=eae65ca88fc09342e295874fb253f83775c61051;hp=c8a075d5b76d5d896d6330eaf1f0df50c46d99dc;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/utils/ghc-pkg/Makefile b/utils/ghc-pkg/Makefile index c8a075d..adce829 100644 --- a/utils/ghc-pkg/Makefile +++ b/utils/ghc-pkg/Makefile @@ -1,39 +1,71 @@ TOP=../.. include $(TOP)/mk/boilerplate.mk -# hack for ghci-inplace script, see below -INSTALLING=1 - # ----------------------------------------------------------------------------- # ghc-pkg.bin +# Beyond stage 1, honour any Mac OS X depolyment target options. If we use +# these options in stage 1 we get a linker error if the bootstrap compiler is +# for a more recent OS version +ifeq "$(stage)" "2" +SRC_CC_OPTS += $(MACOSX_DEPLOYMENT_CC_OPTS) +SRC_HC_OPTS += $(addprefix -optc, $(MACOSX_DEPLOYMENT_CC_OPTS)) +SRC_LD_OPTS += $(addprefix -optl, $(MACOSX_DEPLOYMENT_LD_OPTS)) +endif + SRC_HC_OPTS += -cpp -Wall -fno-warn-name-shadowing -fno-warn-unused-matches # This causes libghccompat.a to be used: include $(GHC_COMPAT_DIR)/compat.mk +SRC_HC_OPTS += $(PACKAGE_CABAL) + # This is required because libghccompat.a must be built with # $(GhcHcOpts) because it is linked to the compiler, and hence # we must also build with $(GhcHcOpts) here: -SRC_HC_OPTS += $(GhcHcOpts) +SRC_HC_OPTS += $(GhcHcOpts) $(GhcStage1HcOpts) -ifeq "$(ghc_ge_504)" "NO" -SRC_HC_OPTS += -package lang -package util -package text +ifeq "$(Windows)" "NO" +SRC_HC_OPTS += -package unix endif +ifeq "$(ghc_ge_607)" "YES" +SRC_HC_OPTS += -package containers +endif + +SRC_HC_OPTS += -package Cabal + # On Windows, ghc-pkg is a standalone program # ($bindir/ghc-pkg.exe), whereas on Unix it needs a wrapper script # to pass the appropriate flag to the real binary # ($libexecdir/ghc-pkg.bin) so that it can find package.conf. +# on Windows, we need to take control of filename globbing ourselves ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32" HS_PROG = ghc-pkg.exe INSTALL_PROGS += $(HS_PROG) +EXCLUDE_SRCS += CRT_noglob.c +NOGLOB_O = CRT_noglob.o +else + +# We have two version: the inplace version compiled by the bootstrap compiler +# and the install version compiled by the stage 1 compiler. +# When creating or using bindists we always want the final binary, as built +# by the stage 1 compiler. +ifeq "$(DOING_BIN_DIST)" "YES" +HS_PROG = ghc-pkg.bin else +ifeq "$(stage)" "2" HS_PROG = ghc-pkg.bin +else +HS_PROG = ghc-pkg-inplace.bin +endif +endif INSTALL_LIBEXECS += $(HS_PROG) +NOGLOB_O = + endif -# -----------------------------------------------------------------------------= +# ----------------------------------------------------------------------------- # Create the Version.hs file VERSION_HS = Version.hs @@ -53,51 +85,42 @@ Version.hs : Makefile $(TOP)/mk/config.mk DIST_CLEAN_FILES += $(VERSION_HS) # ----------------------------------------------------------------------------- -# ghc-pkg script +# ghc-pkg and ghc-pkg-inplace scripts -ifeq "$(INSTALLING)" "1" -ifeq "$(BIN_DIST)" "1" -GHCPKGBIN=$$\"\"libexecdir/$(HS_PROG) -PKGCONF=$$\"\"libdir/package.conf -else -GHCPKGBIN=$(libexecdir)/$(HS_PROG) -PKGCONF=$(libdir)/package.conf -endif # BIN_DIST -else -GHCPKGBIN=$(FPTOOLS_TOP_ABS)/utils/ghc-pkg/$(HS_PROG) -PKGCONF=$(FPTOOLS_TOP_ABS_PLATFORM)/driver/package.conf.inplace -endif +# ghc-pkg-inplace used to be either a /bin/sh script, or a .bat script +# on Windows. It is now a real binary, compiled from a tiny .hs +# file. The problem with using scripts here was that the .bat script +# cannot be executed by /bin/sh on MSYS (it can on Cygwin), but the +# /bin/sh script cannot be executed by Cabal. So we would have needed +# both. A single binary is therefore simpler. -ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" -INSTALLED_SCRIPT_PROG = ghc-pkg-$(ProjectVersion) -endif -INPLACE_SCRIPT_PROG = ghc-pkg-inplace +INPLACE_HS=ghc-pkg-inplace.hs +INPLACE_PROG=ghc-pkg-inplace +EXCLUDED_SRCS+=$(INPLACE_HS) -SCRIPT_OBJS = ghc-pkg.sh -INTERP = $(SHELL) -SCRIPT_SUBST_VARS = GHCPKGBIN PKGCONFOPT -ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" -INSTALL_SCRIPTS += $(SCRIPT_PROG) -endif -PKGCONFOPT = --global-conf $(PKGCONF) +$(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk $(NOGLOB_O) + echo "import System.Cmd; import System.Environment; import System.Exit" > $@ + echo "main = do args <- getArgs; rawSystem \"$(FPTOOLS_TOP_ABS)/$(GHC_PKG_DIR_REL)/$(HS_PROG)\" (\"--global-conf\":\"$(FPTOOLS_TOP_ABS)/driver/package.conf.inplace\":args) >>= exitWith" >> $@ -ifeq "$(INSTALLING)" "1" -SCRIPT_PROG = $(INSTALLED_SCRIPT_PROG) -ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" -LINK = ghc-pkg -endif -else -SCRIPT_PROG = $(INPLACE_SCRIPT_PROG) -endif +$(INPLACE_PROG): $(INPLACE_HS) + $(HC) --make $< -o $@ $(LD_OPTS) $(NOGLOB_O) -# ----------------------------------------------------------------------------- -# don't recurse on 'make install' -# -ifeq "$(INSTALLING)" "1" -all :: $(HS_PROG) - $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@ -clean distclean maintainer-clean :: - $(MAKE) INSTALLING=0 BIN_DIST=0 $(MFLAGS) $@ +all :: $(INPLACE_PROG) + +CLEAN_FILES += $(INPLACE_HS) $(INPLACE_PROG) + +ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" +LINK = ghc-pkg +LINK_TARGET = $(LINK)-$(ProjectVersion) +INSTALLED_SCRIPT=$(DESTDIR)$(bindir)/$(LINK_TARGET) +install:: + $(INSTALL_DIR) $(DESTDIR)$(bindir) + $(RM) -f $(INSTALLED_SCRIPT) + echo "#!$(SHELL)" >> $(INSTALLED_SCRIPT) + echo "GHCPKGBIN=$(libexecdir)/$(HS_PROG)" >> $(INSTALLED_SCRIPT) + echo "PKGCONF=$(libdir)/package.conf" >> $(INSTALLED_SCRIPT) + echo 'exec $$GHCPKGBIN --global-conf $$PKGCONF $${1+"$$@"}' >> $(INSTALLED_SCRIPT) + $(EXECUTABLE_FILE) $(INSTALLED_SCRIPT) endif # ghc-pkg is needed to boot in rts/ and library dirs @@ -108,4 +131,9 @@ boot :: depend $(MAKE) all endif +binary-dist: + $(INSTALL_DIR) $(BIN_DIST_DIR)/utils/ghc-pkg + $(INSTALL_DATA) Makefile $(BIN_DIST_DIR)/utils/ghc-pkg/ + $(INSTALL_PROGRAM) $(HS_PROG) $(BIN_DIST_DIR)/utils/ghc-pkg/ + include $(TOP)/mk/target.mk