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 ])