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

Reply via email to