[External] : Re: jextract fails to work on sd-daemon.h due to wrong handling of __INCLUDE_LEVEL__

Jorn Vernee jorn.vernee at oracle.com
Mon Feb 17 14:56:27 UTC 2025


Yes, that warning is unrelated. It likely means that 
_sd_useless_struct_to_allow_trailing_semicolon_is only a declaration 
that does not have a definition, so no bindings will be generated for it.

Jorn

On 17-2-2025 14:12, Nils Kattenbeck wrote:
> Thanks, v22 works. I was checking with jextract 21 as that is the JDK 
> version I have running. With v22 everything seems to work, both when 
> specifying one or two header files. There are still a few warnings but 
> those seem unrelated:
>
> sd-daemon.h:26:1: warning: Skipping 
> _sd_useless_struct_to_allow_trailing_semicolon_ (type 
> Declared(_sd_useless_struct_to_allow_trailing_semicolon_) is not 
> supported)
>
>
> Cheers, Nils
>
> On Mon, Feb 17, 2025 at 2:04 PM Jorn Vernee <jorn.vernee at oracle.com> 
> wrote:
>
>     Looking at the code, we already unconditionally generate an
>     intermediate header file [1]. So this should already work on the
>     latest version of jextract.
>
>     Jorn
>
>     [1]:
>     https://github.com/openjdk/jextract/blob/7ed79ecdf678db804f40b3494b6f1dafa760c808/src/main/java/org/openjdk/jextract/JextractTool.java#L110
>     <https://urldefense.com/v3/__https://github.com/openjdk/jextract/blob/7ed79ecdf678db804f40b3494b6f1dafa760c808/src/main/java/org/openjdk/jextract/JextractTool.java*L110__;Iw!!ACWV5N9M2RV99hQ!Iw0EA9Y9KDQAmnT1W734TK58GyrdlXU9udm4XBJYBuYjQwu9PftFnhLsLnywJZ4adAjR2S4WJH1D6l4innKM$>
>
>     On 17-2-2025 14:00, Maurizio Cimadamore wrote:
>>
>>     I wonder how this interacts with the fact that jextract now also
>>     accepts multiple headers and, in that case, it will generate an
>>     intermediate header that includes the specified headers.
>>
>>     Can you try passing jextract _two_ headers, both sd-daemon.h and
>>     something else, and see what happens? My feeling is that things
>>     should work in that case.
>>
>>     Which, if true, would advocate for jextract to handle both cases
>>     in the same way: with an intermediate header including the
>>     specified header file(s).
>>
>>     Maurizio
>>
>>
>>
>>     On 15/02/2025 16:46, Nils Kattenbeck wrote:
>>>     Hi Jorn,
>>>
>>>     Your assessment seems to be correct. In C the main.c would be
>>>     level 0 which libclang sidesteps in this case. Creating a dummy
>>>     header file which simply includes the sd-daemon.h file seems to
>>>     fix the problem.
>>>
>>>     That being said I think it would still make sense for jextract
>>>     to work around this issue. Given that the resulting Java classes
>>>     would be similar to the main translation unit in C it would make
>>>     sense for jextract to emulate this behaviour and read the header
>>>     files as if they already were at level 1. This could e.g. be
>>>     done creating such a dummy header file automatically (like I now
>>>     did manually). This would better match expectations, resolve the
>>>     issue in this specific instance with systemd but more
>>>     importantly would prevent hard to troubleshoot issues in the future.
>>>
>>>     Cheers, Nils
>>>
>>>     On Fri, Feb 14, 2025 at 11:46 PM Jorn Vernee
>>>     <jorn.vernee at oracle.com> wrote:
>>>
>>>         Hey Nils,
>>>
>>>         Jextract uses clang under the hood to do the parsing, so it
>>>         is clang that is managing the __INCLUDE_LEVEL__ value, and
>>>         I'm assuming it does that correctly.
>>>
>>>         I think the issue here is that, normally, you would write a
>>>         program that includes sd-daemon.h, so the include level of
>>>         that file starts out at 1, with the main program translation
>>>         unit being level 0. But, since jextract uses clang to parse
>>>         the sd-daemon.h file directly, it has include level 0
>>>         instead, and this implementation header seems to end up with
>>>         include level 1, failing the check. You should see the same
>>>         error if you directly pass sd-daemon.h to clang (or gcc).
>>>
>>>         I think another way to work around this would be to create a
>>>         wrapper header file in which you #include sd-deamon.h, and
>>>         then pass that wrapper header file to jextract.
>>>
>>>         Jorn
>>>
>>>         On 13-2-2025 17:51, Nils Kattenbeck wrote:
>>>>         Dear all,
>>>>
>>>>         Today I tried to use jextract on sd-daemon.h (from systemd)
>>>>         to access the sd_notify* class of functions. To my surprise
>>>>         this did not work and returned in the following error message:
>>>>
>>>>         ../jextract-21/bin/jextract --source -t foo.bar
>>>>         /usr/include/systemd/sd-daemon.h
>>>>         WARNING: A restricted method in
>>>>         java.lang.foreign.AddressLayout has been called
>>>>         WARNING: java.lang.foreign.AddressLayout::withTargetLayout
>>>>         has been called by module org.openjdk.jextract
>>>>         WARNING: Use --enable-native-access=org.openjdk.jextract to
>>>>         avoid a warning for this module
>>>>
>>>>         /usr/include/systemd/_sd-common.h:23:4: error: "Do not
>>>>         include _sd-common.h directly; it is a private header."
>>>>
>>>>         which comes down to the following preprocessor code in
>>>>         _sd-common.h (which is included by sd-daemon.h):
>>>>
>>>>         #if defined(__INCLUDE_LEVEL__) && __INCLUDE_LEVEL__ <= 1 &&
>>>>         !defined(__COVERITY__)
>>>>         #  error "Do not include _sd-common.h directly; it is a
>>>>         private header."
>>>>         #endif
>>>>
>>>>         It seems like jextract does not increase the
>>>>         __INCLUDE_LEVEL__ resulting in this error. However, it does
>>>>         seem to define it which makes this more curious.
>>>>         The fix would be to either a) not set it at all or b)
>>>>         correctly increment it when parsing files from an  #include
>>>>         statement.
>>>>
>>>>         For now I have been able to circumvent this by telling
>>>>         jextract to also define __COVERITY__though this is only a
>>>>         very dirty hack and will not work in every instance.
>>>>
>>>>         Cheers,
>>>>         Nils
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/jextract-dev/attachments/20250217/ad636ec4/attachment-0001.htm>


More information about the jextract-dev mailing list