RFR: JDK-8239450 Overhaul JVM feature handling in configure

Erik Joelsson erik.joelsson at oracle.com
Wed Feb 19 15:00:00 UTC 2020


Hello Magnus,

This is certainly a nice improvement. It looks good to me. I have some 
comments on implementation details, but nothing serious enough to 
require a new webrev.

Instead of using "echo $foo | sed 's/,/ /g'", since we know we run in 
bash, could just use ${foo//,/ }. (jvm-features.m4:82)

The $AWK expressions are just copied from the previous implementation, 
so they are probably working ok. I would still recommend using $NAWK to 
increase likelihood of them really working the same across platforms.

jvm-features.m4:370,372-373: wrong indentation

/Erik

On 2020-02-19 04:05, Magnus Ihse Bursie wrote:
> The JVM feature handling in configure needs a complete overhaul. The 
> current logic is hard to understand and to make changes to. The method 
> of enabling features with --with-jvm-features="feature list" means 
> that it is not possible to incrementally add features without throwing 
> away settings done earlier on the command line.
>
> With this patch, the most noticeable effect for normal users is the 
> addition of a group of configure arguments, on the pattern 
> --enable-jvm-feature-<FEATURE>. So, instead of doing e.g. 
> --with-jvm-features="zgc,-dtrace", you can now do 
> --enable-jvm-feature-zgc --disable-jvm-feature-dtrace. The major 
> benefit from this is that it is possible to build up a command line in 
> steps, where a later step enables or disables a feature, without 
> throwing away the settings made earlier (which was what happened if 
> two --with-jvm-features= options were given).
>
> Arguably, this is the way that JVM features should have been 
> implemented all along. There were ever only two reasons for the 
> --with-jvm-features argument list, neither of them particularly good: 
> It allows for simple selection of multiple features (e.g. for the 
> custom variant), and it avoided the complexity in programmatically 
> generating autoconf options in m4.
>
> I have now bit the bullet, and wrangled m4 into doing this. The old 
> way of --with-jvm-features="<list>" is of course still supported, but 
> I think for the most part, the new style is recommended. Some 
> features, e.g. cds, had their own options (--enable-cds) which were 
> weirdly translated into features. These options are now defined as 
> aliases (of e.g. --enable-jvm-feature-cds), and I intend to keep them 
> as such.
>
> Under the hood, much more has changed. There is no longer the 
> schizophrenic split between handling stuff the "old" way or the "new" 
> way using features. All features are handled the same, period. 
> Furthermore, the logic has been cleared up considerably.
>
> First of all, I check if a feature is possible to build on your 
> platform. For instance, CDS is not available on AIX, or dtrace 
> requires proper tooling. If that is the case, it is considered 
> unavailable, and it is an error to try to enable it.
>
> This check is also done on a per-variant basis. Some features are not 
> available on all variants. For instance, the "zero" feature is only 
> available on the "zero" variant.
>
> Secondly, not all available features should be enabled by default -- 
> even if most should be. Therefore, I keep lists of "filtered" features 
> (one for the platform and one per variant). The default for a variant 
> is then calculated as all available features, minus all that are 
> filtered out.
>
> If a user has explicitly enabled a feature, it is added to the list 
> (as long as it is available). If a user has disabled a features, it is 
> removed from the list.
>
> This separation makes it clear if a feature is not built by default 
> because it is not supported, or because it is not recommended (like 
> link-time-opt). This distinction was unclear, to say the least, in the 
> old code.
>
> For platforms that are outside my expertise (like zero and aix), I've 
> done my best to convert the old behavior to this model, but I'd 
> appreciate if someone knowledgeable about the code can verify. Zero, 
> for instance, has a long list of features classified as unavailable, 
> but I'm not sure that this is correct.
>
> Hopefully, the new code base should make it much easier to understand 
> what requirements a certain feature has, and why (if not) it is not 
> built. Also, I hope that adding a new feature in the future would be 
> far easier, by just following the model.
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8239450
> WebRev: 
> http://cr.openjdk.java.net/~ihse/JDK-8239450-overhaul-JVM-features/webrev.01
>
> /Magnus



More information about the build-dev mailing list