ghc/cygwin filename resolution issue.

George Russell
Wed, 29 Jan 2003 12:22:43 +0100

This is a multi-part message in MIME format.
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Alex wrote
> Using ghc-5.04.2 under cygwin, and cygwin (v. 1.3.10-1), I'm having some
> horrible problems with inconistent treatment of filenames, especially
> when using (gnu, cygwin) make.  In a nutshell, make seems to be passing
> paths such as "/usr/local/hmake" (etc) to ghc, which is, as I understand
> it, interpretting these in a manner consistent with windows, but not with
> cygwin.  (i.e., it'd expect the above to be something like:
> /cygwin/usr/local/hmake, where the root of the cygwin installation is in
> c:\cygwin.  Experimenting with similar arguments to ghc by hand seems to
> confirm this.

The UniForM/HTk distribution includes the attached very simple Haskell98 program,
which is compiled and run during the ./configure stage.  This program transforms
stdin to stdout, globally replacing the string "#PWD" with whatever GHC thinks the
current directory is called.  This program is used in various ways; in particular
./configure uses it to set a variable GHCTOP corresponding to GHC's name for the
top of the source distribution, which is then what gets passed to GHC.  The program
is also used for various unholy tricks involving package config files, which also
of course need the Windows name.

Fortunately GHC doesn't mind if some slashes are the wrong way; thus if GHCTOP is
"C:\foo\bar\uni", then I can refer to "C:\foo\bar\uni\baz" as $GHCTOP/baz, as
it would be on Unix.
Content-Type: text/plain; charset=us-ascii;
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;

{- This program converts stdin to stdout.  It replaces all occurrences of
   the string "#PWD" in stdin with the current directory in which it is
   executed, C escaped.  The string "#pwd" is similarly replaced, except that
   it is not escaped.   Everything else is left unchanged.

   If an argument is supplied, this is used instead of the current

   The program occupies an unusual place in the UniForM sources; it is not
   part of the main sources, but is only used during building (see
   and is compiled during configuration.  Since it only uses completely
   standard Haskell 98, this ought to be pretty easy.

   We do things this way rather than with some sort of script so that this
   will work even in the extremely hostile environment of Windows (with no
   cygwin).  Also, using GHC's getCurrentDirectory means we get at what
   GHC thinks the current directory is (IE the Windows file name) rather than
   what it is in cygwin's Unix world.
module Main (main) where

import Directory
import System

main :: IO ()
main = 
      input <- getContents
      args <- getArgs
      toInsert <- case args of
        [arg] -> return arg
        [] -> getCurrentDirectory   
         escapeString s = 
               withQuotes @ ('\"':rest) = show s
               take (length rest - 1) rest

         quoted = escapeString toInsert
         transform [] = []
         transform ('#':'P':'W':'D':rest) = quoted ++ transform rest
         transform ('#':'p':'w':'d':rest) = toInsert ++ transform rest
         transform (c:rest) = c:transform rest
      putStr . transform  $ input