Подтвердить что ты не робот

Ошибка сборки zlib с GHC

Я использую виртуальную машину со следующей конфигурацией:

  • Arch Linux (ядро 3.0-ARCH)
  • GHC 7.0.3
  • cabal-install 0.10.2
  • Библиотека Cabal 1.10.1.0

Когда я пытаюсь построить zlib с помощью cabal...

$ cabal install zlib

Я получаю следующий вывод:

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

Может ли кто-нибудь пролить свет на эту ошибку сборки?


Изменить: Вот фрагмент из 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 import Foreign ( unsafeForeignPtrToPtr, unsafePerformIO )
 91 #endif
4b9b3361

Ответ 1

По какой-то причине макрос MIN_VERSION_base не расширяется, поэтому препроцессор видит условие MIN_VERSION_base(4,4,0), которое, конечно, не может обрабатывать. Я еще не понял, почему макрос не расширяется, но обходные пути

  • установить zlib-0.5.3.1 вместо
  • распакуйте tarball и отредактируйте Codec/Compression/Zlib/Stream.hsc, чтобы удалить оскорбительный макрос (вы используете 7.0.3, поэтому ваша базовая версия 4.3.1.0, вы можете заменить макрос 0)

Изменить:. Немного похлопываясь, я обнаружил, что для того, чтобы скрыть эти директивы препроцессора, которые не предназначены для обработки hsc2hs, они должны быть замаскированы дополнительным "#". Отчет об ошибках продолжается.

Ответ 2

В Ubuntu я исправил (или действительно, избегал) аналогичную ошибку с

sudo apt-get install libghc-zlib-dev  libghc-zlib-bindings-dev

(Я не знаю, нужны ли оба.)

Ответ 3

Я все еще сталкиваюсь с этим с пакетом haskell zlib-0.5.4.2 на GHC 7.8.4. Я думаю, что проблема - нестандартное расположение библиотеки. Я решил это вручную, установив zlib 1.2.8, а затем выполнив:

cabal install zlib --extra-lib-dirs=/usr/local/lib --extra-include-dir=/usr/local/include

Ответ 4

Наиболее вероятная причина в том, что заголовки библиотеки zlib C отсутствуют на вашем компьютере. Вместо этого вы можете попытаться использовать пакеты Arch Linux "Haskell Platform" или haskell-zlib, которые разрешают вам зависимости C.

Ответ 5

Я не понимаю эту ошибку, но это случилось и с нами ранее, при попытке установить Agda 2.3 с помощью GHC 7.4. Сайзан из #agda предложил мне попробовать

cabal unpack zlib
cd zlib-0.5.3.2/
runghc Setup configure --user; runghc Setup build; runghc Setup install

Это оказалось эффективным. Но я все еще в темноте о том, что на самом деле проблема.

И все же, поскольку это сработало, я думал, что поделюсь.