[foreign] jextract issue with system headers
Jorn Vernee
jbvernee at xs4all.nl
Wed May 1 10:59:42 UTC 2019
Interesting. I think the defines are for use with #ifdef
Checking for duplicates seems like a good choice. I think discarding the
macro constant, and keeping the one from the enum is fine in this case.
Jorn
Maurizio Cimadamore schreef op 2019-05-01 12:39:
> Hi,
> I was trying to rerun some examples I had with the new generation
> scheme. One of them has failed - it is a simple getpid test, that is,
> an extraction of the 'unistd.h' file:
>
> $ jextract -t stdlib -d classes /usr/include/unistd.h
> java.lang.RuntimeException: In memory compilation failed:
> /stdlib/x86_64_linux_gnu/bits/confname_h.java:2451: error: method
> _PC_LINK_MAX() is already defined in interface confname_h
> public int _PC_LINK_MAX();
> ^
> /stdlib/x86_64_linux_gnu/bits/confname_h.java:2459: error: method
> _PC_MAX_CANON() is already defined in interface confname_h
> public int _PC_MAX_CANON();
> ^
> /stdlib/x86_64_linux_gnu/bits/confname_h.java:2467: error: method
> _PC_MAX_INPUT() is already defined in interface confname_h
> public int _PC_MAX_INPUT();
>
> The output goes on with 300 errors.
>
> Turns out that jextract is generating duplicate constants, one coming
> from the enum constant and one coming from a #define with same name -
> the pattern in the header is as follows:
>
> /* Values for the NAME argument to `pathconf' and `fpathconf'. */
> enum
> {
> _PC_LINK_MAX,
> #define _PC_LINK_MAX _PC_LINK_MAX
> _PC_MAX_CANON,
> #define _PC_MAX_CANON _PC_MAX_CANON
> _PC_MAX_INPUT,
> ...
> }
>
>
> Should jextract check for duplicates before emitting a constant with
> same name? Or should we use some kind of mangling to distinguish
> between the #defined constants and the enum ones? I think I'd rather
> see the former in the short term.
>
> Maurizio
More information about the panama-dev
mailing list