Setup: I have a Haskell library HLib
which makes calls to a C/C++ backend CLib
for efficiency. The backend is small and specialized for use with HLib
. The interface to CLib
will only be exposed through HLib
; HLib
tests, HLib
benchmarks and third party libraries depending on HLib
will not make direct FFI calls to CLib
. From the test/benchmark/3rd party lib perspective, HLib
should be appear purely Haskell. This means in the cabal file sections for, e.g., HLib
tests, there should be no references to -lCLib
, libCLib
, etc, only a build-depends
on HLib
, and that executables should not need to look for a dynamic CLib
library. I need to be able to build and run all executables in HLib
and third-party libs, as well as run cabal repl
for development.
Originally, CLib
was written in pure C. Cabal has support for this case, and I can integrate CLib
into HLib
in precisely the manner described above by using include-dirs
, c-sources
, and includes
fields in the cabal file.
CLib
has evolved into a C++ library, which I couldn't figure out how to get cabal to integrate easily. Instead, I resorted to a makefile with custom build and Setup.hs, like this. You can see a small example of this method here1,2.
In that example, I can't run cabal repl
in HLib
because "Loading archives not supported". This really means I need a dynamic C++ library, which is simple enough to create (there's a commented line in the CLib
makefile to do it). If I do make the dynamic C++ library, however, the test for HLib
fails at runtime due to a "no such file or directory libclib.so". This is bad (in addition to the crash) because the test executable linked against the dynamic library, which is not what I want.
Concretely, the tests for HLib
and SimpleLib
should both pass, and I should be able to run cabal repl
in both the hlib
and simplelib
directories.
Other things I've tried: this answer, this answer (which I can't get to compile), this, and reading the docs (results in "relocation" errors).
I'm using GHC-7.10.3 at the moment, though if this is significantly easier in 8.0, that's fine.
[1] Simplified from lol/challenges.
[2] Download and run ./sandbox-init
. This builds HLib
(which implicitly builds CLib
, and SimpleLib
, which is a Haskell library that depends on HLib
.
See Question&Answers more detail:
os