1 #
   2 # Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.  Oracle designates this
   8 # particular file as subject to the "Classpath" exception as provided
   9 # by Oracle in the LICENSE file that accompanied this code.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 ###############################################################################
  27 # Terminology used in this file:
  28 #
  29 # Valid features      == All possible features that the JVM knows about.
  30 # Deprecated features == Previously known features (not considered valid).
  31 # Available features  == Features that are possible to use in this configuration.
  32 # Default features    == Features that are on by default in this configuration.
  33 # Enabled features    == Features requested by the user to be present.
  34 # Disabled features   == Features excluded from being used by the user.
  35 # Active features     == The exact set of features to be used for a JVM variant.
  36 #
  37 # All valid features are considered available, unless listed as unavailable.
  38 # All available features will be turned on as default, unless listed in a filter.
  39 ###############################################################################
  40 
  41 # We need these as m4 defines to be able to loop over them using m4 later on.
  42 
  43 # All valid JVM features, regardless of platform
  44 m4_define(jvm_features_valid, m4_normalize( \
  45     ifdef([custom_jvm_features_valid], custom_jvm_features_valid) \
  46     \
  47     aot cds compiler1 compiler2 dtrace epsilongc g1gc graal jfr jni-check \
  48     jvmci jvmti link-time-opt management minimal nmt opt-size parallelgc \
  49     serialgc services shenandoahgc static-build vm-structs zero zgc \
  50 ))
  51 
  52 # Deprecated JVM features (these are ignored, but with a warning)
  53 m4_define(jvm_features_deprecated, m4_normalize(
  54     cmsgc trace \
  55 ))
  56 
  57 # Feature descriptions
  58 m4_define(jvm_feature_desc_aot, [enable ahead of time compilation (AOT)])
  59 m4_define(jvm_feature_desc_cds, [enable class data sharing (CDS)])
  60 m4_define(jvm_feature_desc_compiler1, [enable hotspot compiler C1])
  61 m4_define(jvm_feature_desc_compiler2, [enable hotspot compiler C2])
  62 m4_define(jvm_feature_desc_dtrace, [enable dtrace support])
  63 m4_define(jvm_feature_desc_epsilongc, [include the epsilon (no-op) garbage collector])
  64 m4_define(jvm_feature_desc_g1gc, [include the G1 garbage collector])
  65 m4_define(jvm_feature_desc_graal, [enable Graal (jdk.internal.vm.compiler)])
  66 m4_define(jvm_feature_desc_jfr, [enable JDK Flight Recorder (JFR)])
  67 m4_define(jvm_feature_desc_jni_check, [enable -Xcheck:jni support])
  68 m4_define(jvm_feature_desc_jvmci, [enable JVM Compiler Interface (JVMCI)])
  69 m4_define(jvm_feature_desc_jvmti, [enable Java Virtual Machine Tool Interface (JVM TI)])
  70 m4_define(jvm_feature_desc_link_time_opt, [enable link time optimization])
  71 m4_define(jvm_feature_desc_management, [enable java.lang.management API support])
  72 m4_define(jvm_feature_desc_minimal, [support building variant 'minimal'])
  73 m4_define(jvm_feature_desc_nmt, [include native memory tracking (NMT)])
  74 m4_define(jvm_feature_desc_opt_size, [optimize the JVM library for size])
  75 m4_define(jvm_feature_desc_parallelgc, [include the parallel garbage collector])
  76 m4_define(jvm_feature_desc_serialgc, [include the serial garbage collector])
  77 m4_define(jvm_feature_desc_services, [enable diagnostic services and client attaching])
  78 m4_define(jvm_feature_desc_shenandoahgc, [include the Shenandoah garbage collector])
  79 m4_define(jvm_feature_desc_static_build, [build static library instead of dynamic])
  80 m4_define(jvm_feature_desc_vm_structs, [export JVM structures to the Serviceablility Agent])
  81 m4_define(jvm_feature_desc_zero, [support building variant 'zero'])
  82 m4_define(jvm_feature_desc_zgc, [include the Z garbage collector])
  83 
  84 ###############################################################################
  85 # Parse command line options for JVM feature selection. After this function
  86 # has run $JVM_FEATURES_ENABLED, $JVM_FEATURES_DISABLED and $JVM_FEATURES_VALID
  87 # can be used.
  88 #
  89 AC_DEFUN_ONCE([JVM_FEATURES_PARSE_OPTIONS],
  90 [
  91   # Setup shell variables from the m4 lists
  92   UTIL_SORT_LIST(JVM_FEATURES_VALID, "jvm_features_valid")
  93   UTIL_SORT_LIST(JVM_FEATURES_DEPRECATED, "jvm_features_deprecated")
  94 
  95   # For historical reasons, some jvm features have their own, shorter names.
  96   # Keep those as aliases for the --enable-jvm-feature-* style arguments.
  97   UTIL_ALIASED_ARG_ENABLE(aot, --enable-jvm-feature-aot)
  98   UTIL_ALIASED_ARG_ENABLE(cds, --enable-jvm-feature-cds)
  99   UTIL_ALIASED_ARG_ENABLE(dtrace, --enable-jvm-feature-dtrace)
 100 
 101   # First check for features using the
 102   # --with-jvm-features="<[-]feature>[,<[-]feature> ...]" syntax.
 103   AC_ARG_WITH([jvm-features], [AS_HELP_STRING([--with-jvm-features],
 104       [JVM features to enable (foo) or disable (-foo), separated by comma. Use
 105       '--help' to show possible values @<:@none@:>@])])
 106   if test "x$with_jvm_features" != x; then
 107     # Replace ","  with " ".
 108     user_jvm_feature_list=${with_jvm_features//,/ }
 109     JVM_FEATURES_ENABLED=`$ECHO $user_jvm_feature_list | \
 110         $AWK '{ for (i=1; i<=NF; i++) if (!match($i, /^-.*/)) printf("%s ", $i) }'`
 111     JVM_FEATURES_DISABLED=`$ECHO $user_jvm_feature_list | \
 112         $AWK '{ for (i=1; i<=NF; i++) if (match($i, /^-.*/)) printf("%s ", substr($i, 2))}'`
 113 
 114     # Verify that the user has provided only valid (or deprecated) features
 115     UTIL_GET_NON_MATCHING_VALUES(invalid_features, $JVM_FEATURES_ENABLED \
 116         $JVM_FEATURES_DISABLED, $JVM_FEATURES_VALID $JVM_FEATURES_DEPRECATED)
 117     if test "x$invalid_features" != x; then
 118       AC_MSG_NOTICE([Unknown JVM features specified: '$invalid_features'])
 119       AC_MSG_NOTICE([The available JVM features are: '$JVM_FEATURES_VALID'])
 120       AC_MSG_ERROR([Cannot continue])
 121     fi
 122 
 123     # Check if the user has provided deprecated features
 124     UTIL_GET_MATCHING_VALUES(deprecated_features, $JVM_FEATURES_ENABLED \
 125         $JVM_FEATURES_DISABLED, $JVM_FEATURES_DEPRECATED)
 126     if test "x$deprecated_features" != x; then
 127       AC_MSG_WARN([Deprecated JVM features specified (will be ignored): '$deprecated_features'])
 128       # Filter out deprecated features
 129       UTIL_GET_NON_MATCHING_VALUES(JVM_FEATURES_ENABLED, \
 130           $JVM_FEATURES_ENABLED, $deprecated_features)
 131       UTIL_GET_NON_MATCHING_VALUES(JVM_FEATURES_DISABLED, \
 132           $JVM_FEATURES_DISABLED, $deprecated_features)
 133     fi
 134   fi
 135 
 136   # Then check for features using the "--enable-jvm-feature-<feature>" syntax.
 137   # Using m4, loop over all features with the variable FEATURE.
 138   m4_foreach(FEATURE, m4_split(jvm_features_valid), [
 139     # Create an m4 variable containing a shell variable name (like
 140     # "enable_jvm_feature_static_build"), and the description.
 141     m4_define(FEATURE_SHELL, [enable_jvm_feature_]m4_translit(FEATURE, -, _))
 142     m4_define(FEATURE_DESCRIPTION, [jvm_feature_desc_]m4_translit(FEATURE, -, _))
 143 
 144     AC_ARG_ENABLE(jvm-feature-FEATURE, AS_HELP_STRING(
 145         [--enable-jvm-feature-FEATURE], [enable jvm feature 'FEATURE' (FEATURE_DESCRIPTION)]))
 146 
 147     if test "x$FEATURE_SHELL" = xyes; then
 148       JVM_FEATURES_ENABLED="$JVM_FEATURES_ENABLED FEATURE"
 149     elif test "x$FEATURE_SHELL" = xno; then
 150       JVM_FEATURES_DISABLED="$JVM_FEATURES_DISABLED FEATURE"
 151     elif test "x$FEATURE_SHELL" != x; then
 152       AC_MSG_ERROR([Invalid value for --enable-jvm-feature-FEATURE: '$FEATURE_SHELL'])
 153     fi
 154 
 155     m4_undefine([FEATURE_SHELL])
 156     m4_undefine([FEATURE_DESCRIPTION])
 157   ])
 158 
 159   # Likewise, check for deprecated arguments.
 160   m4_foreach(FEATURE, m4_split(jvm_features_deprecated), [
 161     AC_ARG_ENABLE(jvm-feature-FEATURE, AS_HELP_STRING(
 162         [--enable-jvm-feature-FEATURE], 
 163         [Deprecated. Option is kept for backwards compatibility and is ignored]))
 164 
 165     m4_define(FEATURE_SHELL, [enable_jvm_feature_]m4_translit(FEATURE, -, _))
 166 
 167     if test "x$FEATURE_SHELL" != x; then
 168       AC_MSG_WARN([Deprecated JVM feature, will be ignored: --enable-jvm-feature-FEATURE])
 169     fi
 170 
 171     m4_undefine([FEATURE_SHELL])
 172   ])
 173 
 174   # Check if the user has both enabled and disabled a feature
 175   UTIL_GET_MATCHING_VALUES(enabled_and_disabled, $JVM_FEATURES_ENABLED, \
 176       $JVM_FEATURES_DISABLED)
 177   if test "x$enabled_and_disabled" != x; then
 178     AC_MSG_NOTICE([These feature are both enabled and disabled: '$enabled_and_disabled'])
 179     AC_MSG_NOTICE([This can happen if you mix --with-jvm-features and --enable-jvm-feature-*])
 180     AC_MSG_NOTICE([The recommendation is to only use --enable-jvm-feature-*])
 181     AC_MSG_ERROR([Cannot continue])
 182   fi
 183 
 184   # Clean up lists and announce results to user
 185   UTIL_SORT_LIST(JVM_FEATURES_ENABLED, $JVM_FEATURES_ENABLED)
 186   AC_MSG_CHECKING([for JVM features enabled by the user])
 187   if test "x$JVM_FEATURES_ENABLED" != x; then
 188     AC_MSG_RESULT(['$JVM_FEATURES_ENABLED'])
 189   else
 190     AC_MSG_RESULT([none])
 191   fi
 192 
 193   UTIL_SORT_LIST(JVM_FEATURES_DISABLED, $JVM_FEATURES_DISABLED)
 194   AC_MSG_CHECKING([for JVM features disabled by the user])
 195   if test "x$JVM_FEATURES_DISABLED" != x; then
 196     AC_MSG_RESULT(['$JVM_FEATURES_DISABLED'])
 197   else
 198     AC_MSG_RESULT([none])
 199   fi
 200 
 201   # Makefiles use VALID_JVM_FEATURES in check-jvm-feature to verify correctness.
 202   VALID_JVM_FEATURES="$JVM_FEATURES_VALID"
 203   AC_SUBST(VALID_JVM_FEATURES)
 204 ])
 205 
 206 ###############################################################################
 207 # Helper function for the JVM_FEATURES_CHECK_* suite.
 208 # The code in the code block should assign 'false' to the variable AVAILABLE
 209 # if the feature is not available, and this function will handle everything
 210 # else that is needed.
 211 #
 212 # arg 1: The name of the feature to test
 213 # arg 2: The code block to execute
 214 #
 215 AC_DEFUN([JVM_FEATURES_CHECK_AVAILABILITY],
 216 [
 217   # Assume that feature is available
 218   AVAILABLE=true
 219 
 220   # Execute feature test block
 221   $2
 222 
 223   AC_MSG_CHECKING([if JVM feature '$1' is available])
 224   if test "x$AVAILABLE" = "xtrue"; then
 225     AC_MSG_RESULT([yes])
 226   else
 227     AC_MSG_RESULT([no])
 228     JVM_FEATURES_PLATFORM_UNAVAILABLE="$JVM_FEATURES_PLATFORM_UNAVAILABLE $1"
 229   fi
 230 ])
 231 
 232 ###############################################################################
 233 # Check if the feature 'aot' is available on this platform.
 234 #
 235 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_AOT],
 236 [
 237   JVM_FEATURES_CHECK_AVAILABILITY(aot, [
 238     AC_MSG_CHECKING([if platform is supported by AOT])
 239     # AOT is only available where JVMCI is available since it requires JVMCI.
 240     if test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \
 241         test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then
 242       AC_MSG_RESULT([yes])
 243     else
 244       AC_MSG_RESULT([no, $OPENJDK_TARGET_CPU])
 245       AVAILABLE=false
 246     fi
 247 
 248     AC_MSG_CHECKING([if AOT source code is present])
 249     if test -e "${TOPDIR}/src/jdk.internal.vm.compiler" && \
 250         test -e "${TOPDIR}/src/jdk.aot"; then
 251       AC_MSG_RESULT([yes])
 252     else
 253       AC_MSG_RESULT([no, missing src/jdk.internal.vm.compiler or src/jdk.aot])
 254       AVAILABLE=false
 255     fi
 256   ])
 257 ])
 258 
 259 ###############################################################################
 260 # Check if the feature 'cds' is available on this platform.
 261 #
 262 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_CDS],
 263 [
 264   JVM_FEATURES_CHECK_AVAILABILITY(cds, [
 265     AC_MSG_CHECKING([if platform is supported by CDS])
 266     if test "x$OPENJDK_TARGET_OS" != xaix; then
 267       AC_MSG_RESULT([yes])
 268     else
 269       AC_MSG_RESULT([no, $OPENJDK_TARGET_OS])
 270       AVAILABLE=false
 271     fi
 272   ])
 273 ])
 274 
 275 ###############################################################################
 276 # Check if the feature 'dtrace' is available on this platform.
 277 #
 278 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_DTRACE],
 279 [
 280   JVM_FEATURES_CHECK_AVAILABILITY(dtrace, [
 281     AC_MSG_CHECKING([for dtrace tool])
 282     if test "x$DTRACE" != "x" && test -x "$DTRACE"; then
 283       AC_MSG_RESULT([$DTRACE])
 284     else
 285       AC_MSG_RESULT([no])
 286       AVAILABLE=false
 287     fi
 288 
 289     AC_CHECK_HEADERS([sys/sdt.h], [dtrace_headers_ok=true])
 290     if test "x$dtrace_headers_ok" != "xtrue"; then
 291       HELP_MSG_MISSING_DEPENDENCY([dtrace])
 292       AC_MSG_NOTICE([Cannot enable dtrace with missing dependencies. See above.])
 293       AVAILABLE=false
 294     fi
 295   ])
 296 ])
 297 
 298 ###############################################################################
 299 # Check if the feature 'graal' is available on this platform.
 300 #
 301 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_GRAAL],
 302 [
 303   JVM_FEATURES_CHECK_AVAILABILITY(graal, [
 304     AC_MSG_CHECKING([if platform is supported by Graal])
 305     # Graal is only available where JVMCI is available since it requires JVMCI.
 306     if test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \
 307         test "x$OPENJDK_TARGET_CPU" = "xaarch64" ; then
 308       AC_MSG_RESULT([yes])
 309     else
 310       AC_MSG_RESULT([no, $OPENJDK_TARGET_CPU])
 311       AVAILABLE=false
 312     fi
 313   ])
 314 ])
 315 
 316 ###############################################################################
 317 # Check if the feature 'jfr' is available on this platform.
 318 #
 319 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_JFR],
 320 [
 321   JVM_FEATURES_CHECK_AVAILABILITY(jfr, [
 322     AC_MSG_CHECKING([if platform is supported by JFR])
 323     if test "x$OPENJDK_TARGET_OS" = xaix || \
 324         test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-sparcv9"; then
 325       AC_MSG_RESULT([no, $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU])
 326       AVAILABLE=false
 327     else
 328       AC_MSG_RESULT([yes])
 329     fi
 330   ])
 331 ])
 332 
 333 ###############################################################################
 334 # Check if the feature 'jvmci' is available on this platform.
 335 #
 336 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_JVMCI],
 337 [
 338   JVM_FEATURES_CHECK_AVAILABILITY(jvmci, [
 339     AC_MSG_CHECKING([if platform is supported by JVMCI])
 340     if test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \
 341         test "x$OPENJDK_TARGET_CPU" = "xaarch64" ; then
 342       AC_MSG_RESULT([yes])
 343     else
 344       AC_MSG_RESULT([no, $OPENJDK_TARGET_CPU])
 345       AVAILABLE=false
 346     fi
 347   ])
 348 ])
 349 
 350 ###############################################################################
 351 # Check if the feature 'shenandoahgc' is available on this platform.
 352 #
 353 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_SHENANDOAHGC],
 354 [
 355   JVM_FEATURES_CHECK_AVAILABILITY(shenandoahgc, [
 356     AC_MSG_CHECKING([if platform is supported by Shenandoah])
 357     if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86" || \
 358         test "x$OPENJDK_TARGET_CPU" = "xaarch64" ; then
 359       AC_MSG_RESULT([yes])
 360     else
 361       AC_MSG_RESULT([no, $OPENJDK_TARGET_CPU])
 362       AVAILABLE=false
 363     fi
 364   ])
 365 ])
 366 
 367 ###############################################################################
 368 # Check if the feature 'static-build' is available on this platform.
 369 #
 370 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_STATIC_BUILD],
 371 [
 372   JVM_FEATURES_CHECK_AVAILABILITY(static-build, [
 373     AC_MSG_CHECKING([if static-build is enabled in configure])
 374     if test "x$STATIC_BUILD" = "xtrue"; then
 375       AC_MSG_RESULT([yes])
 376     else
 377       AC_MSG_RESULT([no, use --enable-static-build to enable static build.])
 378       AVAILABLE=false
 379     fi
 380   ])
 381 ])
 382 
 383 ###############################################################################
 384 # Check if the feature 'zgc' is available on this platform.
 385 #
 386 AC_DEFUN_ONCE([JVM_FEATURES_CHECK_ZGC],
 387 [
 388   JVM_FEATURES_CHECK_AVAILABILITY(zgc, [
 389     AC_MSG_CHECKING([if platform is supported by ZGC])
 390     if test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then
 391       if test "x$OPENJDK_TARGET_OS" = "xlinux" || \
 392           test "x$OPENJDK_TARGET_OS" = "xwindows" || \
 393           test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
 394         AC_MSG_RESULT([yes])
 395       else
 396         AC_MSG_RESULT([no, $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU])
 397         AVAILABLE=false
 398       fi
 399     elif test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-aarch64"; then
 400       AC_MSG_RESULT([yes])
 401     else
 402       AC_MSG_RESULT([no, $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU])
 403       AVAILABLE=false
 404     fi
 405 
 406     if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
 407       AC_MSG_CHECKING([if Windows APIs required for ZGC is present])
 408       AC_COMPILE_IFELSE(
 409         [AC_LANG_PROGRAM([[#include <windows.h>]],
 410           [[struct MEM_EXTENDED_PARAMETER x;]])
 411         ],
 412         [
 413           AC_MSG_RESULT([yes])
 414         ],
 415         [
 416           AC_MSG_RESULT([no, missing required APIs])
 417           AVAILABLE=false
 418         ]
 419       )
 420     fi
 421   ])
 422 ])
 423 
 424 ###############################################################################
 425 # Setup JVM_FEATURES_PLATFORM_UNAVAILABLE and JVM_FEATURES_PLATFORM_FILTER
 426 # to contain those features that are unavailable, or should be off by default,
 427 # for this platform, regardless of JVM variant.
 428 #
 429 AC_DEFUN_ONCE([JVM_FEATURES_PREPARE_PLATFORM],
 430 [
 431   # The checks below should add unavailable features to
 432   # JVM_FEATURES_PLATFORM_UNAVAILABLE.
 433 
 434   JVM_FEATURES_CHECK_AOT
 435   JVM_FEATURES_CHECK_CDS
 436   JVM_FEATURES_CHECK_DTRACE
 437   JVM_FEATURES_CHECK_GRAAL
 438   JVM_FEATURES_CHECK_JFR
 439   JVM_FEATURES_CHECK_JVMCI
 440   JVM_FEATURES_CHECK_SHENANDOAHGC
 441   JVM_FEATURES_CHECK_STATIC_BUILD
 442   JVM_FEATURES_CHECK_ZGC
 443 
 444   # Filter out features by default for all variants on certain platforms.
 445   # Make sure to just add to JVM_FEATURES_PLATFORM_FILTER, since it could
 446   # have a value already from custom extensions.
 447   if test "x$OPENJDK_TARGET_OS" = xaix; then
 448     JVM_FEATURES_PLATFORM_FILTER="$JVM_FEATURES_PLATFORM_FILTER jfr"
 449   fi
 450 
 451   if test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-sparcv9"; then
 452     JVM_FEATURES_PLATFORM_FILTER="$JVM_FEATURES_PLATFORM_FILTER jfr"
 453   fi
 454 ])
 455 
 456 ###############################################################################
 457 # Setup JVM_FEATURES_VARIANT_UNAVAILABLE and JVM_FEATURES_VARIANT_FILTER
 458 # to contain those features that are unavailable, or should be off by default,
 459 # for this particular JVM variant.
 460 #
 461 # arg 1: JVM variant
 462 #
 463 AC_DEFUN([JVM_FEATURES_PREPARE_VARIANT],
 464 [
 465   variant=$1
 466 
 467   # Check which features are unavailable for this JVM variant.
 468   # This means that is not possible to build these features for this variant.
 469   if test "x$variant" = "xminimal"; then
 470     JVM_FEATURES_VARIANT_UNAVAILABLE="cds zero"
 471   elif test "x$variant" = "xcore"; then
 472     JVM_FEATURES_VARIANT_UNAVAILABLE="cds minimal zero"
 473   elif test "x$variant" = "xzero"; then
 474     JVM_FEATURES_VARIANT_UNAVAILABLE="aot cds compiler1 compiler2 \
 475         epsilongc g1gc graal jvmci minimal shenandoahgc zgc"
 476   else
 477     JVM_FEATURES_VARIANT_UNAVAILABLE="minimal zero"
 478   fi
 479 
 480   # Check which features should be off by default for this JVM variant.
 481   if test "x$variant" = "xclient"; then
 482     JVM_FEATURES_VARIANT_FILTER="aot compiler2 graal jvmci link-time-opt opt-size"
 483   elif test "x$variant" = "xminimal"; then
 484     JVM_FEATURES_VARIANT_FILTER="aot cds compiler2 dtrace epsilongc g1gc \
 485         graal jfr jni-check jvmci jvmti management nmt parallelgc services \
 486         shenandoahgc vm-structs zgc"
 487     if test "x$OPENJDK_TARGET_CPU" = xarm ; then
 488       JVM_FEATURES_VARIANT_FILTER="$JVM_FEATURES_VARIANT_FILTER opt-size"
 489     else
 490       # Only arm-32 should have link-time-opt enabled as default.
 491       JVM_FEATURES_VARIANT_FILTER="$JVM_FEATURES_VARIANT_FILTER \
 492           link-time-opt"
 493     fi
 494   elif test "x$variant" = "xcore"; then
 495     JVM_FEATURES_VARIANT_FILTER="aot compiler1 compiler2 graal jvmci \
 496         link-time-opt opt-size"
 497   elif test "x$variant" = "xzero"; then
 498     JVM_FEATURES_VARIANT_FILTER="jfr link-time-opt opt-size"
 499   else
 500     JVM_FEATURES_VARIANT_FILTER="link-time-opt opt-size"
 501   fi
 502 ])
 503 
 504 ###############################################################################
 505 # Calculate the actual set of active JVM features for this JVM variant. Store
 506 # the result in JVM_FEATURES_ACTIVE.
 507 #
 508 # arg 1: JVM variant
 509 #
 510 AC_DEFUN([JVM_FEATURES_CALCULATE_ACTIVE],
 511 [
 512   variant=$1
 513 
 514   # The default is set to all valid features except those unavailable or listed
 515   # in a filter.
 516   if test "x$variant" != xcustom; then
 517     UTIL_GET_NON_MATCHING_VALUES(default_for_variant, $JVM_FEATURES_VALID, \
 518         $JVM_FEATURES_PLATFORM_UNAVAILABLE $JVM_FEATURES_VARIANT_UNAVAILABLE \
 519         $JVM_FEATURES_PLATFORM_FILTER $JVM_FEATURES_VARIANT_FILTER)
 520   else
 521     # Except for the 'custom' variant, where the default is to start with an
 522     # empty set.
 523     default_for_variant=""
 524   fi
 525 
 526   # Verify that explicitly enabled features are available
 527   UTIL_GET_MATCHING_VALUES(enabled_but_unavailable, $JVM_FEATURES_ENABLED, \
 528       $JVM_FEATURES_PLATFORM_UNAVAILABLE $JVM_FEATURES_VARIANT_UNAVAILABLE)
 529   if test "x$enabled_but_unavailable" != x; then
 530     AC_MSG_NOTICE([ERROR: Unavailable JVM features explicitly enabled for '$variant': '$enabled_but_unavailable'])
 531     AC_MSG_ERROR([Cannot continue])
 532   fi
 533 
 534   # Notify the user if their command line options has no real effect
 535   UTIL_GET_MATCHING_VALUES(enabled_but_default, $JVM_FEATURES_ENABLED, \
 536       $default_for_variant)
 537   if test "x$enabled_but_default" != x; then
 538     AC_MSG_NOTICE([Default JVM features explicitly enabled for '$variant': '$enabled_but_default'])
 539   fi
 540   UTIL_GET_MATCHING_VALUES(disabled_but_unavailable, $JVM_FEATURES_DISABLED, \
 541       $JVM_FEATURES_PLATFORM_UNAVAILABLE $JVM_FEATURES_VARIANT_UNAVAILABLE)
 542   if test "x$disabled_but_unavailable" != x; then
 543     AC_MSG_NOTICE([Unavailable JVM features explicitly disabled for '$variant': '$disabled_but_unavailable'])
 544   fi
 545 
 546   # JVM_FEATURES_ACTIVE is the set of all default features and all explicitly
 547   # enabled features, with the explicitly disabled features filtered out.
 548   UTIL_GET_NON_MATCHING_VALUES(JVM_FEATURES_ACTIVE, $default_for_variant \
 549       $JVM_FEATURES_ENABLED, $JVM_FEATURES_DISABLED)
 550 ])
 551 
 552 ###############################################################################
 553 # Helper function for JVM_FEATURES_VERIFY. Check if the specified JVM
 554 # feature is active. To be used in shell if constructs, like this:
 555 # 'if JVM_FEATURES_IS_ACTIVE(jvmti); then'
 556 #
 557 # Definition kept in one line to allow inlining in if statements.
 558 # Additional [] needed to keep m4 from mangling shell constructs.
 559 AC_DEFUN([JVM_FEATURES_IS_ACTIVE],
 560 [ [ [[ " $JVM_FEATURES_ACTIVE " =~ ' '$1' ' ]] ] ])
 561 
 562 ###############################################################################
 563 # Verify that the resulting set of features is consistent and legal.
 564 #
 565 # arg 1: JVM variant
 566 #
 567 AC_DEFUN([JVM_FEATURES_VERIFY],
 568 [
 569   variant=$1
 570 
 571   # Verify that dependencies are met for inter-feature relations.
 572   if JVM_FEATURES_IS_ACTIVE(aot) && ! JVM_FEATURES_IS_ACTIVE(graal); then
 573     AC_MSG_ERROR([Specified JVM feature 'aot' requires feature 'graal' for variant '$variant'])
 574   fi
 575 
 576   if JVM_FEATURES_IS_ACTIVE(graal) && ! JVM_FEATURES_IS_ACTIVE(jvmci); then
 577     AC_MSG_ERROR([Specified JVM feature 'graal' requires feature 'jvmci' for variant '$variant'])
 578   fi
 579 
 580   if JVM_FEATURES_IS_ACTIVE(jvmci) && ! (JVM_FEATURES_IS_ACTIVE(compiler1) || \
 581       JVM_FEATURES_IS_ACTIVE(compiler2)); then
 582     AC_MSG_ERROR([Specified JVM feature 'jvmci' requires feature 'compiler2' or 'compiler1' for variant '$variant'])
 583   fi
 584 
 585   if JVM_FEATURES_IS_ACTIVE(jvmti) && ! JVM_FEATURES_IS_ACTIVE(services); then
 586     AC_MSG_ERROR([Specified JVM feature 'jvmti' requires feature 'services' for variant '$variant'])
 587   fi
 588 
 589   if JVM_FEATURES_IS_ACTIVE(management) && ! JVM_FEATURES_IS_ACTIVE(nmt); then
 590     AC_MSG_ERROR([Specified JVM feature 'management' requires feature 'nmt' for variant '$variant'])
 591   fi
 592 
 593   # For backwards compatibility, disable a feature "globally" if one variant
 594   # is missing the feature.
 595   if ! JVM_FEATURES_IS_ACTIVE(aot); then
 596     ENABLE_AOT="false"
 597   fi
 598   if ! JVM_FEATURES_IS_ACTIVE(cds); then
 599     ENABLE_CDS="false"
 600   fi
 601   if ! JVM_FEATURES_IS_ACTIVE(graal); then
 602     INCLUDE_GRAAL="false"
 603   fi
 604   if ! JVM_FEATURES_IS_ACTIVE(jvmci); then
 605     INCLUDE_JVMCI="false"
 606   fi
 607 
 608   # Verify that we have at least one gc selected (i.e., feature named "*gc").
 609   if ! JVM_FEATURES_IS_ACTIVE(.*gc); then
 610       AC_MSG_NOTICE([At least one gc needed for variant '$variant'.])
 611       AC_MSG_NOTICE([Specified features: '$JVM_FEATURES_ACTIVE'])
 612       AC_MSG_ERROR([Cannot continue])
 613   fi
 614 ])
 615 
 616 ###############################################################################
 617 # Set up all JVM features for each enabled JVM variant. Requires that
 618 # JVM_FEATURES_PARSE_OPTIONS has been called.
 619 #
 620 AC_DEFUN_ONCE([JVM_FEATURES_SETUP],
 621 [
 622   # Set up variant-independent factors
 623   JVM_FEATURES_PREPARE_PLATFORM
 624 
 625   # For backwards compatibility, tentatively enable these features "globally",
 626   # and disable them in JVM_FEATURES_VERIFY if a variant is found that are
 627   # missing any of them.
 628   ENABLE_AOT="true"
 629   ENABLE_CDS="true"
 630   INCLUDE_GRAAL="true"
 631   INCLUDE_JVMCI="true"
 632 
 633   for variant in $JVM_VARIANTS; do
 634     # Figure out if any features are unavailable, or should be filtered out
 635     # by default, for this variant.
 636     # Store the result in JVM_FEATURES_VARIANT_UNAVAILABLE and
 637     # JVM_FEATURES_VARIANT_FILTER.
 638     JVM_FEATURES_PREPARE_VARIANT($variant)
 639 
 640     # Calculate the resulting set of enabled features for this variant.
 641     # The result is stored in JVM_FEATURES_ACTIVE.
 642     JVM_FEATURES_CALCULATE_ACTIVE($variant)
 643 
 644     # Verify consistency for JVM_FEATURES_ACTIVE.
 645     JVM_FEATURES_VERIFY($variant)
 646 
 647     # Keep feature list sorted and free of duplicates
 648     UTIL_SORT_LIST(JVM_FEATURES_ACTIVE, $JVM_FEATURES_ACTIVE)
 649     AC_MSG_CHECKING([JVM features to use for variant '$variant'])
 650     AC_MSG_RESULT(['$JVM_FEATURES_ACTIVE'])
 651 
 652     # Save this as e.g. JVM_FEATURES_server, using indirect variable
 653     # referencing.
 654     features_var_name=JVM_FEATURES_$variant
 655     eval $features_var_name=\"$JVM_FEATURES_ACTIVE\"
 656   done
 657 
 658   # Unfortunately AC_SUBST does not work with non-literally named variables,
 659   # so list all variants here.
 660   AC_SUBST(JVM_FEATURES_server)
 661   AC_SUBST(JVM_FEATURES_client)
 662   AC_SUBST(JVM_FEATURES_minimal)
 663   AC_SUBST(JVM_FEATURES_core)
 664   AC_SUBST(JVM_FEATURES_zero)
 665   AC_SUBST(JVM_FEATURES_custom)
 666 
 667   AC_SUBST(ENABLE_AOT)
 668   AC_SUBST(INCLUDE_GRAAL)
 669   AC_SUBST(INCLUDE_JVMCI)
 670 
 671 ])