From db7a768882134defdd282bd626b29bead6e62b00 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Wed, 15 Aug 2007 17:27:07 +0000 Subject: [PATCH] Use a C program for ghc-inplace --- compiler/Makefile | 22 ++++++---------------- compiler/ghc-inplace.c | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 compiler/ghc-inplace.c diff --git a/compiler/Makefile b/compiler/Makefile index 5ca2c2d..e85706b 100644 --- a/compiler/Makefile +++ b/compiler/Makefile @@ -709,32 +709,22 @@ SRC_LD_OPTS += -no-link-chk # See comments in $(FPTOOLS_TOP)/utils/ghc-pkg/Makefile for why we use # a real binary here rather than a shell script. -INPLACE_HS = $(odir)/ghc-inplace.hs +INPLACE_C = ghc-inplace.c INPLACE_PROG = $(odir)/ghc-inplace$(exeext) -EXCLUDED_SRCS += $(INPLACE_HS) +EXCLUDED_SRCS += $(INPLACE_C) # FPTOOLS_TOP_ABS platform uses backslashes, at least on Cygwin, but that # will go wrong when we use it in a Haskell string below. TOP_ABS=$(subst \\,/,$(FPTOOLS_TOP_ABS_PLATFORM)) -ifeq "$(stage)" "1" -EnvImport = System.Environment -GetArgs = getArgs -else -EnvImport = GHC.Environment -GetArgs = getFullArgs -endif - -$(INPLACE_HS): Makefile $(FPTOOLS_TOP)/mk/config.mk - echo "import System.Cmd; import $(EnvImport); import System.Exit" > $@ - echo "main = do args <- $(GetArgs); rawSystem \"$(TOP_ABS)/$(GHC_COMPILER_DIR_REL)/$(GHC_PROG)\" (\"-B$(TOP_ABS)\":\"-fhardwire-lib-paths\":args) >>= exitWith" >> $@ +GHC_PATH=$(TOP_ABS)/$(GHC_COMPILER_DIR_REL)/$(GHC_PROG) -$(INPLACE_PROG): $(INPLACE_HS) - $(HC) --make $< -o $@ +$(INPLACE_PROG): $(INPLACE_C) + $(HC) -cpp -optc-DGHC_PATH=\"$(GHC_PATH)\" -optc-DTOP_ABS=\"$(TOP_ABS)\" $< -o $@ all :: $(INPLACE_PROG) -CLEAN_FILES += $(INPLACE_HS) $(INPLACE_PROG) +CLEAN_FILES += $(INPLACE_PROG) ifeq "$(stage)" "1" ghc-inplace : $(INPLACE_PROG) diff --git a/compiler/ghc-inplace.c b/compiler/ghc-inplace.c new file mode 100644 index 0000000..abedefe --- /dev/null +++ b/compiler/ghc-inplace.c @@ -0,0 +1,21 @@ + +#include +#include +#include +#include + +int main(int argc, char **argv) { + char **args; + args = malloc(sizeof(char *) * (argc + 3)); + if (args == NULL) { + fprintf(stderr, "Malloc failed\n"); + exit(1); + } + args[0] = GHC_PATH; + args[1] = "-B" TOP_ABS; + args[2] = "-fhardwire-lib-paths"; + memcpy(args + 3, argv + 1, sizeof(char *) * (argc - 1)); + args[argc+2] = NULL; + execv(GHC_PATH, args); + return 0; +} -- 1.7.10.4