From 5af10d51868a48e1ecb0b246f56bfff2e428aedd Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 15 Nov 2007 15:57:47 +0000 Subject: [PATCH] FIX #1828: installing to a patch with spaces in We have to pass the path to gcc when calling windres, which itself might have spaces in. Furthermore, we have to pass the path to gcc's tools to gcc. This means getting the quoting right, and after much experimentation and reading of the windres sources I found something that works: passing --use-temp-files to windres makes it use its own implementation of quoting instead of popen(), and this does what we want. Sigh. --- compiler/main/SysTools.lhs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/main/SysTools.lhs b/compiler/main/SysTools.lhs index f0b3422..26c2f1b 100644 --- a/compiler/main/SysTools.lhs +++ b/compiler/main/SysTools.lhs @@ -266,9 +266,6 @@ initSysTools mbMinusB dflags -- later on; although gcc_args are in NATIVE format, -- gcc can cope -- (see comments with declarations of global variables) - -- - -- The quotes round the -B argument are in case TopDir - -- has spaces in it perl_path | am_installed = installed_bin cGHC_PERL | otherwise = cGHC_PERL @@ -538,12 +535,20 @@ runWindres dflags args = do mb_env <- getGccEnv gcc_args runSomethingFiltered dflags id "Windres" windres -- we must tell windres where to find gcc: it might not be on PATH - (Option ("--preprocessor=" ++ gcc ++ " " ++ - unwords (map showOpt gcc_args) ++ - " -E -xc -DRC_INVOKED") - : args) + (Option ("--preprocessor=" ++ + unwords (map quote (gcc : map showOpt gcc_args ++ + ["-E", "-xc", "-DRC_INVOKED"]))) + -- -- use-temp-file is required for windres to interpret the + -- quoting in the preprocessor arg above correctly. Without + -- this, windres calls the preprocessor with popen, which gets + -- the quoting wrong (discovered by experimentation and + -- reading the windres sources). See #1828. + : Option "--use-temp-file" + : args) -- we must use the PATH workaround here too, since windres invokes gcc mb_env + where + quote x = '\"' : x ++ "\"" touch :: DynFlags -> String -> String -> IO () touch dflags purpose arg = @@ -856,7 +861,6 @@ data BuildMessage #endif showOpt (FileOption pre f) = pre ++ platformPath f -showOpt (Option "") = "" showOpt (Option s) = s traceCmd :: DynFlags -> String -> String -> IO () -> IO () -- 1.7.10.4