Cabal install игнорирует пакет в build-зависимость, а затем запрашивает его - PullRequest
0 голосов
/ 04 января 2019

Используя cabal Я пытаюсь установить iserv-proxy, сборка зависит от libiserv, и я установил его раньше. когда я запускаю команду установки:

ghc/utils/iserv-proxy$ cabal install -flibrary -fproxy

не получается с:

src/Main.hs:53:1: error:
Could not load module `Remote.Message'
It is a member of the hidden package `libiserv-8.6.3'.
Perhaps you need to add `libiserv' to the build-depends in your .cabal file.
Use -v to see a list of the files searched for.
   |
53 | import Remote.Message
   | ^^^^^^^^^^^^^^^^^^^^^

как говорится в ошибке, Remote.Message - это exposed-module в libiserv, но libiserv существует в зависящем от сборки файле iserv-proxy.cabal, как и в 8.6.3 версии ghc:
(только я изменил containers верхняя зависимость с 0.6 на 0.7, что вызывало конфликт зависимостей.)

iserv-proxy.cabal

.
.
.
Executable iserv-proxy
Default-Language: Haskell2010
Main-Is: Main.hs
Hs-Source-Dirs: src 
Build-Depends: array      >= 0.5 && < 0.6,
               base       >= 4   && < 5,
               binary     >= 0.7 && < 0.9,
               bytestring >= 0.10 && < 0.11,
               containers >= 0.5 && < 0.7,
               deepseq    >= 1.4 && < 1.5,
               directory  >= 1.3 && < 1.4,
               network    >= 2.6,
               filepath   >= 1.4 && < 1.5,
               ghci       == 8.6.*,
               libiserv   == 8.6.*

Кабал знает о libiserv установке:

$ cabal list --installed libiserv
* libiserv
    Default available version: [ Not available from any configured repository ]
    Installed versions: 8.6.3
    License:  BSD-3-Clause

и build-depends, как это видно из подробного журнала установки (-v), вы можете найти его здесь в pastebin .

Это так устало, я довольно плохо знаком с cabal и ghc, так что я могу что-то напутать. Когда я смотрю на команду ghc в приведенном выше подробном журнале :

/opt/ghc/bin/ghc --make -no-link -fbuilding-cabal-package -O -static -outputdir dist/build/iserv-proxy/iserv-proxy-tmp -odir dist/build/iserv-proxy/iserv-proxy-tmp -hidir dist/build/iserv-proxy/iserv-proxy-tmp -stubdir dist/build/iserv-proxy/iserv-proxy-tmp -i -idist/build/iserv-proxy/iserv-proxy-tmp -isrc -idist/build/iserv-proxy/autogen -idist/build/global-autogen -Idist/build/iserv-proxy/autogen -Idist/build/global-autogen -Idist/build/iserv-proxy/iserv-proxy-tmp -optP-include -optPdist/build/iserv-proxy/autogen/cabal_macros.h -hide-all-packages -Wmissing-home-modules -package-db dist/package.conf.inplace -package-id array-0.5.3.0 -package-id base-4.12.0.0 -package-id binary-0.8.6.0 -package-id bytestring-0.10.8.2 -package-id containers-0.6.0.1 -package-id deepseq-1.4.4.0 -package-id directory-1.3.3.0 -package-id filepath-1.4.2.1 -package-id ghci-8.6.3 -package-id libiserv-8.6.3 -package-id network-2.8.0.0-AkCJm1aNSYz7ekXKYyI0pF -XHaskell2010 src/Main.hs

Он пропускает любую библиотеку от -I или -include до libiserv, и, что интересно, при установке libiserv нет никакого файла .h или include:

$ ls /root/.cabal/lib/x86_64-linux-ghc-8.6.3/libiserv-8.6.3-EjLBkFaay9bH1Xm2bkeUPB/
GHCi  Lib.dyn_hi  Lib.hi  Remote  libHSlibiserv-8.6.3-EjLBkFaay9bH1Xm2bkeUPB.a

мой конфиг:

$ cabal --version
cabal-install version 2.4.1.0
compiled using version 2.4.1.0 of the Cabal library 
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.6.3
ghc$ git log -1
Author: Ben Gamari <ben@smart-cactus.org>
Date:   Thu Dec 6 16:58:34 2018 -0500

    Release 8.6.3

My ghc-pkg check возвращает пару предупреждений для пропавших без вести документов haddock-html и haddock-interfaces. Вы можете найти полный вывод здесь в другой pastebin

Обновление:

добавление --ghc-options="-i../../libraries/libiserv/src/" к команде установки решило мой случай, но так не должно быть, поэтому я оставил этот вопрос открытым, чтобы найти лучшее решение.

1 Ответ

0 голосов
/ 04 января 2019

Обратите внимание, что libiserv может быть построен с поддержкой для сети и без. По умолчанию он будет построен без. Вам нужно построить libiserv с -fnetwork, чтобы выставить Remote.Message.

Таким образом, вы, вероятно, хотите что-то вроде:

libiserv $ cabal install -fnetwork
iserv-proxy $ cabal install -flibrary -fproxy
...