<AWT Dev> RFR (XL): JDK-8204572 SetupJdkLibrary should setup SRC and -I flags automatically

Erik Joelsson erik.joelsson at oracle.com
Fri Jun 8 15:37:10 UTC 2018

Looks good.


On 2018-06-08 01:50, Magnus Ihse Bursie wrote:
> On 2018-06-07 23:20, Erik Joelsson wrote:
>> Hello Magnus,
>> Very nice refactoring!
> Thanks!
>> JdkNativeCompilation.gmk
>> line 126-127 looks a bit long. There is an extra space on 126. Also, 
>> why not addprefix for adding -I instead of clunky foreach? Not that I 
>> care greatly, but I usually prefer that construct.
> Yeah, I agree, addprefix is better. I just forgot about it; foreach is 
> a nice allround tool.
> Updated webrev: 
> http://cr.openjdk.java.net/~ihse/JDK-8204572-autodetect-SRC-and-headers-dirs/webrev.02/
> (Only changes is in JdkNativeCompilation.gmk, as per above comments).
> /Magnus
>> Otherwise looks good.
>> /Erik
>> On 2018-06-07 13:22, Magnus Ihse Bursie wrote:
>>> This change needs some background information.
>>> I've been working on simplifying and streamlining the compilation of 
>>> native libraries of the JDK. Previously, I introduced the 
>>> SetupJdkLibrary function, and started to get a better control of 
>>> compiler flags. This patch continues on both paths.
>>> The original intent of this change, which I naively thought was 
>>> going to be much simpler than it turned out :-) was to separate the 
>>> -I flags (location of header files) from other flags, and to 
>>> generate these automatically, wherever possible. Since we have a 
>>> standard way of locating native code, and most libraries just want 
>>> to have an -I path to their own source base and the generated Java 
>>> header, we should be able to provide this in SetupJdkLibrary.
>>> This turned out to be closely related to SetupJdkLibrary being able 
>>> to discover the location of the SRC directories itself, using 
>>> "convention over configuration" and assuming that the library 
>>> "libfoo" for "java.module" would be located in 
>>> java.module/*/native/libfoo.
>>> While this sounds simple in theory, when actually trying to 
>>> implement this I of course ran into all the places where some 
>>> special handling was indeed needed. So even if like 90% of all 
>>> libraries were simple to get to build using automated discovery of 
>>> source and header directories, the 10% that did not caused me much 
>>> more headaches than I had anticipated. On the other hand, now that 
>>> I've sorted out all those places, the few remaining odd solutions is 
>>> clearly documented and not just something that "just happens" due to 
>>> strange configurations.
>>> One file deserves mentioning specifically: Awt2dLibraries.gmk. The 
>>> java.desktop libraries are unfortunately quite entangled with each 
>>> other, and do not readily follow the patterns that are used 
>>> elsewhere in the code base. So it might just look like the file has 
>>> just gone from one state of messiness, to another, which would 
>>> hardly be an improvement. :-( I would still argue that the new 
>>> messiness is better: It is now much clearer in what ways the 
>>> libraries diverge from our standard assumption, and what course of 
>>> action needs to be taken to minimize these differences. (Which is 
>>> something I believe should be done -- these issues are not just 
>>> cosmetic but is the root of most of the issues we always see for 
>>> these libraries, when upgrading compilers, etc.)
>>> During this change, I noticed that not all native libraries include 
>>> the proper generated header file. This is a dangerous coding 
>>> practice, since a change in the Java part of the interface might not 
>>> get picked up properly in the native part. I've added the missing 
>>> includes that I've detected, and due to these changes, I'm also 
>>> including the component teams in what is really only a build change. 
>>> As can be seen for jdk.crypto.mscapi; there had indeed been changes 
>>> that needed correcting.
>>> Since this is (basically) a pure build change, my gold standard here 
>>> has been the build compare script. In essence, the build output 
>>> prior to my change and with this change are 100% identical. In 
>>> truth, this is a bit too strong a claim. A few changes has occurred, 
>>> but none of them should matter. Here's a breakdown of the compare.sh 
>>> results:
>>> * Windows-x64:
>>> No differences at all.
>>> * Solaris:
>>> Two libraries are reported to differ: libsaproc.so and 
>>> libfontmanager.so, both with a disass diff on ~700 bytes. Analyzing 
>>> this, I found that the object files used to link these two libraries 
>>> has no disass differences. They have a slight binary difference and 
>>> a difference in size, due to the include paths being different (and 
>>> this is stored in the .o file, which makes it different). Somehow 
>>> this apparently triggers the linker to generate a slightly different 
>>> code in a few places, using a different register or so. (Weird...)
>>> * MacOS:
>>> Two libraries are reported to differ: libjava.dylib and 
>>> libmlib_image.dylib, both of them just reported as a binary diff (no 
>>> symbol, disass or fulldump differences). This is not really 
>>> unsuspected, but I analyzed it anyway.
>>> I found that for libjava.dylib, a single .o file was different. This 
>>> one was actually picked up from closed sources, and are not really 
>>> relevant for OpenJDK. Anyway, the reason for the difference was the 
>>> same as for the Solaris libs; the include paths had changes, which 
>>> caused a binary diff.
>>> For libmlib_image.dylib, the link order had changed causing the 
>>> noted binary difference.
>>> * Linux:
>>> On linux, the compare script noted differences for libextnet, 
>>> libjava, libmlib_image, libprefs, libsaproc, libsplashscreen and 
>>> libsunec.
>>> The differences for libextnet, libprefs, libsplashscreen and 
>>> libsunec turned out to be caused by the added #include of the 
>>> generated Java headers. This caused binary differences (reasonably), 
>>> and for some odd reason also a symbol difference in 
>>> java_awt_SplashScreen.o (clazz.10057 and mid.10058 were replaced by 
>>> clazz.10015 and mid.10016). I can't claim to understand this, but 
>>> I'm assuming it's some kind of generated code.
>>> libsaproc and libjava changes was caused by closed source changes, 
>>> and is therefore not relevant to OpenJDK.
>>> For libmlib_image.dylib, the link order had changed causing the 
>>> noted binary difference, as on MacOS.
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8204572
>>> WebRev: 
>>> http://cr.openjdk.java.net/~ihse/JDK-8204572-autodetect-SRC-and-headers-dirs/webrev.01
>>> /Magnus

More information about the awt-dev mailing list