[Haskell-cafe] hsffig issues (was: Suggestions for #defines with
FFI)
John Goerzen
jgoerzen at complete.org
Thu Jul 28 08:57:03 EDT 2005
On Thu, Jul 28, 2005 at 12:08:11AM -0400, Dimitry Golubovsky wrote:
> >1) It didn't declare types for the imported constants, so Haddock
> >wouldn't generate a list over it.
>
> I never tried to make hsffig output documentable: the whole idea is just
> to write "import FOO_H" in Haskell as one would write "#include <foo.h>"
> in C.
Yeah, I understand. I'm just trying to push it a bit ;-)
I'd rather be able to directly re-export all that again, saving me
having to key it all in manually. Or perhaps declare my own transformer
over it (a plugin of sorts, perhaps, so I could work nicely with
enums-from-macros in the scenario I've described)
> I mentioned this in the Tutorial: hsffig gives the Haskell compiler the
> same look at information about the library to import as the C compiler
> would have. It is hard to separate such things: your header file that
> you include may include ten other headers, five of them related to the
> library, and the rest from /usr/include
I think, though, that it shouldn't be too hard to filter the data coming
back from gcc. For instance, you could just look for stuff after a line
ilke:
# 1 "/usr/include/ldap.h"
and start ignoring when you see a reference to any other file.
> >3) It tried to list some of the GCC internal conditionals as constants,
> >making the .hsc not compile unless I manually removed some of them.
>
> Can you provide an example of that? With (almost antique) egcs-2.91.66 I
> never had anything like this. What was in the .hsc file and what was the
> compilation error?
Without posting too many hundreds of K on a public mailing list, the
output of gcc -E -dD /usr/include/ldap.h begins like this:
# 1 "/usr/include/ldap.h"
# 1 "<built-in>"
#define __STDC_HOSTED__ 1
# 1 "<built-in>"
#define __GNUC__ 4
# 1 "<built-in>"
#define __GNUC_MINOR__ 0
# 1 "<built-in>"
#define __GNUC_PATCHLEVEL__ 1
# 1 "<built-in>"
#define __SIZE_TYPE__ long unsigned int
# 1 "<built-in>"
The problem in this particular case was, if memory serves,
__STDC_HOSTED__. hsc2hs was unable to evaluate that macro.
> >I really like the idea, though. Autodetecting these is great, since
> >they could vary somewhat from implementation to implementation.
>
> Exactly: the Haskell compiler gets the same information (e. g. from
> features.h) as the C compiler got when compiling the library.
Well, that sort of stuff I can already get with hsc2hs (#type and all
that).
What I was really speaking about is that there is a standard for the
LDAP C API. There are many implementations of it, and there are some
optional parts of the API as well as some vendor-specific extensions.
With a slightly smarter hsffig, it seems it would be possible to provide
the exact features in Haskell that are exposed to C for any given
implementation, automatically. Really Cool (TM) in my book.
Thanks for all your great work. BTW, I have packaged hsffig up for
Debian and will be uploading it as soon as possible.
(Someone on #haskell had actually pointed me to it, and I had tried it
out, before I started this thread.)
-- John
More information about the Haskell-Cafe
mailing list