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

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

  • Arch Linux (ядро 3.0-ARCH)
  • GHC 7.0.3
  • cabal-install 0.10.2
  • Библиотека кабала 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

person Jon Nadal    schedule 22.01.2012    source источник


Ответы (5)


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

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

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

person Daniel Fischer    schedule 22.01.2012
comment
Ха, забавно, сегодня я столкнулся с такой же проблемой :) - person Phyx; 23.01.2012
comment
Правильное решение @Phyx найдено, не должно пройти много времени, пока оно не достигнет взлома. - person Daniel Fischer; 23.01.2012
comment
Обратите внимание, что cabal-install из HEAD (из-за 0,14, хотя он может быть и в 0,12, я не уверен) передает эти макросы в hsc2hs. Вероятно, так и возникла ошибка: тот, кто добавил макросы, имел версию cabal-install для разработки. - person Erik Hesselink; 02.02.2012
comment
Да, извините, ребята. Я тестировал несколько версий ghc, но, похоже, я использовал последнюю версию Cabal lib с каждой версией ghc, которую я использовал. Я исправил и загрузил новую версию. - person Duncan Coutts; 07.02.2012

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

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

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

person poolie    schedule 27.01.2012
comment
Вы спаситель. Это волшебное заклинание подействовало на меня. Я на Зорине 12.1 - person missingfaktor; 16.04.2017

Я все еще сталкиваюсь с этим с пакетом 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
person nont    schedule 21.01.2015
comment
Это исправило это для меня. Спасибо! В частности, они могут быть добавлены в ~/.cabal/config. - person ; 25.03.2015

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

person Don Stewart    schedule 22.01.2012
comment
Спасибо за предложения. К сожалению, пакеты extra / haskell-platform (2011.2.0.0-4) и extra / haskell-zlib (0.5.3.1-2.1) уже установлены. На самом деле все, что я сделал в виртуальной машине, это sudo pacman -S haskell-platform && cabal install virthualenv && mkdir -p src / proj && cd src / proj && virthualenv && source .virthualenv / bin / activate && cabal install yesod . Сборка yesod сломалась из-за ошибки zlib. - person Jon Nadal; 22.01.2012
comment
У меня точно такое же сообщение, и у меня присутствуют заголовки библиотеки zlib C. Добавление отсутствующего # заставило его работать. - person L. Kolmodin; 28.01.2012

Я не понимаю эту ошибку, но со мной она тоже случилась сегодня, когда я пытался установить 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

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

Тем не менее, когда это сработало, я подумал, что поделюсь.

person pigworker    schedule 22.01.2012
comment
Спасибо, что поделились. Я выполнил предложенные команды, но получил ту же ошибку при выполнении сборки настройки runghc. Я обновил свой вопрос, добавив фрагмент из Stream.hsc. - person Jon Nadal; 22.01.2012
comment
+1, потому что это решение работает после обновления Stream.hsc в соответствии с предложением Дэниела Фишера - person Jon Nadal; 23.01.2012
comment
@JonNadal нужно ли обновить ответ, чтобы указать, что вы должны отредактировать его перед запуском? - person poolie; 29.01.2012
comment
@poolie Выбор за вами. Решение Даниила правильное; это просто полезное продолжение. Чтобы уточнить, что нужно сделать перед выполнением runghc: (1) определите базовую версию: cabal info base | grep 'Установленные версии:' (2) Если версия ›= 4.4 .0 измените #if MIN_VERSION_base (4,4,0) на #if 1. В противном случае измените его на #if 0. - person Jon Nadal; 30.01.2012
comment
@poolie, я должен был также упомянуть, что Stream.hsc находится в Codec / Compression / Zlib / Stream.hsc в каталоге zlib. - person Jon Nadal; 30.01.2012