<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">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"><u></u>
<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>