jextract unable to find limits.h from limits.h

Ty Young youngty1997 at gmail.com
Mon Nov 18 21:11:54 UTC 2019


On 11/18/19 2:14 PM, Jorn Vernee wrote:
> The missing clang headers could be due to a mis-configuration of the 
> build, be sure that with --with-libclang-include-aux points to the 
> $LLVM_ROOT/lib/clang/<version>/include direcoty. You can check if this 
> is already the case by looking at the `CLANG_INCLUDE_AUX_PATH` 
> variable in the build/<config>/spec.gmk file.
>
> The build has been tested to work with the pre-built LLVM bundles at: 
> http://releases.llvm.org/download.html So it would be simplest to 
> install one of those and point the --with-libclang configuration 
> option at the root of the install. I've also tested with a clang 
> distro built from sources. The key is the particular directory structure.


Alright, thank you.


>
> The error you are seeing looks like the error caused by a behavioral 
> change of one of the libclang APIs in LLVM 8+. For now, only LLVM 
> version 7 is supported (but there is 
> https://bugs.openjdk.java.net/browse/JDK-8234237 for updating to 9).


To be clear, if v9 headers are specified when compiling from source will 
this fix the errors or will a change in the JDK source itself be required?


>
> Jorn
>
> On 18/11/2019 18:22, Ty Young wrote:
>>
>> On 11/18/19 4:43 AM, Jorn Vernee wrote:
>>> Hi Ty,
>>>
>>> Note that it's using # include_next <limits.h> there, in other words 
>>> it's trying to find the next limits.h file on the include path, and 
>>> presumably throwing an error because there is none.
>>>
>>> What I'm confused about is that it should be picking up the clang 
>>> header that is bundled with jextract instead, which just does:
>>>
>>> /* The system's limits.h may, in turn, try to #include_next GCC's 
>>> limits.h.
>>>    Avert this #include_next madness. */
>>> #if defined __GNUC__ && !defined _GCC_LIMITS_H_
>>> #define _GCC_LIMITS_H_
>>> #endif
>>>
>>> If I do a similar jextract run (albeit on Windows) with the latest 
>>> snapshot I don't get the same error :/
>>>
>>> You could:
>>> 1.) Add `--log INFO` to the command and check whether the 
>>> $JDK/conf/jextract directory is being included
>>> 2.) Check whether that directory actually exists and contains a 
>>> bunch of header files.
>>
>>
>> Right, so after looking into conf/jextract it looks like if you build 
>> a Panama JDK from source yourself the Clang headers aren't included 
>> for some reason. How do you include the headers with the build?
>>
>>
>> ...However after copying the headers from the EA build into the 
>> custom compiled version it still fails:
>>
>>
>> WARNING: Some library names could not be resolved
>> WARNING: can not compute layout for type Type{ spelling=struct 
>> libusb_bos_dev_capability_descriptor, kind=Record } with flexible 
>> array member. Emitting undefined layout reference.
>> WARNING: can not compute layout for type Type{ spelling=struct 
>> libusb_bos_descriptor, kind=Record } with flexible array member. 
>> Emitting undefined layout reference.
>> WARNING: can not compute layout for type Type{ spelling=struct 
>> libusb_transfer, kind=Record } with flexible array member. Emitting 
>> undefined layout reference.
>> Ignoring duplicate symbol: ITIMER_REAL
>> Ignoring duplicate symbol: ITIMER_VIRTUAL
>> Ignoring duplicate symbol: ITIMER_PROF
>> Cannot write source file org.linux.libusb.bits.thread_shared_types_h, 
>> cause: jdk.internal.clang.TypeLayoutError: InvalidFieldName. type: 
>> Type{ spelling=struct __pthread_cond_s, kind=Record }, fieldName: __low
>> Tree causing above exception is: __pthread_cond_s
>>   ------------------------
>>   Cursor: __pthread_cond_s
>>   Kind: StructDecl
>>   Location: /usr/include/bits/thread-shared-types.h at 171:8
>>   Is system header? true
>>   Is from main file? false
>>   == Type ==
>>   Type: struct __pthread_cond_s
>>   Type Kind: Record
>>   Declared by cursor: __pthread_cond_s of kind StructDecl
>>   Location: /usr/include/bits/thread-shared-types.h at 171:8
>>   Is system header? true
>>   Is from main file? false
>>   Declaring cursor is definition? true
>>   Size: 48 bytes
>>   Is this cursor definition? true
>>
>> Exception in thread "main" java.lang.RuntimeException: In memory 
>> compilation failed: /org/linux/libusb/bits/pthreadtypes_h.java:424: 
>> error: cannot find symbol
>>         public 
>> org.linux.libusb.bits.thread_shared_types_h.__pthread_cond_s 
>> __data$get();
>>                                                           ^
>>   symbol:   class __pthread_cond_s
>>   location: interface thread_shared_types_h
>> /org/linux/libusb/bits/pthreadtypes_h.java:427: error: cannot find 
>> symbol
>>         public void 
>> __data$set(org.linux.libusb.bits.thread_shared_types_h.__pthread_cond_s 
>> value);
>> ^
>>   symbol:   class __pthread_cond_s
>>   location: interface thread_shared_types_h
>> /org/linux/libusb/bits/pthreadtypes_h.java:430: error: cannot find 
>> symbol
>>         public 
>> java.foreign.memory.Pointer<org.linux.libusb.bits.thread_shared_types_h.__pthread_cond_s> 
>> __data$ptr();
>> ^
>>   symbol:   class __pthread_cond_s
>>   location: interface thread_shared_types_h
>> 3 errors
>>
>>     at 
>> jdk.jextract/com.sun.tools.jextract.InMemoryJavaCompiler.compile(InMemoryJavaCompiler.java:59)
>>     at 
>> jdk.jextract/com.sun.tools.jextract.Writer.ensureSourcesCompiled(Writer.java:49)
>>     at 
>> jdk.jextract/com.sun.tools.jextract.Writer.writeJar(Writer.java:115)
>>     at 
>> jdk.jextract/com.sun.tools.jextract.Main.runInternal(Main.java:342)
>>     at jdk.jextract/com.sun.tools.jextract.Main.run(Main.java:211)
>>     at jdk.jextract/com.sun.tools.jextract.Main.main(Main.java:352)
>>
>>
>>
>>>
>>> Jorn
>>>
>>> On 18/11/2019 03:04, Ty Young wrote:
>>>> Hi,
>>>>
>>>>
>>>> I tried generating bindings for libusb using:
>>>>
>>>>
>>>> jextract -t org.linux.libusb -L /usr/lib -llibusb-1.0 
>>>> --record-library-path /usr/include/libusb-1.0/libusb.h -o 
>>>> org.linux.libusb
>>>>
>>>>
>>>> but am met with:
>>>>
>>>>
>>>> java.lang.RuntimeException: /usr/include/limits.h:124:16: fatal 
>>>> error: 'limits.h' file not found
>>>>
>>>>
>>>> Which is odd: jextract can't find the file causing the error while 
>>>> reading from the file it's throwing an error about.
>>>>
>>>>
>>>> This is the line's code + comment:
>>>>
>>>>
>>>>  /* Get the compiler's limits.h, which defines almost all the ISO 
>>>> constants.
>>>>
>>>>     We put this #include_next outside the double inclusion check 
>>>> because
>>>>     it should be possible to include this file more than once and 
>>>> still get
>>>>     the definitions from gcc's header.  */
>>>> #if defined __GNUC__ && !defined _GCC_LIMITS_H_
>>>> /* `_GCC_LIMITS_H_' is what GCC's file defines.  */
>>>> # include_next <limits.h>
>>>> #endif
>>>>
>>>>
>>>> Is this a jextract bug or am I doing something wrong?
>>>>


More information about the panama-dev mailing list