[Haskell-cafe] Cabal depend on local package with foreign dependencies

Richard Lewis richard.lewis at gold.ac.uk
Tue Oct 27 15:08:26 UTC 2015


Hi there,

I have two libraries that I'm working on, packageA and packageB.

packageA was written some time ago and depends on a foreign C library,
libfoo, which I also wrote and which is installed in a non-standard
location. packageB depends on packageA and is new and under active
development.

I have the following things, then:

 - libfoo is installed in ~/.local/lib, with includes in ~/.local/include/foo
 - packageA is in ~/src/packageA
 - packageB is in ~/src/packageB

packageA has a .cabal file which includes:

library
  build-depends: base, ...
  exposed-modules: A
  include-dirs: /home/richard/.local/include
  extra-lib-dirs: /home/richard/.local/lib

executable testA
  ...
  extra-lib-dirs: /home/richard/.local/lib
  extra-libraries: foo

I've created a cabal sandbox in packageA and I can successfully build
it.

Now, packageB makes use of packageA. It has a .cabal file which looks
like this:

library
  build-depends: base, packageA, ...
  exposed-modules: B

executable testB
  ...
  extra-lib-dirs: /home/richard/.local/lib
  extra-libraries: foo

Again, I've created a cabal sandbox in packageB. In order to be able
to use packageA (which is not installed anywhere) I believe I have to
do:

$ cabal add-source ~/src/packageA

Next, when I try and configure, it says:

cabal: At least the following dependencies are missing:
packageA -any

That's fine, I assume, because I can now just `cabal install
--only-dependencies` to get packageA built into packageB's
sandbox. But when I try and do this, I get:

$ cabal install --only-dependencies
Resolving dependencies...
Configuring packageA-0.1...
Building packageA-0.1...
Preprocessing library packageA-0.1...
In-place registering packageA-0.1...
Preprocessing executable 'testA' for packageA-0.1...
Foo.hsc:10:33: fatal error: foo/foo.h: No such file or directory
compilation terminated.

So a target of packageA which compiles fine when doing cabal build
directly from packageA now fails to compile when I attempt to build it
from packageB by installing packageB's dependencies.

I'm not sure how to proceed. It feels like maybe I have to tell
cabal--when running it from packageB--where the include files are for
packageA, because packageA needs to get compiled (which involves
linking against libfoo and using libfoo's includes). I know that
packageA *does* compile (because I've done that already), but it won't
compile inside packageB's sandbox.

Any suggestions?

Richard


More information about the Haskell-Cafe mailing list