<div dir="ltr">Another point that I missed is: when specifying a directory path for -include-dir, the docs don't say if the search is recursive (searches also within folders with the directory).</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Oct 9, 2022 at 1:50 AM Nir Lisker <<a href="mailto:nlisker@gmail.com">nlisker@gmail.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 dir="ltr">Hi Maurizio,<div><br></div><div>Yes, this is much clearer! I didn't see the PR or I would have noted a few points there. I'll do it here now:</div><div><br></div><div>1. For macro, the Option column is great, but the Meaning column is cryptic: "define to (or 1 if omitted)", to what? 1 what?</div><div>2. For --library, I would write in the Meaning column what file types are accepted. I believe they are only .dll, .so, and .dylib. If this is obvious then you can ignore this point.</div><div>3. Since --include-dir in its Option column specifically specifies <dir> (which is great!), I would think about being specific like that in the other options too. --library uses <path> that actually means <file> (although you show this in the example under Meaning); --output uses <path> that means <dir>, although this one is rather obvious because there's no other option; --dump-includes specifies <String>, but is it just a name or a can it be a whole path? (The example below shows how to use it with a name.)</div><div><br></div><div>On the interfacing side, I'm still stuck with the issue of dependencies. While I can compile with jextract's javac and pointing to the jmods of the JDK, I can't do it during runtime (execution of 'java'). I'm still using a Process with streams in the meantime.</div><div><br></div><div>Thanks,</div><div>Nir</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Oct 9, 2022 at 12:02 AM Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" target="_blank">maurizio.cimadamore@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>Hi Nir,<br>
we have made some tweaks to the command line option description:</p>
<p><a href="https://github.com/openjdk/jextract/tree/panama" target="_blank">https://github.com/openjdk/jextract/tree/panama</a></p>
<p>Hopefully that should reflect some of the discussion in this
thread.</p>
<p>Thanks<br>
Maurizio<br>
</p>
<p><br>
</p>
<div>On 06/10/2022 20:43, Nir Lisker wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>I tried the workaround. Compilation is fine, but
during runtime I get:</div>
<div><br>
</div>
<div>Error occurred during initialization of boot layer<br>
java.lang.module.FindException: Module java.desktop not found<br>
</div>
<div><br>
</div>
<div>What is the run command that adds all the jdk modules?</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Thu, Oct 6, 2022 at 8:35
AM Sundararajan Athijegannathan <<a href="mailto:sundararajan.athijegannathan@oracle.com" target="_blank">sundararajan.athijegannathan@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>
<div dir="ltr">
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">Binary
download of jextract does not include
org.openjdk.jextract.jmod file (although that is part
of jextract build folder).</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">For
now, you can workaround using the following:</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">$
cat Main.java<span> </span></span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">import
org.openjdk.jextract.*;</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">import
java.awt.*;</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0);min-height:16px">
<span style="font-variant-ligatures:no-common-ligatures"></span><br>
</p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">class
Main {</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span>
</span>public static void main(String[] a) {</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span>
</span>System.out.println(Frame.class);</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span>
</span>System.out.println(JextractTool.class);</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><span>
</span>}</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">}</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><br>
</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">#
assume that the current directory is "bin" dir of </span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">#
jextract tool. </span>It has a javac executable in
it.</p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)">#
We use jextract's javac but pass module-path for
the </p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)">#
other jdk modules not included in jextract jdk
image.</p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures"><br>
</span></p>
<p style="margin:0px;font:14px Menlo;color:rgb(0,0,0)"><span style="font-variant-ligatures:no-common-ligatures">$
./javac --module-path
/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home/jmods
--add-modules java.desktop --enable-preview
--source 19<span>
</span>Main.java</span></p>
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">If
you're okay with building jextract from the sources,
then you use JDK 19's javac with the following option:</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">--module-path
$JEXTRACT_REPO/build/jmods</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)">[That
directory <span style="background-color:rgb(255,255,255);display:inline">$JEXTRACT_REPO/build/jmods
contains org.openjdk.jextract.jmod module file]</span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><span style="background-color:rgb(255,255,255);display:inline"><br>
</span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><span style="background-color:rgb(255,255,255);display:inline"><br>
</span></div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif;font-size:12pt;color:rgb(0,0,0)"><span style="background-color:rgb(255,255,255);display:inline">-Sundar</span></div>
<hr style="display:inline-block;width:98%">
<div id="m_7573790647145401329m_-7986351450041717693m_-8229116754328253435m_491107031550747698divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri,
sans-serif" color="#000000"><b>From:</b>
jextract-dev <<a href="mailto:jextract-dev-retn@openjdk.org" target="_blank">jextract-dev-retn@openjdk.org</a>>
on behalf of Nir Lisker <<a href="mailto:nlisker@gmail.com" target="_blank">nlisker@gmail.com</a>><br>
<b>Sent:</b> 06 October 2022 07:51<br>
<b>To:</b> Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" target="_blank">maurizio.cimadamore@oracle.com</a>><br>
<b>Cc:</b> <a href="mailto:jextract-dev@openjdk.org" target="_blank">jextract-dev@openjdk.org</a>
<<a href="mailto:jextract-dev@openjdk.org" target="_blank">jextract-dev@openjdk.org</a>><br>
<b>Subject:</b> Re: GUI wrapper for jextract</font>
<div> </div>
</div>
<div>
<div dir="ltr">Yes, if I can interface with the tool
directly it would be ideal.
<div><br>
</div>
<div>How can I add jextract as an external
dependency for this? The jextract build is not a
full jdk, and I'm running on jdk-19.</div>
</div>
<br>
<div>
<div dir="ltr">On Tue, Oct 4, 2022 at 12:19 PM
Maurizio Cimadamore <<a href="mailto:maurizio.cimadamore@oracle.com" target="_blank">maurizio.cimadamore@oracle.com</a>>
wrote:<br>
</div>
<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Hi Nir,<br>
</p>
<div>On 02/10/2022 22:31, Nir Lisker wrote:<br>
</div>
<blockquote type="cite">
<div>5. When analyzing the symbols of a header
using the dump option, I need to read the
file that jextract creates from disk and
then delete it. Is there a way to read the
jextract output directly? Either through the
output stream, or writing to a file in
memory? Dealing with disk I/O is cumbersome,
comes with permission restrictions, and
might be slow if done for many files in a
batch.</div>
</blockquote>
<p>I think ultimately, working with files might
be not ideal for your use case.</p>
<p>There is a pseudo-stable API to parse
jextract files, in the JextractTool class (in
the org.openjdk.jextract package, which should
be exported by the jextract module):</p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">`public
static Declaration.Scoped
parse(List<Path> headers, String...
parserOptions) {`</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">We
do not make any promise (at this stage at
least) on the stability of the API. That
said, it has not changed much (at all?) in
the last couple of years.</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">What
you get back is a "Declaration", which is
used to model vars, structs, unions,
typedefs, functions<br>
</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Then,
attached to declarations, there are "Type"s,
which are used... well, to model types.
Since some type can be structured (e.g. a
struct type), they can point back to their
declaration (e.g. Type.Declared).</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Jextract
does all it does by defining visitors on
this basic declaration tree, which is
obtained by wrapping the results of parsing
a C header using the clang API (e.g. clang
Cursors).<br>
</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">We
did this to "sanitize" the output of clang,
as well as to make our implementation more
robust and less dependent from clang
internals.</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">One
option for you would be to invoke the
parsing process this way, then get the tree
and look at the results (e.g. with a
visitor), which sounds better than parsing
an option file.</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
Cheers<br>
Maurizio<br>
</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></p>
<p><span style="color:rgb(29,28,29);font-family:Slack-Lato,Slack-Fractions,appleLogo,sans-serif;font-size:15px;font-style:normal;font-variant-ligatures:common-ligatures;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:left;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br>
</span></p>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</blockquote></div>
</blockquote></div>