Getting Cabal 1.1.1 working on Windows 98

Toby Allsopp toby at
Fri Aug 5 20:28:09 EDT 2005

The version of Cabal that comes with GHC (6.4 and 6.4.1) doesn't run
on Windows 98 because of a missing SHGetFolderPathA function, so I
thought I'd try to compile version 1.1.1 myself.  I see that some work
has been done in CVS for this problem, but I thought I'd post the
changes I had to make to get 1.1.1 to work incase this is helpful to
other people or to getting it fixed propoerly.

I'm using MinGW 4.1, MSYS 1.0.10 and MSYS Developer Tool Kit 1.0.1.

I've attached a patch against version 1.1.1.

First, I tried compiling setup without any changes:

  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ setup
  Compiling Main             ( Setup.lhs, dist/tmp/Main.o )
  Linking ...
  dist/tmp/Distribution/Simple/Configure.o(.text+0xe41):fake: undefined reference to `SHGetFolderPath at 20'
  make: *** [setup] Error 1

Ok, this seems to be because we need to pick either the A or W
version.  I'm not sure how to get this to happen automatically, but I
guess we want the A version:
  $ diff ../cabal-1.1.1.orig/Distribution/Simple/Configure.hs Distribution/Simple
  < foreign import stdcall unsafe "SHGetFolderPath" 
  > foreign import stdcall unsafe "SHGetFolderPathA" 

Now, I try again:
  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ setup
  Skipping  Main             ( Setup.lhs, dist/tmp/Main.o )
  Linking ...

Yay, it compiled!  Now I try to run it:
  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ config
  "The SETUP.EXE file is linked to missing export SHELL32.DLL:SHGetFolderPathA"

(The message is GUI dialog box.)  Ah, this is because SHGetFolderPathA
is not in SHELL32.DLL on Windows 98, but in SHFOLDER.DLL.  It is also
in SHFOLDER.DLL on later versions, so this change should be safe:
  $ diff ../cabal-1.1.1.orig/GNUmakefile GNUmakefile 
  < GHCFLAGS= --make -Wall -fno-warn-unused-matches -cpp
  > GHCFLAGS= --make -Wall -fno-warn-unused-matches -cpp -lshfolder

Try again:
  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ config
  Skipping  Main             ( Setup.lhs, dist/tmp/Main.o )
  Linking ...
  ./setup configure --ghc --prefix=/usr/local
  Configuring Cabal-1.1.1...
  configure: Using install prefix: C:/MSYS/1.0/local
  configure: Using compiler: c:\GHC\GHC-6.4.1\BIN\ghc.exe
  configure: Compiler flavor: GHC
  configure: Compiler version: 6.4.1
  configure: Using package tool: c:\GHC\GHC-6.4.1\BIN\ghc-pkg.exe
  configure: No haddock found
  configure: No happy found
  configure: No alex found
  configure: Using hsc2hs: c:\GHC\GHC-6.4.1\BIN\hsc2hs.exe
  configure: No c2hs found
  configure: No cpphs found
  configure: No greencard found
  configure: Dependency base-any: using base-1.0
  configure: Dependency util-any: using util-1.0

Yay!  Now to install it:

  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ install
  Installing: C:/MSYS/1.0/local\Haskell\Cabal-1.1.1\ghc-6.4.1 & C:/MSYS/1.0/local\Cabal-1.1.1\bin Cabal-1.1.1...
  Registering Cabal-1.1.1...

Ok, it all seems fine.  Now to try to use it:

  $ cd tests/HSQL
  $ runghc Setup.lhs configure
  ghc.exe: unable to load package `Cabal-1.1.1'
  C:/MSYS/1.0/local\Haskell\Cabal-1.1.1\ghc-6.4.1/HSCabal-1.1.1.o: unknown symbol `_SHGetFolderPathA'

Bummer.  We need to link with SHFOLDER.DLL. So, we change Cabal's
cabal file (similarly to the comment that was in CVS recently):

  $ cd ../..
  $ diff -u ../cabal-1.1.1.orig/Cabal.cabal Cabal.cabal 
  --- ../cabal-1.1.1.orig/Cabal.cabal     Sat Aug  6 11:50:00 2005
  +++ Cabal.cabal Sat Aug  6 12:17:46 2005
  @@ -48,6 +48,7 @@
   Extensions: CPP
  +Extra-Libraries: shfolder
   executable: cabal-setup
   main-is: DefaultSetup.lhs

Then, install again and try the test again:

  $ make HCBASE=/c/ghc/ghc-6.4.1/bin/ install
  Registering Cabal-1.1.1...

  $ cd tests/HSQL/
  $ runghc Setup.lhs configure
  -=-= Cabal executing: ./configure =-=-
  Bad command or file name
  Configure Succeeded.

Triple yay!  Using this version I have successfully installed the real

How, it seems wrong to have to specify the A or W version explicitly
because there is a #define for it that depends on whther UNICODE is
defined.  I don't know why that's not being picked up (it's in
shldobj.h and I see that that's been specified in CVS, but adding it
makes no difference for me.)

The patch follows:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: cabal-1.1.1-win98.diff
Type: text/x-patch
Size: 1293 bytes
Desc: not available
Url :

More information about the Libraries mailing list