[foreign] RFR 8220544: Jextract; library dependent header filtering
Jorn Vernee
jbvernee at xs4all.nl
Fri Mar 15 18:21:54 UTC 2019
Heh - was writing an email pretty much with this suggestion :P
I think this is a good idea! If you don't think this adds to much
complexity to the options?
So we'd basically have:
Without --include/exclude-header -> same behavior we have right now.
With --include/exclude-header -> Add included headers to root set +
find any dependencies, and put both in the generated artifact.
I like that it does no filtering by default, so ad-hoc users don't have
to figure out which header files define which functions.
Jorn
Maurizio Cimadamore schreef op 2019-03-15 19:07:
> On 15/03/2019 18:01, Maurizio Cimadamore wrote:
>>
>> On 15/03/2019 17:48, Jorn Vernee wrote:
>>> I've implemented this, and now doing a clean build based on the
>>> latest jdk/jdk merge before submitting the next webrev.
>>>
>>> It's working nicely, with one caveat; Some headers rely on
>>> pre-processor code defined in a parent header. For instance, Python.h
>>> defines some pre-processor code used in pythonrun.h . The example we
>>> have only uses functions defined in pythonrun.h, but if we just pass
>>> that header to jextract Clang throws an error because of the missing
>>> pre-processor code from Python.h
>>>
>>> In this case we have to pass Python.h first, and then pythonrun.h to
>>> get everything to work. This also relies on the existence of header
>>> include guards in the pythonrun.h header (since we're basically
>>> including it twice). A similar caveat exists with the Windows API.
>>
>> Doh! Maybe I've missed the simplest option after all.
>>
>> What if the root set was a 'first class' concept in the extraction
>> run, rather than something we infer from this or than command line
>> option?
>>
>> That way we could point jextract at python.h, but then say "hey, I'm
>> only really interested at stuff that comes from pythonrun.h".
>
> In other words, right now we have
>
> --include-symbol
>
> and
>
> --exclude-symbol
>
> If not set, everything is included.
>
> Maybe all we need is:
>
> --include-header <header>
>
> --exclude-header <header>
>
> And, again, if none is specified, all headers are part of the 'root
> set'.
>
> And, to address a concern you had - yes, I'd consider using the
> 'include path' for header names in --include/exclude-header
>
> Maurizio
>
>>
>> Maurizio
>>
>>>
>>> So, the guide-line is: Pass the main header first, then internal
>>> headers. e.g. If we have a main header A.h which includes a_impl.h,
>>> and another main header B.h which includes b_impl.h, headers should
>>> be passed to jextract in the order: A.h a_impl.h B.h b_impl.h
>>>
>>> I think the behavior being dependent on the ordering of the headers
>>> could be fixed by sorting the headers in topological order. But,
>>> there's still the requirement to pass all of them, or things break.
>>>
>>> Any thoughs about that?
>>>
>>> Thanks,
>>> Jorn
>>>
>>>
>>> Jorn Vernee schreef op 2019-03-15 14:40:
>>>> I've already been using shell scripts mostly when running jextract
>>>> (except for simple examples). I find it very useful to be able to
>>>> split the command over multiple lines, especially long file paths
>>>> become much more readable.
>>>>
>>>> I'll start working on this then.
>>>>
>>>> Jorn
>>>>
>>>> Maurizio Cimadamore schreef op 2019-03-15 14:21:
>>>>> On 15/03/2019 13:15, Jorn Vernee wrote:
>>>>>> I still like this approach, and I think adding support for
>>>>>> wildcard patterns and/or header filters would make it better.
>>>>>>
>>>>>> Like you said: It's dead simple. What you pass to jextract is what
>>>>>> you get. Though, we could still apply dependency analysis, which
>>>>>> would make sure nothing that's needed gets dropped.
>>>>>
>>>>> Why don't we try this then?
>>>>>
>>>>> Note that in javac we often use this trick:
>>>>>
>>>>> javac `find <path> -name *.java`
>>>>>
>>>>> which works
>>>>>
>>>>> also, note that jextract also accepts a file with the @ syntax,
>>>>> etc.
>>>>>
>>>>> jextract @args.txt
>>>>>
>>>>> where args.txt is the command line (which could list all the
>>>>> headers you want!).
>>>>>
>>>>> Maybe this is indeed the simpler approach.
>>>>>
>>>>> Maurizio
More information about the panama-dev
mailing list