Take 2
authorMoritz Angermann <moritz.angermann@gmail.com>
Thu, 7 Jan 2016 03:06:37 +0000 (11:06 +0800)
committerMoritz Angermann <moritz.angermann@gmail.com>
Thu, 7 Jan 2016 03:06:37 +0000 (11:06 +0800)
shaking-up-ghc.cabal
src/Oracles/WindowsRoot.hs

index 00fb408..f9990e9 100644 (file)
@@ -114,6 +114,7 @@ executable ghc-shake
                        , extra >= 1.4
                        , mtl >= 2.2
                        , shake >= 0.15
+                       , split >= 0.2
                        , transformers >= 0.4
                        , unordered-containers >= 0.2
     default-language:    Haskell2010
index 195f591..473a235 100644 (file)
@@ -4,6 +4,7 @@ module Oracles.WindowsRoot (
     ) where
 
 import Data.Char (isSpace)
+import Data.List.Split (splitOn)
 import Base
 import Oracles.Config.Setting
 
@@ -40,12 +41,13 @@ fixAbsolutePathOnWindows path = do
 
 -- | Lookup a @command@ in @PATH@ environment.
 lookupInPath :: FilePath -> Action FilePath
-lookupInPath command
-    | command /= takeFileName command = return command
+lookupInPath c
+    | c /= takeFileName c = return c
     | otherwise = do
-        Stdout out <- quietly $ cmd ["which", command]
-        let path = dropWhileEnd isSpace out
-        return path
+        envPaths <- splitOn ":" <$> getEnvWithDefault "" "PATH"
+        let candidates = map (-/- c) envPaths in
+            -- this will crash if we do not find any valid candidate.
+            head <$> filterM doesFileExist candidates
 
 -- Oracle for windowsRoot. This operation requires caching as looking up
 -- the root is slow (at least the current implementation).