un/dosifyPath in SysTools.lhs bug?

Dominic Cooney dominic@dcooney.com
Mon, 14 Apr 2003 18:38:07 +1000


I'm trying to build ghc (the 5.04.3 source tarball) on Windows, but =
right
after the ghc-inplace is written and is used to build something, ghc =
fails.
If I cut and paste the command* and run it with -v, it's evident that =
ghc is
trying to execute /cygdrive/c/mingw/bin/gcc, which is the gcc that I
./configured --with-gcc.

But ghc is a mingw executable! So I think runSomething in SysTools.lhs, =
or
whatever calls it, might have a bug. From the comments of runSomething =
it is
clear that it expects a 'native' program. Anyway, the problem can be =
fixed
by changing:

cmd_line =3D pgm ++ ...

to:

cmd_line =3D (dosifyPath pgm) ++ ...

And dosifyPath and undosifyPath (#if defined(mingw32_HOST_OS)) have no
regard for drive letters! Shouldn't they be something like:

unDosifyPath xs =3D=20
	case (subst '\\' '/' xs) of
		drive : ':' : rest -> "/cygdrive/" ++ (drive : rest)
		xs'			 -> xs'

dosifyPath stuff
  =3D subst '/' '\\' real_stuff
 where
   -- fully convince myself that /cygdrive/ prefixes cannot
   -- really appear here.
  cygdrive_prefix =3D "/cygdrive/"

  real_stuff
    | cygdrive_prefix `isPrefixOf` stuff =3D
		case (dropList cygdrive_prefix stuff) of
			drive : rest -> drive : ':' : rest
    | otherwise =3D stuff

That comment re: cygdrive in dosifyPath is rather ominous... but those
changes at least allow ghc-inplace to start compiling the next thing...

The build then barfed in rts doing:

../../ghc/compiler/ghc-inplace -O2 -package-name rts -O -Rghc-timing     =
-c
Exception.hc -o Exception.o

Because Exception.hc couldn't #include "Stg.h"; it seems the GHC include
path was specified as a couple of Options instead of a single =
FileOption,
which meant showOptions didn't dosify it.

Doing a quick hack in showOptions to peek at Options for the /cygdrive/
prefix keeps the build going. What I'm wondering is:

Is anyone building GHC on Windows, and if so, how do you do it?

Thanks,

Dominic Cooney

* The command is:

../../ghc/compiler/ghc-inplace -optc-mno-cygwin -optc-O -optc-Wall =
-optc-W
-optc-Wstrict-prototypes -optc-Wmissing-prototypes
-optc-Wmissing-declarations -optc-Winline -optc-Waggregate-return
-optc-Wbad-function-cast -optc-Wcast-align -optc-I../includes -optc-I.
-optc-Iparallel -optc-DCOMPILING_RTS -optc-fomit-frame-pointer
-optc-DDLLized -O2 -package-name rts -O -Rghc-timing  -hisuf dll_hi =
-hcsuf
dll_hc -osuf dll_o    -c Main.c -o Main.dll_o