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

Edward Z. Yang ezyang at mit.edu
Tue Oct 27 18:38:29 UTC 2015


Hello Richard,

I am not sure why package A builds in its own sandbox, but your
copypaste suggests that executable testA does not have an include-dirs
section which would tell it where to find foo.h.  Could that be
the problem?

Edward

Excerpts from Richard Lewis's message of 2015-10-27 08:08:26 -0700:
> 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