FIX #1110: hackery also needed when running gcc for CPP
[ghc-hetmet.git] / compiler / main / SysTools.lhs
index 2d4333c..f5812f4 100644 (file)
@@ -7,6 +7,13 @@
 -----------------------------------------------------------------------------
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module SysTools (
        -- Initialisation
        initSysTools,
@@ -259,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
@@ -403,7 +407,9 @@ runUnlit dflags args = do
 runCpp :: DynFlags -> [Option] -> IO ()
 runCpp dflags args =   do 
   let (p,args0) = pgm_P dflags
-  runSomething dflags "C pre-processor" p (args0 ++ args)
+      args1 = args0 ++ args
+  mb_env <- getGccEnv args1
+  runSomethingFiltered dflags id  "C pre-processor" p args1 mb_env
 
 runPp :: DynFlags -> [Option] -> IO ()
 runPp dflags args =   do 
@@ -531,12 +537,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 =
@@ -849,7 +863,6 @@ data BuildMessage
 #endif
 
 showOpt (FileOption pre f) = pre ++ platformPath f
-showOpt (Option "") = ""
 showOpt (Option s)  = s
 
 traceCmd :: DynFlags -> String -> String -> IO () -> IO ()