<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>Looking at the code, we already unconditionally generate an
intermediate header file [1]. So this should already work on the
latest version of jextract.<br>
</p>
<p>Jorn<br>
</p>
<p>[1]:
<a class="moz-txt-link-freetext" href="https://github.com/openjdk/jextract/blob/7ed79ecdf678db804f40b3494b6f1dafa760c808/src/main/java/org/openjdk/jextract/JextractTool.java#L110">https://github.com/openjdk/jextract/blob/7ed79ecdf678db804f40b3494b6f1dafa760c808/src/main/java/org/openjdk/jextract/JextractTool.java#L110</a><br>
</p>
<div class="moz-cite-prefix">On 17-2-2025 14:00, Maurizio Cimadamore
wrote:<br>
</div>
<blockquote type="cite" cite="mid:a22a9468-5534-466f-9733-28f1f1cab7bf@oracle.com">
<p>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.</p>
<p>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.</p>
<p>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).</p>
<p>Maurizio<br>
</p>
<p><br>
</p>
<p><br>
</p>
<div class="moz-cite-prefix">On 15/02/2025 16:46, Nils Kattenbeck
wrote:<br>
</div>
<blockquote type="cite" cite="mid:CAKkJDRdW5d=OniJhO-icJTSe6fQQUNCJjCirh4eZi-0AGuJ_qQ@mail.gmail.com">
<div dir="ltr">
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Hi Jorn,</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">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 <span style="font-family:monospace">sd-daemon.h</span> file
seems to fix the problem.</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">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.</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Cheers, Nils</div>
</div>
<br>
<div class="gmail_quote gmail_quote_container">
<div dir="ltr" class="gmail_attr">On Fri, Feb 14, 2025 at
11:46 PM Jorn Vernee <<a href="mailto:jorn.vernee@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">jorn.vernee@oracle.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Hey Nils,</p>
<p>Jextract uses clang under the hood to do the parsing,
so it is clang that is managing the <font face="monospace">__INCLUDE_LEVEL__</font> value, and
I'm assuming it does that correctly.<br>
</p>
<p>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).<br>
</p>
<p>I think another way to work around this would be to
create a wrapper header file in which you <font face="monospace">#include sd-deamon.h</font>, and then
pass that wrapper header file to jextract.<br>
</p>
<p>Jorn<br>
</p>
<div>On 13-2-2025 17:51, Nils Kattenbeck wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Dear
all,</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">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:</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(24,24,178);background-color:rgb(255,255,255)">../jextract-21/bin/jextract
</span><span style="color:rgb(24,178,178);background-color:rgb(255,255,255)">--source
-t foo.bar </span><span style="color:rgb(24,178,178);background-color:rgb(255,255,255)">/usr/include/systemd/sd-daemon.h</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">WARNING: A
restricted method in
java.lang.foreign.AddressLayout has been called</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">WARNING:
java.lang.foreign.AddressLayout::withTargetLayout
has been called by module org.openjdk.jextract</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">WARNING: Use
--enable-native-access=org.openjdk.jextract to
avoid a warning for this module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">/usr/include/systemd/_sd-common.h:23:4:
error: "Do not include _sd-common.h directly; it
is a private header."</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"></span></span><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif">which
comes down to the following preprocessor code in
_sd-common.h (which is included by sd-daemon.h):</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</div>
<div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">#if
defined(__INCLUDE_LEVEL__) &&
__INCLUDE_LEVEL__ <= 1 &&
!defined(__COVERITY__)</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"># error "Do
not include _sd-common.h directly; it is a
private header."</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><br>
<span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">#endif</span><br>
</span></div>
<br>
<div><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">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.</span></div>
<div><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">The
fix would be to either a) not set it at all or b)
correctly increment it when parsing files from an
#include statement.</span></div>
<div><span class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</span></div>
<div><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">For
now I have been able to circumvent this by telling
jextract to also define </span><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">__COVERITY__<span class="gmail_default" style="font-family:arial,helvetica,sans-serif">
though this is only a very dirty hack and will
not work in every instance.</span></span></span></div>
<div><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"><span class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br>
</span></span></span></div>
<div><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">Cheers,</span></span></span></div>
<div><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"><span class="gmail_default" style="font-family:arial,helvetica,sans-serif">Nils</span></span></span></div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</blockquote>
</body>
</html>