<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>