[GHC] #3186: findExeutable does not respect order of search path on Windows

GHC trac at galois.com
Wed Apr 22 11:25:11 EDT 2009


#3186: findExeutable does not respect order of search path on Windows
--------------------+-------------------------------------------------------
Reporter:  duncan   |          Owner:                     
    Type:  bug      |         Status:  new                
Priority:  normal   |      Component:  libraries/directory
 Version:  6.10.2   |       Severity:  normal             
Keywords:           |       Testcase:                     
      Os:  Windows  |   Architecture:  Unknown/Multiple   
--------------------+-------------------------------------------------------
 On Windows `findExeutable` is behaving rather strangely.

 From a command line window (ie not MSYS):
 {{{
 H:\>echo %PATH%
 C:\Program Files\MiKTeX 2.7\miktex\bin;
 C:\WINDOWS\system32;
 C:\WINDOWS;
 C:\WINDOWS\System32\Wbem;
 C:\Program Files\QuickTime\QTSystem\;
 c:\Program Files\Microsoft SQL Server\90\Tools\binn\;
 C:\Program Files\MATLAB\R2009a\bin;
 C:\Program Files\MATLAB\R2009a\bin\win32;
 C:\Program Files\Haskell\bin;
 D:\dcoutts\ghc-6.10.1\bin;
 D:\dcoutts\Gtk2Hs\bin;
 D:\dcoutts\bin
 }}}
 (formatted onto multiple lines for clarity)

 Now it appears I've got three versions of haddock installed:
 {{{
 H:\>where haddock
 C:\Program Files\Haskell\bin\haddock.exe
 D:\dcoutts\ghc-6.10.1\bin\haddock.exe
 D:\dcoutts\bin\haddock.exe
 }}}

 However in ghci:
 {{{
 H:\>ghci
 Prelude> System.Directory.findExecutable "haddock"
 Just "D:\\dcoutts\\GHC-61~1.1\\bin\\haddock.exe"
 }}}

 But this is bonkers! The version it has found is not in the first
 directory on the search path.

 I don't think it's related to the global/user split in the Windows
 `%PATH%`. All of the dirs containing haddock.exe are in the user portion
 of my `%PATH%`.

 On Windows `System.Directory.findExecutable` uses the `SearchPathA` Win32
 function. The [http://msdn.microsoft.com/en-us/library/aa365527.aspx MSDN
 docs] mention that it searches system and the current dirs first and has
 some "safe" search mode but none of those things seem to be relevant here.

 This problem confuses users of Cabal which uses `findExecutable` to find
 build tools. See [this thread http://haskell.org/pipermail/cabal-
 devel/2009-April/005158.html] from the cabal mailing list.

 Perhaps we should just use the pure Haskell version that we use on non-
 Windows systems. Still, it'd be nice to reflect properly the Windows
 search path semantics if it's not as simple as looking in the `%PATH%`.

 Actually the semantics are pretty weird. Consider this...

 Let's cut down to just two versions of haddock:
 {{{
 H:\>where haddock
 C:\Program Files\Haskell\bin\haddock.exe
 D:\dcoutts\ghc-6.10.1\bin\haddock.exe
 }}}

 Now lets see what versions we've got where:
 {{{
 H:\>"C:\Program Files\Haskell\bin\haddock.exe" --version
 Haddock version 2.1.0, (c) Simon Marlow 2006
 Ported to use the GHC API by David Waern 2006-2008

 H:\>D:\dcoutts\ghc-6.10.1\bin\haddock.exe --version
 Haddock version 2.3.0, (c) Simon Marlow 2006
 Ported to use the GHC API by David Waern 2006-2008
 }}}

 As expected, just running haddock from the command line gives us the first
 one:
 {{{
 H:\>haddock --version
 Haddock version 2.1.0, (c) Simon Marlow 2006
 Ported to use the GHC API by David Waern 2006-2008
 }}}

 Now in ghci:
 {{{
 Prelude> System.Process.runCommand "haddock --version"
 Haddock version 2.1.0, (c) Simon Marlow 2006
 Ported to use the GHC API by David Waern 2006-2008
 }}}
 That's fine. It's the first one and consistent with running from the
 command line (internally `runCommand` uses the command processor).

 But now try this:
 {{{
 Prelude> System.Process.runProcess "haddock" ["--version"] Nothing Nothing
 Nothing Nothing Nothing
 Haddock version 2.3.0, (c) Simon Marlow 2006
 Ported to use the GHC API by David Waern 2006-2008
 }}}

 WT!? Where did that come from? It's using a different search path from the
 command interpreter. This one however is consistent with the
 `findExecutable` function (as it is supposed to be).

 No idea what is going on. Can anyone else reproduce or explain this?

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3186>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the Glasgow-haskell-bugs mailing list