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