GHC的zlib生成错误 [英] zlib build error with GHC
问题描述
- Arch Linux(3.0-ARCH内核)
- GHC 7.0.3
- cabal-install 0.10.2
- Cabal库1.10.1.0
当我尝试使用cabal来构建zlib时...
$ cab $ install zlib
我得到以下输出:
解决依赖关系...
正在下载zlib-0.5.3.2 ...
配置zlib-0.5.3.2 ...
预处理库zlib-0.5.3.2 ...
Stream.hsc:86:21:错误:在令牌之前缺少二元运算符(
Stream.hsc:在函数'main'中:
Stream。 (
Stream.hsc:86:21:错误:缺少令牌之前的二元运算符(
编译dist / build / Codec / Compression /Zlib/Stream_hsc_make.c失败(退出代码1)
命令是:/ usr / bin / gcc -c dist / build / Codec / Compression / Zlib / Stream_hsc_make.c -o dist / build / Codec / Co mpression / 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:错误:某些软件包未能安装:
zlib-0.5.3.2在构建阶段失败。例外情况是:
ExitFailure 1
任何人都可以看到这个构建错误吗? / p>
编辑:以下是Stream.hsc中的代码段:
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导入外部(unsafeForeignPtrToPtr,unsafePerformIO)
91 #endif
预处理器看到条件 MIN_VERSION_base(4,4,0)
它当然不能处理。我还没有发现为什么这个宏没有被扩展,但是变通方法是安装zlib-0.5.3.1而不是
- >
- 解开压缩包并编辑
Codec / Compression / Zlib / Stream.hsc
以移除违规宏(您正在使用7.0.3,所以你的基本版本是4.3.1.0,你可以用0替换宏)
编辑:我发现为了隐藏这些预处理器指令,这些指令并不适用于 hsc2hs
处理,它们必须被一个额外的'#'掩盖。错误报告正在进行中。
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
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.
这篇关于GHC的zlib生成错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!