问题
I'm using a VM with the following configuration:
- Arch Linux (3.0-ARCH kernel)
- GHC 7.0.3
- cabal-install 0.10.2
- Cabal library 1.10.1.0
When I try to build zlib using cabal...
$ cabal install zlib
I get the following output:
Resolving dependencies...
Downloading zlib-0.5.3.2...
Configuring zlib-0.5.3.2...
Preprocessing library zlib-0.5.3.2...
Stream.hsc:86:21: error: missing binary operator before token "("
Stream.hsc: In function ‘main’:
Stream.hsc:86:21: error: missing binary operator before token "("
Stream.hsc:86:21: error: missing binary operator before token "("
compiling dist/build/Codec/Compression/Zlib/Stream_hsc_make.c failed (exit code 1)
command was: /usr/bin/gcc -c dist/build/Codec/Compression/Zlib/Stream_hsc_make.c -o dist/build/Codec/Compression/Zlib/Stream_hsc_make.o -fno-stack-protector -fno-stack-protector -D__GLASGOW_HASKELL__=700 -Dlinux_BUILD_OS -Dlinux_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/usr/lib/ghc-7.0.3/bytestring-0.9.1.10/include -I/usr/lib/ghc-7.0.3/base-4.3.1.0/include -I/usr/lib/ghc-7.0.3/include -I/usr/lib/ghc-7.0.3/include -I/usr/lib/ghc-7.0.3/include/
cabal: Error: some packages failed to install:
zlib-0.5.3.2 failed during the building phase. The exception was:
ExitFailure 1
Can anyone shed some light on this build error?
Edit: Here's a snippet from Stream.hsc with line numbers:
82 import Foreign
83 ( Word8, Ptr, nullPtr, plusPtr, peekByteOff, pokeByteOff, mallocBy tes
84 , ForeignPtr, FinalizerPtr, newForeignPtr_, addForeignPtrFinalizer
85 , withForeignPtr, touchForeignPtr )
86 #if MIN_VERSION_base(4,4,0)
87 import Foreign.ForeignPtr.Unsafe ( unsafeForeignPtrToPtr )
88 import System.IO.Unsafe ( unsafePerformIO )
89 #else
90 import Foreign ( unsafeForeignPtrToPtr, unsafePerformIO )
91 #endif
回答1:
For some reason, the MIN_VERSION_base
macro doesn't get expanded, thus the preprocessor sees the condition MIN_VERSION_base(4,4,0)
which it of course cannot handle. I've not yet found out why the macro isn't expanded, but workarounds are
- install zlib-0.5.3.1 instead
- unpack the tarball and edit
Codec/Compression/Zlib/Stream.hsc
to remove the offending macro (you're using 7.0.3, so your base version is 4.3.1.0, you can replace the macro with 0)
Edit: After poking around a bit, I found out that to hide these preprocessor directives, which aren't intended for hsc2hs
to process, they have to be masked by an extra '#'. Bug report underway.
回答2:
On Ubuntu, I fixed (or really, avoided) a similar error with
sudo apt-get install libghc-zlib-dev libghc-zlib-bindings-dev
(I don't know if both are needed.)
回答3:
I'm still encountering this with the haskell package zlib-0.5.4.2 on GHC 7.8.4. I think the issue is a non-standard location of the library. I solved it by hand-installing zlib 1.2.8 and then doing:
cabal install zlib --extra-lib-dirs=/usr/local/lib --extra-include-dir=/usr/local/include
回答4:
The most likely reason is that the zlib C library headers are missing on your machine. You might instead try to use the Arch Linux "Haskell Platform" or haskell-zlib packages, which resolve C dependencies for you.
回答5:
I don't understand this error, but it happened to me also earlier today while trying to install Agda 2.3 using GHC 7.4. Saizan from #agda suggested that I try
cabal unpack zlib
cd zlib-0.5.3.2/
runghc Setup configure --user; runghc Setup build; runghc Setup install
This proved effective. But I'm still in the dark about what's actually the problem.
Still, as it worked, I thought I'd share.
来源:https://stackoverflow.com/questions/8961413/zlib-build-error-with-ghc