From c15489181a60a228ce52b945d2523cfdacd5a90b Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 21 Jun 2007 10:13:24 +0000 Subject: [PATCH] Use a real binary instead of scripts for ghc-inplace Fixes various problems with getting the scripts right on Windows. Binaries are universally executable by /bin/sh, cmd.exe and rawSystem, so this allows us to remove some platform-specific hacks. --- compiler/Makefile | 73 +++++++++--------------------------------------- mk/config.mk.in | 8 +----- utils/ghc-pkg/Makefile | 40 +++++++++++++------------- 3 files changed, 35 insertions(+), 86 deletions(-) diff --git a/compiler/Makefile b/compiler/Makefile index 98c4c89..9edd7a0 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -699,79 +699,32 @@ SRC_LD_OPTS += -no-link-chk # ----------------------------------------------------------------------------- # create ghc-inplace, a convenient way to run ghc from the build tree... +# See comments in $(FPTOOLS_TOP)/utils/ghc-pkg/Makefile for why we use +# a real binary here rather than a shell script. all :: $(odir)/ghc-inplace ghc-inplace -# MSys notes -# Note 1 -# I'm exec'ing $(SCRIPT_SHELL), rather than the usual #!/bin/sh, to make -# sure that the right shell is invoked. If we use /bin/sh, then -# when ghc-inplace is invoked from a Cygwin Python (which is the only Python -# that seems to run the test-suite correctly), we get the Cygwin shell, -# and it in turn interprets the path-names in the second (exec) line -# differently to the MSys shell. That's bad, because ghc-inplace must -# also work when invoked from MSys shells -# -# To figure out what the MSys shell is, we cd to '/bin' and do 'pwd -W' -# On MSys, the -W flag prints out the directory in c:/msys/bin format -# (On other system, -W isn't a pwd flag at all.) +INPLACE_HS = $(odir)/ghc-inplace.hs +INPLACE_PROG = $(odir)/ghc-inplace$(exeext) -ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32" -all :: $(odir)/ghc-inplace.bat ghc-inplace.bat -CLEAN_FILES += $(odir)/ghc-inplace.bat ghc-inplace.bat -endif +$(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk + echo "import System.Cmd; import System.Environment" > $@ + echo "main = getArgs >>= \args -> rawSystem \"$(FPTOOLS_TOP_ABS_PLATFORM)/$(GHC_COMPILER_DIR_REL)/$(GHC_PROG)\" (\"-B$(FPTOOLS_TOP_ABS_PLATFORM)\":args)" >> $@ -ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32" -# MSys (...and cygwin with a mingw toolchain) -SCRIPT_SHELL = $(shell cd /bin; pwd -W 2>/dev/null || echo "/bin")/sh -else -# Cygwin and Unix -SCRIPT_SHELL = /bin/sh -endif +$(INPLACE_PROG): $(INPLACE_HS) + $(GHC) --make $< -o $@ -# MSys Note 2 -# On MSys, we must use the following script for ghc-inplace: -# exec /c/darcs/fc-branch-2/compiler/stage1/ghc -Bc:/darcs/fc-branch-2 "$@" -# That is, -# (a) You *must* use the /c/ form for the first arg to exec. Using the -# c:/ form makes exec complain that it can't find $pwd/c:/darcs/.../ghc -# The /c/ form is $(FPTOOLS_TOP_ABS) -# (b) You *must* use the c:/ form for the -B argument, else the testsuite -# doesn't work. I think that's something to do with ghc-inplace being -# invoked by Python -# The c:/ form is $(FPTOOLS_TOP_ABS_PLATFORM) - -$(odir)/ghc-inplace : $(GHC_PROG) - @$(RM) $@ - echo '#!$(SCRIPT_SHELL)' >>$@ -# Re SCRIPT_SHELL, see note 1 above - echo exec $(GHC_COMPILER_DIR_ABS)/$(GHC_PROG) \ - '-B$(subst \,\\,$(FPTOOLS_TOP_ABS_PLATFORM))' '"$$@"' >>$@ -# Re exec, see note 2 above - chmod 755 $@ - -# MSys Note 3 -# When we generate a .bat file, we must also use the form -# @call c:\darcs\fc-branch-2\compiler\stage1\ghc-inplace -# else the cmd shell gets confused; indeed it seems to simply hang -# Hence the use of $(FPTOOLS_TOP_ABS_PLATFORM) here, just like MSys Note 2 +all :: $(INPLACE_PROG) -ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32" -ghc-inplace.bat $(odir)/ghc-inplace.bat: $(GHC_PROG) - @$(RM) $@ - echo '@call $(subst /,\,$(FPTOOLS_TOP_ABS_PLATFORM)/$(GHC_COMPILER_DIR_REL)/$(GHC_PROG)) -B$(FPTOOLS_TOP_ABS_PLATFORM) %*' >> $@ - chmod 755 $@ -endif +CLEAN_FILES += $(INPLACE_HS) $(INPLACE_PROG) -ghc-inplace : stage1/ghc-inplace +ifeq "$(stage)" "1" +ghc-inplace : $(INPLACE_PROG) $(RM) -f $@ && $(LN_S) $< $@ -ifeq "$(stage)" "1" CLEAN_FILES += ghc-inplace endif -CLEAN_FILES += $(odir)/ghc-inplace - #----------------------------------------------------------------------------- # install diff --git a/mk/config.mk.in b/mk/config.mk.in index 32239d9..abd7f83 100644 --- a/mk/config.mk.in +++ b/mk/config.mk.in @@ -171,12 +171,6 @@ else Windows=NO endif -ifeq "$(Windows)" "YES" -dot_bat=.bat -else -dot_bat= -endif - # BootingFromHc - build GHC and the libraries from .hc files? BootingFromHc = @BootingFromHc@ @@ -743,7 +737,7 @@ GHC_TOUCHY_PGM = touchy$(exeext) GHC_MANGLER_PGM = ghc-asm GHC_SPLIT_PGM = ghc-split GHC_SYSMAN_PGM = SysMan -GHC_PKG_INPLACE_PGM = ghc-pkg-inplace$(dot_bat) +GHC_PKG_INPLACE_PGM = ghc-pkg-inplace GHC_GENPRIMOP_PGM = genprimopcode GHC_GENAPPLY_PGM = genapply GHC_MKDEPENDC_PGM = mkdependC diff --git a/utils/ghc-pkg/Makefile b/utils/ghc-pkg/Makefile index f3ebafc..bb140f5 100644 --- a/utils/ghc-pkg/Makefile +++ b/utils/ghc-pkg/Makefile @@ -48,26 +48,28 @@ Version.hs : Makefile $(TOP)/mk/config.mk DIST_CLEAN_FILES += $(VERSION_HS) # ----------------------------------------------------------------------------- -# ghc-pkg script +# ghc-pkg and ghc-pkg-inplace scripts -ifeq "$(HOSTPLATFORM)" "i386-unknown-mingw32" -# See "MSys Note 3" in compiler/Makefile -INPLACE_SCRIPT=ghc-pkg-inplace.bat -all:: - $(RM) -f $(INPLACE_SCRIPT) - echo '@call $(subst /,\,$(FPTOOLS_TOP_ABS_PLATFORM)/utils/ghc-pkg/$(HS_PROG)) --global-conf $(FPTOOLS_TOP_ABS_PLATFORM)/driver/package.conf.inplace %*' >> $(INPLACE_SCRIPT) - $(EXECUTABLE_FILE) $(INPLACE_SCRIPT) -else -INPLACE_SCRIPT=ghc-pkg-inplace -all:: - $(RM) -f $(INPLACE_SCRIPT) - echo "#!$(SHELL)" >> $(INPLACE_SCRIPT) - echo "GHCPKGBIN=$(FPTOOLS_TOP_ABS)/utils/ghc-pkg/$(HS_PROG)" >> $(INPLACE_SCRIPT) - echo "PKGCONF=$(FPTOOLS_TOP_ABS_PLATFORM)/driver/package.conf.inplace" >> $(INPLACE_SCRIPT) - echo 'exec $$GHCPKGBIN --global-conf $$PKGCONF $${1+"$$@"}' >> $(INPLACE_SCRIPT) - $(EXECUTABLE_FILE) $(INPLACE_SCRIPT) -endif -CLEAN_FILES += $(INPLACE_SCRIPT) +# 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. + +INPLACE_HS=ghc-pkg-inplace.hs +INPLACE_PROG=ghc-pkg-inplace + +$(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk + echo "import System.Cmd; import System.Environment" > $@ + echo "main = getArgs >>= \args -> rawSystem \"$(FPTOOLS_TOP_ABS_PLATFORM)/$(GHC_PKG_DIR_REL)/$(HS_PROG)\" (\"--global-conf\":\"$(FPTOOLS_TOP_ABS_PLATFORM)/driver/package.conf.inplace\":args)" >> $@ + +$(INPLACE_PROG): $(INPLACE_HS) + $(GHC) --make $< -o $@ + +all :: $(INPLACE_PROG) + +CLEAN_FILES += $(INPLACE_HS) $(INPLACE_PROG) ifneq "$(HOSTPLATFORM)" "i386-unknown-mingw32" LINK = ghc-pkg -- 1.7.10.4