[Haskell-cafe] Including a "XXX_stub.h" file from another Haskell library?
Albert Y. C. Lai
trebla at vex.net
Tue Feb 9 17:23:40 UTC 2016
On 2016-02-08 08:34 AM, Alp Mestanogullari wrote:
> Let's say I have two Haskell libraries, `A` and `B`.
>
> `A` uses the FFI, `foreign export` to be precise, to make a Haskell
> function available to C land. This generates a "stub" C header file
> with a corresponding C function declaration.
>
> `B` has some C code in it and needs to include the stub header that
> was generated when compiling `A`, in order to call the function that I
> 'foreign export'ed in A.
>
> When I "naively" include the stub header file for the module in A that
> contains the 'foreign export' statement, inside one of the C files of
> the `B` library, the said header can't be found.
A_stub.h has the problem of #include'ing <HsFFI.h>. (Read A_stub.h to see.)
HsFFI.h has the problem of strongly inflicting "you have to install a
Haskell compiler" on C programmers who just want to build B (which is
just C code that just calls a binary library callable from C). Firstly
it only comes with a Haskell compiler. Secondly its location is usually
under the Haskell compiler's directory, not the usual ones configured to
the C compiler, therefore either (recommended) you call "ghc -c B.c" so
that it calls gcc with HsFFI.h's location, or (unmaintainable) you enter
it manually.
My recommendation is to ignore A_stub.h and write your own simple
independent A.h.
It can be correct because Haskell 2010 asserts that, for example,
HsInt64 must be "signed integral type, 64 bit; int64_t if available".
There is no choice. You don't need HsFFI.h to tell you what HsInt64 is,
you can already enter "int64_t" today. HsPtr is even better, it is
"(void *)". There is no choice. (See Haskell 2010 Report, section 8.7.)
As for HsInt, yes that varies across Haskell compilers, but you are
supposed to use HsInt8 or HsInt16 or HsInt32 or HsInt64.
More information about the Haskell-Cafe
mailing list