OpenJDK / jdk / hs
changeset 45174:1f2c341f226d
Merge
author | duke |
---|---|
date | Wed, 05 Jul 2017 23:29:16 +0200 |
parents | a220a944d643 72bd5e8aab2f |
children | d3666314f7ca |
files | make/Javadoc.gmk test/lib/jdk/test/lib/DynamicVMOption.java test/lib/jdk/test/lib/InMemoryJavaCompiler.java |
diffstat | 26 files changed, 2160 insertions(+), 1038 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags-top-repo Tue May 23 22:38:58 2017 +0000 +++ b/.hgtags-top-repo Wed Jul 05 23:29:16 2017 +0200 @@ -419,4 +419,7 @@ 111e2e7d00f45c983cdbc9c59ae40552152fcc23 jdk-10+5 03fe61bb7670644cf6e46b5cfafb6b27c0e0157e jdk-10+6 b25838a28195f4b6dab34668411eedd2d366a16c jdk-9+169 +4d163ec59d989a9261ed7f848bc6303f90869af5 jdk-9+170 +aa3c97810d7c484c93a2fd75d3c76ff574deb6d8 jdk-10+7 +df33ef1dc163f994177fd97d4d0e73a1e3cb5d85 jdk-10+8
--- a/common/autoconf/generated-configure.sh Tue May 23 22:38:58 2017 +0000 +++ b/common/autoconf/generated-configure.sh Wed Jul 05 23:29:16 2017 +0200 @@ -5186,7 +5186,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1494615666 +DATE_WHEN_GENERATED=1494858828 ############################################################################### # @@ -48811,173 +48811,63 @@ # Check whether --with-jtreg was given. if test "${with_jtreg+set}" = set; then : withval=$with_jtreg; -else - with_jtreg=no fi if test "x$with_jtreg" = xno; then # jtreg disabled - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg" >&5 -$as_echo_n "checking for jtreg... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - if test "x$with_jtreg" != xyes; then - # with path specified. - JT_HOME="$with_jtreg" - fi - + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5 +$as_echo_n "checking for jtreg test harness... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, disabled" >&5 +$as_echo "no, disabled" >&6; } + elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then + # An explicit path is specified, use it. + JT_HOME="$with_jtreg" + if test ! -d "$JT_HOME"; then + as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg does not exist" "$LINENO" 5 + fi + + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg is not a valid jtreg home" "$LINENO" 5 + fi + + JTREGEXE="$JT_HOME/bin/jtreg" + if test ! -x "$JTREGEXE"; then + as_fn_error $? "jtreg home directory from --with-jtreg=$with_jtreg does not contain valid jtreg executable" "$LINENO" 5 + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5 +$as_echo_n "checking for jtreg test harness... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JT_HOME" >&5 +$as_echo "$JT_HOME" >&6; } + else + # Try to locate jtreg if test "x$JT_HOME" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg" >&5 -$as_echo_n "checking for jtreg... " >&6; } - - # use JT_HOME enviroment var. - - # Only process if variable expands to non-empty - - if test "x$JT_HOME" != x; then - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - - # Input might be given as Windows format, start by converting to - # unix format. - path="$JT_HOME" - new_path=`$CYGPATH -u "$path"` - - # Cygwin tries to hide some aspects of the Windows file system, such that binaries are - # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered - # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then - # "foo.exe" is OK but "foo" is an error. - # - # This test is therefore slightly more accurate than "test -f" to check for file precense. - # It is also a way to make sure we got the proper file name for the real test later on. - test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` - if test "x$test_shortpath" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5 -$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Cannot locate the the path of JT_HOME" "$LINENO" 5 - fi - - # Call helper function which possibly converts this using DOS-style short mode. - # If so, the updated path is stored in $new_path. - - input_path="$new_path" - # Check if we need to convert this using DOS-style short mode. If the path - # contains just simple characters, use it. Otherwise (spaces, weird characters), - # take no chances and rewrite it. - # Note: m4 eats our [], so we need to use [ and ] instead. - has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` - if test "x$has_forbidden_chars" != x; then - # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) - shortmode_path=`$CYGPATH -s -m -a "$input_path"` - path_after_shortmode=`$CYGPATH -u "$shortmode_path"` - if test "x$path_after_shortmode" != "x$input_to_shortpath"; then - # Going to short mode and back again did indeed matter. Since short mode is - # case insensitive, let's make it lowercase to improve readability. - shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Now convert it back to Unix-style (cygpath) - input_path=`$CYGPATH -u "$shortmode_path"` - new_path="$input_path" - fi - fi - - test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` - if test "x$test_cygdrive_prefix" = x; then - # As a simple fix, exclude /usr/bin since it's not a real path. - if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then - # The path is in a Cygwin special directory (e.g. /home). We need this converted to - # a path prefixed by /cygdrive for fixpath to work. - new_path="$CYGWIN_ROOT_PATH$input_path" - fi - fi - - - if test "x$path" != "x$new_path"; then - JT_HOME="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5 -$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;} - fi - - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - - path="$JT_HOME" - has_colon=`$ECHO $path | $GREP ^.:` - new_path="$path" - if test "x$has_colon" = x; then - # Not in mixed or Windows style, start by that. - new_path=`cmd //c echo $path` - fi - - - input_path="$new_path" - # Check if we need to convert this using DOS-style short mode. If the path - # contains just simple characters, use it. Otherwise (spaces, weird characters), - # take no chances and rewrite it. - # Note: m4 eats our [], so we need to use [ and ] instead. - has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` - if test "x$has_forbidden_chars" != x; then - # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) - new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - fi - - - windows_path="$new_path" - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - unix_path=`$CYGPATH -u "$windows_path"` - new_path="$unix_path" - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` - new_path="$unix_path" - fi - - if test "x$path" != "x$new_path"; then - JT_HOME="$new_path" - { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5 -$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;} - fi - - # Save the first 10 bytes of this path to the storage, so fixpath can work. - all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") - - else - # We're on a unix platform. Hooray! :) - path="$JT_HOME" - has_space=`$ECHO "$path" | $GREP " "` - if test "x$has_space" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5 -$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;} - as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 - fi - - # Use eval to expand a potential ~ - eval path="$path" - if test ! -f "$path" && test ! -d "$path"; then - as_fn_error $? "The path of JT_HOME, which resolves as \"$path\", is not found." "$LINENO" 5 - fi - - if test -d "$path"; then - JT_HOME="`cd "$path"; $THEPWDCMD -L`" - else - dir="`$DIRNAME "$path"`" - base="`$BASENAME "$path"`" - JT_HOME="`cd "$dir"; $THEPWDCMD -L`/$base" - fi - fi - fi - - - # jtreg win32 script works for everybody - JTREGEXE="$JT_HOME/bin/jtreg" - - if test ! -f "$JTREGEXE"; then - as_fn_error $? "JTReg executable does not exist: $JTREGEXE" "$LINENO" 5 - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JTREGEXE" >&5 -$as_echo "$JTREGEXE" >&6; } - else - # try to find jtreg on path - + # JT_HOME set in environment, use it + if test ! -d "$JT_HOME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME pointing to invalid directory: $JT_HOME" >&5 +$as_echo "$as_me: WARNING: Ignoring JT_HOME pointing to invalid directory: $JT_HOME" >&2;} + JT_HOME= + else + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME" >&5 +$as_echo "$as_me: WARNING: Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME" >&2;} + JT_HOME= + elif test ! -x "$JT_HOME/bin/jtreg"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME" >&5 +$as_echo "$as_me: WARNING: Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME" >&2;} + JT_HOME= + else + JTREGEXE="$JT_HOME/bin/jtreg" + { $as_echo "$as_me:${as_lineno-$LINENO}: Located jtreg using JT_HOME from environment" >&5 +$as_echo "$as_me: Located jtreg using JT_HOME from environment" >&6;} + fi + fi + fi + + if test "x$JT_HOME" = x; then + # JT_HOME is not set in environment, or was deemed invalid. + # Try to find jtreg on path # Publish this variable in the help. @@ -49175,13 +49065,451 @@ fi - - if test "x$JTREGEXE" = x; then - as_fn_error $? "Could not find required tool for JTREGEXE" "$LINENO" 5 - fi - - - JT_HOME="`$DIRNAME $JTREGEXE`" + if test "x$JTREGEXE" != x; then + # That's good, now try to derive JT_HOME + JT_HOME=`(cd $($DIRNAME $JTREGEXE)/.. && pwd)` + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring jtreg from path since a valid jtreg home cannot be found" >&5 +$as_echo "$as_me: WARNING: Ignoring jtreg from path since a valid jtreg home cannot be found" >&2;} + JT_HOME= + JTREGEXE= + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Located jtreg using jtreg executable in path" >&5 +$as_echo "$as_me: Located jtreg using jtreg executable in path" >&6;} + fi + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jtreg test harness" >&5 +$as_echo_n "checking for jtreg test harness... " >&6; } + if test "x$JT_HOME" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JT_HOME" >&5 +$as_echo "$JT_HOME" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, not found" >&5 +$as_echo "no, not found" >&6; } + + if test "x$with_jtreg" = xyes; then + as_fn_error $? "--with-jtreg was specified, but no jtreg found." "$LINENO" 5 + fi + fi + fi + + + # Only process if variable expands to non-empty + + if test "x$JTREGEXE" != x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$JTREGEXE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5 + fi + fi + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file presence. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-style (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $input_to_shortpath | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$JTREGEXE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in MSYS causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -i -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path="$path" + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + fi + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + fi + + else + # We're on a unix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$JTREGEXE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Cannot rely on the command "which" here since it doesn't always work. + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test -z "$is_absolute_path"; then + # Path to executable is not absolute. Find it. + IFS_save="$IFS" + IFS=: + for p in $PATH; do + if test -f "$p/$path" && test -x "$p/$path"; then + new_path="$p/$path" + break + fi + done + IFS="$IFS_save" + else + # This is an absolute path, we can use it without further modifications. + new_path="$path" + fi + + if test "x$new_path" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of JTREGEXE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of JTREGEXE" "$LINENO" 5 + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + JTREGEXE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JTREGEXE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting JTREGEXE to \"$new_complete\"" >&6;} + fi + fi + + + # Only process if variable expands to non-empty + + if test "x$JT_HOME" != x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$JT_HOME" + new_path=`$CYGPATH -u "$path"` + + # Cygwin tries to hide some aspects of the Windows file system, such that binaries are + # named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered + # the same file, most of the time (as in "test -f"). But not when running cygpath -s, then + # "foo.exe" is OK but "foo" is an error. + # + # This test is therefore slightly more accurate than "test -f" to check for file precense. + # It is also a way to make sure we got the proper file name for the real test later on. + test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null` + if test "x$test_shortpath" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of JT_HOME" "$LINENO" 5 + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + shortmode_path=`$CYGPATH -s -m -a "$input_path"` + path_after_shortmode=`$CYGPATH -u "$shortmode_path"` + if test "x$path_after_shortmode" != "x$input_to_shortpath"; then + # Going to short mode and back again did indeed matter. Since short mode is + # case insensitive, let's make it lowercase to improve readability. + shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Now convert it back to Unix-style (cygpath) + input_path=`$CYGPATH -u "$shortmode_path"` + new_path="$input_path" + fi + fi + + test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + # As a simple fix, exclude /usr/bin since it's not a real path. + if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then + # The path is in a Cygwin special directory (e.g. /home). We need this converted to + # a path prefixed by /cygdrive for fixpath to work. + new_path="$CYGWIN_ROOT_PATH$input_path" + fi + fi + + + if test "x$path" != "x$new_path"; then + JT_HOME="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$JT_HOME" + has_colon=`$ECHO $path | $GREP ^.:` + new_path="$path" + if test "x$has_colon" = x; then + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $path` + fi + + + input_path="$new_path" + # Check if we need to convert this using DOS-style short mode. If the path + # contains just simple characters, use it. Otherwise (spaces, weird characters), + # take no chances and rewrite it. + # Note: m4 eats our [], so we need to use [ and ] instead. + has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]` + if test "x$has_forbidden_chars" != x; then + # Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + + windows_path="$new_path" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + new_path="$unix_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'` + new_path="$unix_path" + fi + + if test "x$path" != "x$new_path"; then + JT_HOME="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JT_HOME to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JT_HOME to \"$new_path\"" >&6;} + fi + + # Save the first 10 bytes of this path to the storage, so fixpath can work. + all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}") + + else + # We're on a unix platform. Hooray! :) + path="$JT_HOME" + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JT_HOME, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JT_HOME, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + + # Use eval to expand a potential ~ + eval path="$path" + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of JT_HOME, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + if test -d "$path"; then + JT_HOME="`cd "$path"; $THEPWDCMD -L`" + else + dir="`$DIRNAME "$path"`" + base="`$BASENAME "$path"`" + JT_HOME="`cd "$dir"; $THEPWDCMD -L`/$base" + fi fi fi
--- a/common/autoconf/spec.gmk.in Tue May 23 22:38:58 2017 +0000 +++ b/common/autoconf/spec.gmk.in Wed Jul 05 23:29:16 2017 +0200 @@ -271,9 +271,6 @@ TESTMAKE_OUTPUTDIR=$(BUILD_OUTPUT)/test-make MAKESUPPORT_OUTPUTDIR=$(BUILD_OUTPUT)/make-support -# By default, output javadoc directly into image -JAVADOC_OUTPUTDIR = $(DOCS_IMAGE_DIR) - # This does not get overridden in a bootcycle build CONFIGURESUPPORT_OUTPUTDIR:=@CONFIGURESUPPORT_OUTPUTDIR@ BUILDJDK_OUTPUTDIR=$(BUILD_OUTPUT)/buildjdk @@ -819,6 +816,8 @@ # Docs image DOCS_IMAGE_SUBDIR := docs DOCS_IMAGE_DIR = $(IMAGES_OUTPUTDIR)/$(DOCS_IMAGE_SUBDIR) +# Output docs directly into image +DOCS_OUTPUTDIR := $(DOCS_IMAGE_DIR) # Macosx bundles directory definitions JDK_MACOSX_BUNDLE_SUBDIR=jdk-bundle
--- a/common/autoconf/toolchain.m4 Tue May 23 22:38:58 2017 +0000 +++ b/common/autoconf/toolchain.m4 Wed Jul 05 23:29:16 2017 +0200 @@ -926,41 +926,82 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG], [ AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg], - [Regression Test Harness @<:@probed@:>@])], - [], - [with_jtreg=no]) + [Regression Test Harness @<:@probed@:>@])]) if test "x$with_jtreg" = xno; then # jtreg disabled - AC_MSG_CHECKING([for jtreg]) - AC_MSG_RESULT(no) - else - if test "x$with_jtreg" != xyes; then - # with path specified. - JT_HOME="$with_jtreg" + AC_MSG_CHECKING([for jtreg test harness]) + AC_MSG_RESULT([no, disabled]) + elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then + # An explicit path is specified, use it. + JT_HOME="$with_jtreg" + if test ! -d "$JT_HOME"; then + AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not exist]) + fi + + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg is not a valid jtreg home]) + fi + + JTREGEXE="$JT_HOME/bin/jtreg" + if test ! -x "$JTREGEXE"; then + AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not contain valid jtreg executable]) fi + AC_MSG_CHECKING([for jtreg test harness]) + AC_MSG_RESULT([$JT_HOME]) + else + # Try to locate jtreg if test "x$JT_HOME" != x; then - AC_MSG_CHECKING([for jtreg]) - - # use JT_HOME enviroment var. - BASIC_FIXUP_PATH([JT_HOME]) - - # jtreg win32 script works for everybody - JTREGEXE="$JT_HOME/bin/jtreg" + # JT_HOME set in environment, use it + if test ! -d "$JT_HOME"; then + AC_MSG_WARN([Ignoring JT_HOME pointing to invalid directory: $JT_HOME]) + JT_HOME= + else + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + AC_MSG_WARN([Ignoring JT_HOME which is not a valid jtreg home: $JT_HOME]) + JT_HOME= + elif test ! -x "$JT_HOME/bin/jtreg"; then + AC_MSG_WARN([Ignoring JT_HOME which does not contain valid jtreg executable: $JT_HOME]) + JT_HOME= + else + JTREGEXE="$JT_HOME/bin/jtreg" + AC_MSG_NOTICE([Located jtreg using JT_HOME from environment]) + fi + fi + fi - if test ! -f "$JTREGEXE"; then - AC_MSG_ERROR([JTReg executable does not exist: $JTREGEXE]) + if test "x$JT_HOME" = x; then + # JT_HOME is not set in environment, or was deemed invalid. + # Try to find jtreg on path + BASIC_PATH_PROGS(JTREGEXE, jtreg) + if test "x$JTREGEXE" != x; then + # That's good, now try to derive JT_HOME + JT_HOME=`(cd $($DIRNAME $JTREGEXE)/.. && pwd)` + if test ! -e "$JT_HOME/lib/jtreg.jar"; then + AC_MSG_WARN([Ignoring jtreg from path since a valid jtreg home cannot be found]) + JT_HOME= + JTREGEXE= + else + AC_MSG_NOTICE([Located jtreg using jtreg executable in path]) + fi fi + fi - AC_MSG_RESULT($JTREGEXE) + AC_MSG_CHECKING([for jtreg test harness]) + if test "x$JT_HOME" != x; then + AC_MSG_RESULT([$JT_HOME]) else - # try to find jtreg on path - BASIC_REQUIRE_PROGS(JTREGEXE, jtreg) - JT_HOME="`$DIRNAME $JTREGEXE`" + AC_MSG_RESULT([no, not found]) + + if test "x$with_jtreg" = xyes; then + AC_MSG_ERROR([--with-jtreg was specified, but no jtreg found.]) + fi fi fi + BASIC_FIXUP_EXECUTABLE(JTREGEXE) + BASIC_FIXUP_PATH(JT_HOME) AC_SUBST(JT_HOME) AC_SUBST(JTREGEXE) ])
--- a/common/bin/hgforest.sh Tue May 23 22:38:58 2017 +0000 +++ b/common/bin/hgforest.sh Wed Jul 05 23:29:16 2017 +0200 @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -183,7 +183,7 @@ subrepos="corba jaxp jaxws langtools jdk hotspot nashorn" jdk_subrepos_extra="closed jdk/src/closed jdk/make/closed jdk/test/closed hotspot/make/closed hotspot/src/closed hotspot/test/closed" -subrepos_extra="$jdk_subrepos_extra deploy install sponsors pubs" +subrepos_extra="$jdk_subrepos_extra deploy install sponsors" # Only look in specific locations for possible forests (avoids long searches) pull_default=""
--- a/common/conf/jib-profiles.js Tue May 23 22:38:58 2017 +0000 +++ b/common/conf/jib-profiles.js Wed Jul 05 23:29:16 2017 +0200 @@ -997,7 +997,8 @@ ext: "tar.gz", revision: "2.38.0-1+1.1", module: "graphviz-" + input.target_platform, - configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot" + configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot", + environment_path: input.get("graphviz", "install_path") }, pandoc: { @@ -1005,7 +1006,8 @@ ext: "tar.gz", revision: "1.17.2+1.0", module: "pandoc-" + input.target_platform, - configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc" + configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc", + environment_path: input.get("pandoc", "install_path") + "/pandoc" }, };
--- a/common/doc/building.html Tue May 23 22:38:58 2017 +0000 +++ b/common/doc/building.html Wed Jul 05 23:29:16 2017 +0200 @@ -6,6 +6,7 @@ <meta name="generator" content="pandoc" /> <title>OpenJDK Build README</title> <style type="text/css">code{white-space: pre;}</style> + <link rel="stylesheet" href=" ../../jdk/make/data/docs-resources/specs/resources/jdk-default.css" type="text/css" /> </head> <body> <div id="header">
--- a/common/doc/testing.html Tue May 23 22:38:58 2017 +0000 +++ b/common/doc/testing.html Wed Jul 05 23:29:16 2017 +0200 @@ -6,9 +6,8 @@ <meta name="generator" content="pandoc" /> <title>Testing OpenJDK</title> <style type="text/css">code{white-space: pre;}</style> - <link rel="stylesheet" href="http://openjdk.java.net/page.css" type="text/css" /> + <link rel="stylesheet" href=" ../../jdk/make/data/docs-resources/specs/resources/jdk-default.css" type="text/css" /> <style type="text/css">pre, code, tt { color: #1d6ae5; }</style> - <style type="text/css">pre { font-size: 10pt; }</style> </head> <body> <div id="header">
--- a/make/Bundles.gmk Tue May 23 22:38:58 2017 +0000 +++ b/make/Bundles.gmk Wed Jul 05 23:29:16 2017 +0200 @@ -183,6 +183,7 @@ $(JDK_SYMBOLS_EXCLUDE_PATTERN) \ $(JDK_EXTRA_EXCLUDES) \ $(SYMBOLS_EXCLUDE_PATTERN) \ + $(JDK_IMAGE_HOMEDIR)/demo/% \ , \ $(ALL_JDK_FILES) \ )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/Docs.gmk Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,476 @@ +# Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +default: all + +include $(SPEC) +include MakeBase.gmk +include Modules.gmk +include ProcessMarkdown.gmk +include ZipArchive.gmk +include $(JDK_TOPDIR)/make/Tools.gmk +include $(JDK_TOPDIR)/make/ModuleTools.gmk + +# This is needed to properly setup DOCS_MODULES. +$(eval $(call ReadImportMetaData)) + +################################################################################ + +# Hook to include the corresponding custom file, if present. +$(eval $(call IncludeCustomExtension, , Docs.gmk)) + +################################################################################ +# Javadoc settings + +# On top of the sources that was used to compile the JDK, we need some +# extra java.rmi sources that are used just for javadoc. +MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) \ + $(SUPPORT_OUTPUTDIR)/rmic/* $(JDK_TOPDIR)/src/*/share/doc/stub) + +# URLs +JAVADOC_BASE_URL := http://www.oracle.com/pls/topic/lookup?ctx=javase9&id=homepage +BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/ +COPYRIGHT_URL := {@docroot}/../legal/cpyr.html +LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java9speclicense.html +REDISTRIBUTION_URL := http://www.oracle.com/technetwork/java/redist-137594.html + + +# In order to get a specific ordering it's necessary to specify the total +# ordering of tags as the tags are otherwise ordered in order of definition. +JAVADOC_TAGS := \ + -tag beaninfo:X \ + -tag revised:X \ + -tag since.unbundled:X \ + -tag spec:X \ + -tag specdefault:X \ + -tag Note:X \ + -tag ToDo:X \ + -tag 'apiNote:a:API Note:' \ + -tag 'implSpec:a:Implementation Requirements:' \ + -tag 'implNote:a:Implementation Note:' \ + -tag param \ + -tag return \ + -tag throws \ + -taglet build.tools.taglet.ModuleGraph \ + -tag since \ + -tag version \ + -tag serialData \ + -tag factory \ + -tag see \ + -tag 'jvms:a:See <cite>The Java™ Virtual Machine Specification</cite>:' \ + -tag 'jls:a:See <cite>The Java™ Language Specification</cite>:' \ + -taglet build.tools.taglet.ExtLink \ + -taglet build.tools.taglet.Incubating \ + -tagletpath $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ + $(CUSTOM_JAVADOC_TAGS) \ + # + +# Which doclint checks to ignore +JAVADOC_DISABLED_DOCLINT := accessibility html missing syntax reference + +# The initial set of options for javadoc +JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \ + -serialwarn -encoding ISO-8859-1 -breakiterator -splitIndex --system none \ + -html5 -javafx --expand-requires transitive + +# Should we add DRAFT stamps to the generated javadoc? +ifeq ($(VERSION_IS_GA), true) + IS_DRAFT := false +else + IS_DRAFT := true +endif + +################################################################################ +# General text snippets + +FULL_COMPANY_NAME := Oracle and/or its affiliates +COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA + +ifeq ($(IS_DRAFT), true) + DRAFT_MARKER_STR := <br><strong>DRAFT $(VERSION_STRING)</strong> + ifeq ($(VERSION_BUILD), 0) + DRAFT_MARKER_TITLE := [ad-hoc build] + else + DRAFT_MARKER_TITLE := [build $(VERSION_BUILD)] + endif +endif + +JAVADOC_WINDOW_TITLE := Java Platform SE $(VERSION_SPECIFICATION) \ + $(DRAFT_MARKER_TITLE) + +JAVADOC_HEADER_TITLE := $(subst $(SPACE), ,$(strip \ + <strong>Java™ Platform<br>Standard Ed. \ + $(VERSION_SPECIFICATION)</strong>$(DRAFT_MARKER_STR))) + +JAVADOC_BOTTOM := \ + <span style="font-size:smaller"> \ + <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a><br> \ + For further API reference and developer documentation, see \ + <a href="$(JAVADOC_BASE_URL)" target="_blank">Java SE \ + Documentation</a>. That documentation contains more detailed, \ + developer-targeted descriptions, with conceptual overviews, definitions \ + of terms, workarounds, and working code examples.<br> \ + Java is a trademark or registered trademark of $(FULL_COMPANY_NAME) in \ + the US and other countries.<br> \ + <a href="$(COPYRIGHT_URL)">Copyright</a> \ + © 1993, $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \ + $(COMPANY_ADDRESS). All rights reserved. \ + Use is subject to <a href="$(LICENSE_URL)">license terms</a>. Also see the \ + <a href="$(REDISTRIBUTION_URL)">documentation redistribution policy</a>. \ + $(DRAFT_MARKER_STR)</span> + +JAVADOC_TOP := \ + <div style="background-color: $(HASH)EEEEEE"><div style="padding: 6px; \ + margin-top: 2px; margin-bottom: 6px; margin-left: 6px; margin-right: \ + 6px; text-align: justify; font-size: 80%; font-family: Helvetica, Arial, \ + sans-serif; font-weight: normal;">Please note that the specifications \ + and other information contained herein are not final and are subject to \ + change. The information is being made available to you solely for \ + purpose of evaluation.</div></div> + +################################################################################ +# JDK javadoc titles/text snippets + +JDK_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition Development Kit \ + (JDK™) $(VERSION_SPECIFICATION)<br>API Specification + +################################################################################ +# Java SE javadoc titles/text snippets + +JAVASE_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition \ + $(VERSION_SPECIFICATION)<br>API Specification + +################################################################################ + +JDK_DOCS_INDEX_HTML_TITLE := Java™ Platform, Standard Edition Development Kit \ + (JDK™) $(VERSION_SPECIFICATION) Specification<br>$(DRAFT_MARKER_TITLE) + +################################################################################ +# Functions + +# Helper function for creating a png file from a dot file generated by the +# GenGraphs tool. +# param 1: SetupJavadocGeneration namespace ($1) +# param 2: module name +# +define setup_gengraph_dot_to_png + $1_$2_DOT_SRC := $$($1_GENGRAPHS_DIR)/$2.dot + $1_$2_PNG_TARGET := $$($1_TARGET_DIR)/$2-graph.png + + # For each module needing a graph, create a png file from the dot file + # generated by the GenGraphs tool and store it in the target dir. + $$($1_$2_PNG_TARGET): $$($1_GENGRAPHS_MARKER) + $$(call MakeDir, $$(@D)) + $$(call ExecuteWithLog, $$($1_$2_DOT_SRC), \ + $$(DOT) -Tpng -o $$($1_$2_PNG_TARGET) $$($1_$2_DOT_SRC)) + + $1_MODULEGRAPH_TARGETS += $$($1_$2_PNG_TARGET) +endef + +################################################################################ +# Setup make rules for creating the API documentation, using javadoc and other +# tools if needed. +# +# Parameter 1 is the name of the rule. This name is used as variable prefix. +# Targets generated are returned as $1_JAVADOC_TARGETS and +# $1_MODULEGRAPH_TARGETS. Note that the index.html file will work as a "touch +# file" for all the magnitude of files that are generated by javadoc. +# +# Remaining parameters are named arguments. These include: +# MODULES - Modules to generate javadoc for +# NAME - The name of the javadoc compilation, to be presented to the user +# TARGET_DIR - Where to store the output +# OVERVIEW - Path to an html overview file +# DOC_TITLE - Title to use in -doctitle. +# WINDOW_TITLE - Title to use in -windowtitle. +# HEADER_TITLE - Title to use in -header. +# BOTTOM_TEXT - Text to use in -bottom. +# TOP_TEXT - Text to use in -top. +# +SetupApiDocsGeneration = $(NamedParamsMacroTemplate) +define SetupApiDocsGenerationBody + + # Figure out all modules, both specified and transitive, that will be processed + # by javadoc. + $1_TRANSITIVE_MODULES := $$(call FindTransitiveDepsForModules, $$($1_MODULES)) + $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_TRANSITIVE_MODULES)) + + ifeq ($$(ENABLE_FULL_DOCS), true) + # Tell the ModuleGraph taglet to generate html links to soon-to-be-created + # png files with module graphs. + $1_JAVA_ARGS += -DenableModuleGraph=true + endif + + # Always include tags and basic options + $1_OPTIONS := $$(JAVADOC_TAGS) $$(JAVADOC_OPTIONS) + + $1_OPTIONS += -overview $$($1_OVERVIEW) + $1_OPTIONS += --module-source-path $$(MODULES_SOURCE_PATH) + $1_OPTIONS += --module $$(call CommaList, $$($1_MODULES)) + + # Create a string like "-Xdoclint:all,-syntax,-html,..." + $1_OPTIONS += -Xdoclint:all,$$(call CommaList, $$(addprefix -, \ + $$(JAVADOC_DISABLED_DOCLINT))) + + $1_OPTIONS += -doctitle '$$($1_DOC_TITLE)' + $1_OPTIONS += -windowtitle '$$($1_WINDOW_TITLE)' + $1_OPTIONS += -header '$$($1_HEADER_TITLE)' + $1_OPTIONS += -bottom '$$($1_BOTTOM_TEXT)' + ifeq ($$(IS_DRAFT), true) + $1_OPTIONS += -top '$$($1_TOP_TEXT)' + endif + + # Do not store debug level options in VARDEPS. + ifneq ($$(LOG_LEVEL), trace) + $1_LOG_OPTION += -quiet + else + $1_LOG_OPTION += -verbose + endif + + $1_VARDEPS := $$($1_JAVA_ARGS) $$($1_OPTIONS) $$(MODULES_SOURCE_PATH) \ + $$($1_ALL_MODULES) + $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ + $$(SUPPORT_OUTPUTDIR)/docs/$1.vardeps) + + # Get a list of all files in all the source dirs for all included modules + $1_SOURCE_DEPS := $$(call CacheFind, $$(wildcard $$(foreach module, \ + $$($1_ALL_MODULES), $$(call FindModuleSrcDirs, $$(module))))) + + # Javadoc creates a lot of files but use index.html as a marker + $$($1_TARGET_DIR)/index.html: $$(BUILD_TOOLS_JDK) $$($1_VARDEPS_FILE) \ + $$($1_SOURCE_DEPS) $$($1_OVERVIEW) + $$(call LogWarn, Generating $$($1_NAME) API javadoc for \ + $$(words $$($1_ALL_MODULES)) modules) + $$(call LogInfo, Javadoc modules: $$($1_ALL_MODULES)) + $$(call MakeDir, $$($1_TARGET_DIR)) + $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1, \ + $$(JAVA) -Djava.awt.headless=true $$($1_JAVA_ARGS) \ + $$(NEW_JAVADOC) -d $$($1_TARGET_DIR) \ + $$(JAVADOC_TAGS) $$($1_OPTIONS) $$($1_LOG_OPTION)) + + $1_JAVADOC_TARGETS := $$($1_TARGET_DIR)/index.html + + ifeq ($$(ENABLE_FULL_DOCS), true) + # We have asked ModuleGraph to generate links to png files. Now we must + # produce the png files. + + # Locate which modules has the @moduleGraph tag in their module-info.java + $1_MODULES_NEEDING_GRAPH := $$(strip $$(foreach m, $$($1_ALL_MODULES), \ + $$(if $$(shell $$(GREP) -e @moduleGraph \ + $$(wildcard $$(addsuffix /module-info.java, \ + $$(call FindModuleSrcDirs, $$m)))), \ + $$m) \ + )) + + # First we run the GenGraph tool. It will query the module structure of the + # running JVM and output .dot files for all existing modules. + GENGRAPHS_PROPS := \ + $$(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties + + $1_GENGRAPHS_DIR := $$(SUPPORT_OUTPUTDIR)/docs/$1-gengraphs + $1_GENGRAPHS_MARKER := $$($1_GENGRAPHS_DIR)/_gengraphs_run.marker + + $$($1_GENGRAPHS_MARKER): $$(BUILD_JIGSAW_TOOLS) $$(GENGRAPHS_PROPS) + $$(call LogInfo, Running gengraphs for $$($1_NAME) API documentation) + $$(call MakeDir, $$($1_GENGRAPHS_DIR)) + $$(call ExecuteWithLog, $$($1_GENGRAPHS_DIR)/gengraphs, \ + $$(TOOL_GENGRAPHS) --spec --output $$($1_GENGRAPHS_DIR) \ + --dot-attributes $$(GENGRAPHS_PROPS) && \ + $$(TOUCH) $$($1_GENGRAPHS_MARKER)) + + # For each module needing a graph, create a png file from the dot file + # generated by the GenGraphs tool and store it in the target dir. + # They will depend on $1_GENGRAPHS_MARKER, and will be added to $1. + $$(foreach m, $$($1_MODULES_NEEDING_GRAPH), \ + $$(eval $$(call setup_gengraph_dot_to_png,$1,$$m)) \ + ) + endif +endef + +################################################################################ +# Setup generation of the JDK API documentation (javadoc + modulegraph) + +# All modules to have docs generated by docs-jdk-api target +JDK_JAVADOC_MODULES := $(sort $(DOCS_MODULES)) + +JDK_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html + +$(eval $(call SetupApiDocsGeneration, JDK_API, \ + MODULES := $(JDK_JAVADOC_MODULES), \ + NAME := JDK, \ + TARGET_DIR := $(DOCS_OUTPUTDIR)/api, \ + OVERVIEW := $(JDK_JAVADOC_OVERVIEW), \ + DOC_TITLE := $(JDK_JAVADOC_DOC_TITLE), \ + WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \ + HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \ + BOTTOM_TEXT := $(JAVADOC_BOTTOM), \ + TOP_TEXT := $(JAVADOC_TOP), \ +)) + +# Targets generated are returned in JDK_API_JAVADOC_TARGETS and +# JDK_API_MODULEGRAPH_TARGETS. + +################################################################################ +# Setup generation of the Java SE API documentation (javadoc + modulegraph) + +# The Java SE module scope is just java.se.ee and it's transitive modules. +JAVASE_JAVADOC_MODULES := java.se.ee + +JAVASE_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html + +$(eval $(call SetupApiDocsGeneration, JAVASE_API, \ + MODULES := $(JAVASE_JAVADOC_MODULES), \ + NAME := Java SE, \ + TARGET_DIR := $(IMAGES_OUTPUTDIR)/javase-docs/api, \ + OVERVIEW := $(JAVASE_JAVADOC_OVERVIEW), \ + DOC_TITLE := $(JAVASE_JAVADOC_DOC_TITLE), \ + WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \ + HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \ + BOTTOM_TEXT := $(JAVADOC_BOTTOM), \ + TOP_TEXT := $(JAVADOC_TOP), \ +)) + +# Targets generated are returned in JAVASE_API_JAVADOC_TARGETS and +# JAVASE_API_MODULEGRAPH_TARGETS. + +################################################################################ + +JDK_DOCS_INDEX_HTML := $(DOCS_OUTPUTDIR)/index.html + +$(JDK_DOCS_INDEX_HTML): $(BUILD_JIGSAW_TOOLS) + $(call LogInfo, Generating docs bundle index page) + $(MKDIR) -p $(@D) + $(TOOL_GEN_DOCS_BUNDLE_PAGE) --title '$(JDK_DOCS_INDEX_HTML_TITLE)' \ + --output $@ + +JDK_DOCS_INDEX_HTML_TARGETS := $(JDK_DOCS_INDEX_HTML) + +################################################################################ +# Copy JDK specs files + +# For all html documentation in $module/share/specs directories, copy it +# unmodified + +ALL_MODULES := $(call FindAllModules) +COPY_SPEC_FILTER := %.html %.gif %.jpg %.mib %.css + +$(foreach m, $(ALL_MODULES), \ + $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \ + $(foreach d, $(SPECS_$m), \ + $(if $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $d)), \ + $(eval $(call SetupCopyFiles, COPY_$m, \ + SRC := $d, \ + FILES := $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $d)), \ + DEST := $(DOCS_OUTPUTDIR)/specs/, \ + )) \ + $(eval JDK_SPECS_TARGETS += $(COPY_$m)) \ + ) \ + ) \ +) + +# Copy the global resources +GLOBAL_SPECS_RESOURCES_DIR := $(JDK_TOPDIR)/make/data/docs-resources/specs +$(eval $(call SetupCopyFiles, COPY_GLOBAL_RESOURCES, \ + SRC := $(GLOBAL_SPECS_RESOURCES_DIR), \ + FILES := $(call CacheFind, $(GLOBAL_SPECS_RESOURCES_DIR)), \ + DEST := $(DOCS_OUTPUTDIR)/specs/, \ +)) +JDK_SPECS_TARGETS += $(COPY_GLOBAL_RESOURCES) + +ifeq ($(ENABLE_FULL_DOCS), true) + # For all markdown files in $module/share/specs directories, convert them to + # html. + + GLOBAL_SPECS_DEFAULT_CSS_FILE := $(DOCS_OUTPUTDIR)/specs/resources/jdk-default.css + + $(foreach m, $(ALL_MODULES), \ + $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \ + $(foreach d, $(SPECS_$m), \ + $(if $(filter %.md, $(call CacheFind, $d)), \ + $(eval $(call SetupProcessMarkdown, CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d), \ + SRC := $d, \ + FILES := $(filter %.md, $(call CacheFind, $d)), \ + DEST := $(DOCS_OUTPUTDIR)/specs/, \ + CSS := $(GLOBAL_SPECS_DEFAULT_CSS_FILE), \ + )) \ + ) \ + $(eval JDK_SPECS_TARGETS += $(CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d))) \ + ) \ + ) +endif + +# Special treatment for generated documentation + +JDWP_PROTOCOL := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/jdwp-protocol.html +$(eval $(call SetupCopyFiles, COPY_JDWP_PROTOCOL, \ + FILES := $(JDWP_PROTOCOL), \ + DEST := $(DOCS_OUTPUTDIR)/specs/jdwp, \ +)) +JDK_SPECS_TARGETS += $(COPY_JDWP_PROTOCOL) + +# Get jvmti.html from the main jvm variant (all variants' jvmti.html are identical). +JVMTI_HTML := $(HOTSPOT_OUTPUTDIR)/variant-$(JVM_VARIANT_MAIN)/gensrc/jvmtifiles/jvmti.html +$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \ + FILES := $(JVMTI_HTML), \ + DEST := $(DOCS_OUTPUTDIR)/specs, \ +)) +JDK_SPECS_TARGETS += $(COPY_JVMTI_HTML) + +################################################################################ +# Optional target which bundles all generated javadocs into a zip archive. + +JAVADOC_ZIP_NAME := jdk-$(VERSION_STRING)-docs.zip +JAVADOC_ZIP_FILE := $(OUTPUT_ROOT)/bundles/$(JAVADOC_ZIP_NAME) + +$(eval $(call SetupZipArchive, BUILD_JAVADOC_ZIP, \ + SRC := $(DOCS_OUTPUTDIR), \ + ZIP := $(JAVADOC_ZIP_FILE), \ + EXTRA_DEPS := $(JDK_API_JAVADOC_TARGETS) $(JDK_API_MODULEGRAPH_TARGETS) \ + $(JDK_SPECS_TARGETS), \ +)) + +ZIP_TARGETS += $(BUILD_JAVADOC_ZIP) + +################################################################################ + +docs-jdk-api-javadoc: $(JDK_API_JAVADOC_TARGETS) $(JDK_API_CUSTOM_TARGETS) + +docs-jdk-api-modulegraph: $(JDK_API_MODULEGRAPH_TARGETS) + +docs-javase-api-javadoc: $(JAVASE_API_JAVADOC_TARGETS) $(JAVASE_API_CUSTOM_TARGETS) + +docs-javase-api-modulegraph: $(JAVASE_API_MODULEGRAPH_TARGETS) + +docs-jdk-specs: $(JDK_SPECS_TARGETS) + +docs-jdk-index: $(JDK_DOCS_INDEX_HTML_TARGETS) + +docs-zip: $(ZIP_TARGETS) + +all: docs-jdk-api-javadoc docs-jdk-api-modulegraph docs-javase-api-javadoc \ + docs-javase-api-modulegraph docs-jdk-specs docs-jdk-index docs-zip + +.PHONY: default all docs-jdk-api-javadoc docs-jdk-api-modulegraph \ + docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs \ + docs-jdk-index docs-zip
--- a/make/Javadoc.gmk Tue May 23 22:38:58 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,461 +0,0 @@ -# Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -default: all - -include $(SPEC) -include MakeBase.gmk -include Modules.gmk -include ProcessMarkdown.gmk -include ZipArchive.gmk -include $(JDK_TOPDIR)/make/Tools.gmk -include $(JDK_TOPDIR)/make/ModuleTools.gmk - -# This is needed to properly setup DOCS_MODULES. -$(eval $(call ReadImportMetaData)) - -################################################################################ - -# Hook to include the corresponding custom file, if present. -$(eval $(call IncludeCustomExtension, , Javadoc.gmk)) - -################################################################################ -# Javadoc settings - -# On top of the sources that was used to compile the JDK, we need some -# extra java.rmi sources that are used just for javadoc. -MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) \ - $(SUPPORT_OUTPUTDIR)/rmic/* $(JDK_TOPDIR)/src/*/share/doc/stub) - -# Should we use -Xdocrootparent? Allow custom to overwrite. -DOCROOTPARENT_FLAG ?= TRUE - -# URLs -JAVADOC_BASE_URL := http://www.oracle.com/pls/topic/lookup?ctx=javase9&id=homepage -BUG_SUBMIT_URL := http://bugreport.java.com/bugreport/ -COPYRIGHT_URL := {@docroot}/../legal/cpyr.html -LICENSE_URL := http://www.oracle.com/technetwork/java/javase/terms/license/java9speclicense.html -REDISTRIBUTION_URL := http://www.oracle.com/technetwork/java/redist-137594.html - - -# In order to get a specific ordering it's necessary to specify the total -# ordering of tags as the tags are otherwise ordered in order of definition. -JAVADOC_TAGS := \ - -tag beaninfo:X \ - -tag revised:X \ - -tag since.unbundled:X \ - -tag spec:X \ - -tag specdefault:X \ - -tag Note:X \ - -tag ToDo:X \ - -tag 'apiNote:a:API Note:' \ - -tag 'implSpec:a:Implementation Requirements:' \ - -tag 'implNote:a:Implementation Note:' \ - -tag param \ - -tag return \ - -tag throws \ - -taglet build.tools.taglet.ModuleGraph \ - -tag since \ - -tag version \ - -tag serialData \ - -tag factory \ - -tag see \ - -tag 'jvms:a:See <cite>The Java™ Virtual Machine Specification</cite>:' \ - -tag 'jls:a:See <cite>The Java™ Language Specification</cite>:' \ - -taglet build.tools.taglet.ExtLink \ - -taglet build.tools.taglet.Incubating \ - -tagletpath $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ - $(CUSTOM_JAVADOC_TAGS) \ - # - -# Which doclint checks to ignore -JAVADOC_DISABLED_DOCLINT := accessibility html missing syntax reference - -# The initial set of options for javadoc -JAVADOC_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \ - -serialwarn -encoding ISO-8859-1 -breakiterator -splitIndex --system none \ - -html5 -javafx --expand-requires transitive - -# Should we add DRAFT stamps to the generated javadoc? -ifeq ($(VERSION_IS_GA), true) - IS_DRAFT := false -else - IS_DRAFT := true -endif - -################################################################################ -# General text snippets - -FULL_COMPANY_NAME := Oracle and/or its affiliates -COMPANY_ADDRESS := 500 Oracle Parkway<br>Redwood Shores, CA 94065 USA - -ifeq ($(IS_DRAFT), true) - DRAFT_MARKER_STR := <br><strong>DRAFT $(VERSION_STRING)</strong> - ifeq ($(VERSION_BUILD), 0) - DRAFT_MARKER_TITLE := [ad-hoc build] - else - DRAFT_MARKER_TITLE := [build $(VERSION_BUILD)] - endif -endif - -JAVADOC_WINDOW_TITLE := Java Platform SE $(VERSION_SPECIFICATION) \ - $(DRAFT_MARKER_TITLE) - -JAVADOC_HEADER_TITLE := $(subst $(SPACE), ,$(strip \ - <strong>Java™ Platform<br>Standard Ed. \ - $(VERSION_SPECIFICATION)</strong>$(DRAFT_MARKER_STR))) - -JAVADOC_BOTTOM := \ - <span style="font-size:smaller"> \ - <a href="$(BUG_SUBMIT_URL)">Submit a bug or feature</a><br> \ - For further API reference and developer documentation, see \ - <a href="$(JAVADOC_BASE_URL)/index.html" target="_blank">Java SE \ - Documentation</a>. That documentation contains more detailed, \ - developer-targeted descriptions, with conceptual overviews, definitions \ - of terms, workarounds, and working code examples.<br> \ - Java is a trademark or registered trademark of $(FULL_COMPANY_NAME) in \ - the US and other countries.<br> \ - <a href="$(COPYRIGHT_URL)">Copyright</a> \ - © 1993, $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \ - $(COMPANY_ADDRESS). All rights reserved. \ - Use is subject to <a href="$(LICENSE_URL)">license terms</a>. Also see the \ - <a href="$(REDISTRIBUTION_URL)">documentation redistribution policy</a>. \ - $(DRAFT_MARKER_STR)</span> - -JAVADOC_TOP := \ - <div style="background-color: $(HASH)EEEEEE"><div style="padding: 6px; \ - margin-top: 2px; margin-bottom: 6px; margin-left: 6px; margin-right: \ - 6px; text-align: justify; font-size: 80%; font-family: Helvetica, Arial, \ - sans-serif; font-weight: normal;">Please note that the specifications \ - and other information contained herein are not final and are subject to \ - change. The information is being made available to you solely for \ - purpose of evaluation.</div></div> - -################################################################################ -# JDK javadoc titles/text snippets - -JDK_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition Development Kit \ - (JDK™) $(VERSION_SPECIFICATION)<br>API Specification - -################################################################################ -# Java SE javadoc titles/text snippets - -JAVASE_JAVADOC_DOC_TITLE := Java™ Platform, Standard Edition \ - $(VERSION_SPECIFICATION)<br>API Specification - -################################################################################ -# Functions - -# Helper function for creating a png file from a dot file generated by the -# GenGraphs tool. -# param 1: SetupJavadocGeneration namespace ($1) -# param 2: module name -# -define setup_gengraph_dot_to_png - $1_$2_DOT_SRC := $$($1_GENGRAPHS_DIR)/$2.dot - $1_$2_PNG_TARGET := $$($1_TARGET_DIR)/$2-graph.png - - # For each module needing a graph, create a png file from the dot file - # generated by the GenGraphs tool and store it in the target dir. - $$($1_$2_PNG_TARGET): $$($1_GENGRAPHS_MARKER) - $$(call MakeDir, $$(@D)) - $$(call ExecuteWithLog, $$($1_$2_DOT_SRC), \ - $$(DOT) -Tpng -o $$($1_$2_PNG_TARGET) $$($1_$2_DOT_SRC)) - - $1_MODULEGRAPH_TARGETS += $$($1_$2_PNG_TARGET) -endef - -################################################################################ -# Setup make rules for creating the API documentation, using javadoc and other -# tools if needed. -# -# Parameter 1 is the name of the rule. This name is used as variable prefix. -# Targets generated are returned as $1_JAVADOC_TARGETS and -# $1_MODULEGRAPH_TARGETS. Note that the index.html file will work as a "touch -# file" for all the magnitude of files that are generated by javadoc. -# -# Remaining parameters are named arguments. These include: -# MODULES - Modules to generate javadoc for -# NAME - The name of the javadoc compilation, to be presented to the user -# TARGET_DIR - Where to store the output -# OVERVIEW - Path to an html overview file -# DOC_TITLE - Title to use in -doctitle. -# WINDOW_TITLE - Title to use in -windowtitle. -# HEADER_TITLE - Title to use in -header. -# BOTTOM_TEXT - Text to use in -bottom. -# TOP_TEXT - Text to use in -top. -# -SetupApiDocsGeneration = $(NamedParamsMacroTemplate) -define SetupApiDocsGenerationBody - - # Figure out all modules, both specified and transitive, that will be processed - # by javadoc. - $1_TRANSITIVE_MODULES := $$(call FindTransitiveDepsForModules, $$($1_MODULES)) - $1_ALL_MODULES := $$(sort $$($1_MODULES) $$($1_TRANSITIVE_MODULES)) - - ifeq ($$(ENABLE_FULL_DOCS), true) - # Tell the ModuleGraph taglet to generate html links to soon-to-be-created - # png files with module graphs. - $1_JAVA_ARGS += -DenableModuleGraph=true - endif - - # Always include tags and basic options - $1_OPTIONS := $$(JAVADOC_TAGS) $$(JAVADOC_OPTIONS) - - $1_OPTIONS += -overview $$($1_OVERVIEW) - $1_OPTIONS += --module-source-path $$(MODULES_SOURCE_PATH) - $1_OPTIONS += --module $$(call CommaList, $$($1_MODULES)) - - # Create a string like "-Xdoclint:all,-syntax,-html,..." - $1_OPTIONS += -Xdoclint:all,$$(call CommaList, $$(addprefix -, \ - $$(JAVADOC_DISABLED_DOCLINT))) - - ifeq ($$($$DOCROOTPARENT_FLAG), TRUE) - $1_OPTIONS += -Xdocrootparent $$(JAVADOC_BASE_URL) - endif - - $1_OPTIONS += -doctitle '$$($1_DOC_TITLE)' - $1_OPTIONS += -windowtitle '$$($1_WINDOW_TITLE)' - $1_OPTIONS += -header '$$($1_HEADER_TITLE)' - $1_OPTIONS += -bottom '$$($1_BOTTOM_TEXT)' - ifeq ($$(IS_DRAFT), true) - $1_OPTIONS += -top '$$($1_TOP_TEXT)' - endif - - # Do not store debug level options in VARDEPS. - ifneq ($$(LOG_LEVEL), trace) - $1_LOG_OPTION += -quiet - else - $1_LOG_OPTION += -verbose - endif - - $1_VARDEPS := $$($1_JAVA_ARGS) $$($1_OPTIONS) $$(MODULES_SOURCE_PATH) \ - $$($1_ALL_MODULES) - $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ - $$(SUPPORT_OUTPUTDIR)/docs/$1.vardeps) - - # Get a list of all files in all the source dirs for all included modules - $1_SOURCE_DEPS := $$(call CacheFind, $$(wildcard $$(foreach module, \ - $$($1_ALL_MODULES), $$(call FindModuleSrcDirs, $$(module))))) - - # Javadoc creates a lot of files but use index.html as a marker - $$($1_TARGET_DIR)/index.html: $$(BUILD_TOOLS_JDK) $$($1_VARDEPS_FILE) \ - $$($1_SOURCE_DEPS) $$($1_OVERVIEW) - $$(call LogWarn, Generating $$($1_NAME) API javadoc for \ - $$(words $$($1_ALL_MODULES)) modules) - $$(call LogInfo, Javadoc modules: $$($1_ALL_MODULES)) - $$(call MakeDir, $$($1_TARGET_DIR)) - $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/docs/$1, \ - $$(JAVA) -Djava.awt.headless=true $$($1_JAVA_ARGS) \ - $$(NEW_JAVADOC) -d $$($1_TARGET_DIR) \ - $$(JAVADOC_TAGS) $$($1_OPTIONS) $$($1_LOG_OPTION)) - - $1_JAVADOC_TARGETS := $$($1_TARGET_DIR)/index.html - - ifeq ($$(ENABLE_FULL_DOCS), true) - # We have asked ModuleGraph to generate links to png files. Now we must - # produce the png files. - - # Locate which modules has the @moduleGraph tag in their module-info.java - $1_MODULES_NEEDING_GRAPH := $$(strip $$(foreach m, $$($1_ALL_MODULES), \ - $$(if $$(shell $$(GREP) -e @moduleGraph \ - $$(wildcard $$(addsuffix /module-info.java, \ - $$(call FindModuleSrcDirs, $$m)))), \ - $$m) \ - )) - - # First we run the GenGraph tool. It will query the module structure of the - # running JVM and output .dot files for all existing modules. - GENGRAPHS_PROPS := \ - $$(JDK_TOPDIR)/make/src/classes/build/tools/jigsaw/javadoc-graphs.properties - - $1_GENGRAPHS_DIR := $$(SUPPORT_OUTPUTDIR)/docs/$1-gengraphs - $1_GENGRAPHS_MARKER := $$($1_GENGRAPHS_DIR)/_gengraphs_run.marker - - $$($1_GENGRAPHS_MARKER): $$(BUILD_JIGSAW_TOOLS) $$(GENGRAPHS_PROPS) - $$(call LogInfo, Running gengraphs for $$($1_NAME) API documentation) - $$(call MakeDir, $$($1_GENGRAPHS_DIR)) - $$(call ExecuteWithLog, $$($1_GENGRAPHS_DIR)/gengraphs, \ - $$(TOOL_GENGRAPHS) --spec --output $$($1_GENGRAPHS_DIR) \ - --dot-attributes $$(GENGRAPHS_PROPS) && \ - $$(TOUCH) $$($1_GENGRAPHS_MARKER)) - - # For each module needing a graph, create a png file from the dot file - # generated by the GenGraphs tool and store it in the target dir. - # They will depend on $1_GENGRAPHS_MARKER, and will be added to $1. - $$(foreach m, $$($1_MODULES_NEEDING_GRAPH), \ - $$(eval $$(call setup_gengraph_dot_to_png,$1,$$m)) \ - ) - endif -endef - -################################################################################ -# Setup generation of the JDK API documentation (javadoc + modulegraph) - -# All modules to have docs generated by docs-jdk-api target -JDK_JAVADOC_MODULES := $(sort $(DOCS_MODULES)) - -JDK_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html - -$(eval $(call SetupApiDocsGeneration, JDK_API, \ - MODULES := $(JDK_JAVADOC_MODULES), \ - NAME := JDK, \ - TARGET_DIR := $(JAVADOC_OUTPUTDIR)/api, \ - OVERVIEW := $(JDK_JAVADOC_OVERVIEW), \ - DOC_TITLE := $(JDK_JAVADOC_DOC_TITLE), \ - WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \ - HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \ - BOTTOM_TEXT := $(JAVADOC_BOTTOM), \ - TOP_TEXT := $(JAVADOC_TOP), \ -)) - -# Targets generated are returned in JDK_API_JAVADOC_TARGETS and -# JDK_API_MODULEGRAPH_TARGETS. - -################################################################################ -# Setup generation of the Java SE API documentation (javadoc + modulegraph) - -# The Java SE module scope is just java.se.ee and it's transitive modules. -JAVASE_JAVADOC_MODULES := java.se.ee - -JAVASE_JAVADOC_OVERVIEW := $(JDK_TOPDIR)/src/java.base/share/classes/overview-core.html - -$(eval $(call SetupApiDocsGeneration, JAVASE_API, \ - MODULES := $(JAVASE_JAVADOC_MODULES), \ - NAME := Java SE, \ - TARGET_DIR := $(IMAGES_OUTPUTDIR)/javase-docs/api, \ - OVERVIEW := $(JAVASE_JAVADOC_OVERVIEW), \ - DOC_TITLE := $(JAVASE_JAVADOC_DOC_TITLE), \ - WINDOW_TITLE := $(JAVADOC_WINDOW_TITLE), \ - HEADER_TITLE := $(JAVADOC_HEADER_TITLE), \ - BOTTOM_TEXT := $(JAVADOC_BOTTOM), \ - TOP_TEXT := $(JAVADOC_TOP), \ -)) - -# Targets generated are returned in JAVASE_API_JAVADOC_TARGETS and -# JAVASE_API_MODULEGRAPH_TARGETS. - -################################################################################ -# Copy JDK specs files - -# For all html documentation in $module/share/specs directories, copy it -# unmodified - -ALL_MODULES := $(call FindAllModules) -COPY_SPEC_FILTER := %.html %.gif %.jpg %.mib %.css - -$(foreach m, $(ALL_MODULES), \ - $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \ - $(if $(SPECS_$m), \ - $(eval $(call SetupCopyFiles, COPY_$m, \ - SRC := $(SPECS_$m), \ - FILES := $(filter $(COPY_SPEC_FILTER), $(call CacheFind, $(SPECS_$m))), \ - DEST := $(JAVADOC_OUTPUTDIR)/specs/, \ - )) \ - $(eval JDK_SPECS_TARGETS += $(COPY_$m)) \ - ) \ -) - -# Copy the global resources -GLOBAL_SPECS_RESOURCES_DIR := $(JDK_TOPDIR)/make/data/docs-resources/specs -$(eval $(call SetupCopyFiles, COPY_GLOBAL_RESOURCES, \ - SRC := $(GLOBAL_SPECS_RESOURCES_DIR), \ - FILES := $(call CacheFind, $(GLOBAL_SPECS_RESOURCES_DIR)), \ - DEST := $(JAVADOC_OUTPUTDIR)/specs/, \ -)) -JDK_SPECS_TARGETS += $(COPY_GLOBAL_RESOURCES) - -ifeq ($(ENABLE_FULL_DOCS), true) - # For all markdown files in $module/share/specs directories, convert them to - # html. - - GLOBAL_SPECS_DEFAULT_CSS_FILE := $(JAVADOC_OUTPUTDIR)/specs/resources/jdk-default.css - - $(foreach m, $(ALL_MODULES), \ - $(eval SPECS_$m := $(call FindModuleSpecsDirs, $m)) \ - $(foreach d, $(SPECS_$m), \ - $(if $(filter %.md, $(call CacheFind, $d)), \ - $(eval $(call SetupProcessMarkdown, CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d), \ - SRC := $d, \ - FILES := $(filter %.md, $(call CacheFind, $d)), \ - DEST := $(JAVADOC_OUTPUTDIR)/specs/, \ - CSS := $(GLOBAL_SPECS_DEFAULT_CSS_FILE), \ - )) \ - ) \ - $(eval JDK_SPECS_TARGETS += $(CONVERT_MARKDOWN_$m_$(patsubst $(TOPDIR)/%,%,$d))) \ - ) \ - ) -endif - -# Special treatment for generated documentation - -JDWP_PROTOCOL := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/jdwp-protocol.html -$(eval $(call SetupCopyFiles, COPY_JDWP_PROTOCOL, \ - FILES := $(JDWP_PROTOCOL), \ - DEST := $(JAVADOC_OUTPUTDIR)/specs/jdwp, \ -)) -JDK_SPECS_TARGETS += $(COPY_JDWP_PROTOCOL) - -# Get jvmti.html from the main jvm variant (all variants' jvmti.html are identical). -JVMTI_HTML := $(HOTSPOT_OUTPUTDIR)/variant-$(JVM_VARIANT_MAIN)/gensrc/jvmtifiles/jvmti.html -$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \ - FILES := $(JVMTI_HTML), \ - DEST := $(JAVADOC_OUTPUTDIR)/specs, \ -)) -JDK_SPECS_TARGETS += $(COPY_JVMTI_HTML) - -################################################################################ -# Optional target which bundles all generated javadocs into a zip archive. - -JAVADOC_ZIP_NAME := jdk-$(VERSION_STRING)-docs.zip -JAVADOC_ZIP_FILE := $(OUTPUT_ROOT)/bundles/$(JAVADOC_ZIP_NAME) - -$(eval $(call SetupZipArchive, BUILD_JAVADOC_ZIP, \ - SRC := $(JAVADOC_OUTPUTDIR), \ - ZIP := $(JAVADOC_ZIP_FILE), \ - EXTRA_DEPS := $(JDK_API_JAVADOC_TARGETS) $(JDK_API_MODULEGRAPH_TARGETS) \ - $(JDK_SPECS_TARGETS), \ -)) - -ZIP_TARGETS += $(BUILD_JAVADOC_ZIP) - -################################################################################ - -docs-jdk-api-javadoc: $(JDK_API_JAVADOC_TARGETS) - -docs-jdk-api-modulegraph: $(JDK_API_MODULEGRAPH_TARGETS) - -docs-javase-api-javadoc: $(JAVASE_API_JAVADOC_TARGETS) - -docs-javase-api-modulegraph: $(JAVASE_API_MODULEGRAPH_TARGETS) - -docs-jdk-specs: $(JDK_SPECS_TARGETS) - -docs-zip: $(ZIP_TARGETS) - -all: docs-jdk-api-javadoc docs-jdk-api-modulegraph docs-javase-api-javadoc \ - docs-javase-api-modulegraph docs-jdk-specs docs-zip - -.PHONY: default all docs-jdk-api-javadoc docs-jdk-api-modulegraph \ - docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs docs-zip
--- a/make/Main.gmk Tue May 23 22:38:58 2017 +0000 +++ b/make/Main.gmk Wed Jul 05 23:29:16 2017 +0200 @@ -277,7 +277,10 @@ demos-jdk: +($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileDemos.gmk) -ALL_TARGETS += demos-jdk +test-image-demos-jdk: + +($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f CompileDemos.gmk images) + +ALL_TARGETS += demos-jdk test-image-demos-jdk ################################################################################ # Jigsaw specific data and analysis targets. @@ -363,29 +366,32 @@ # If building full docs, to complete docs-*-api we need both the javadoc and # modulegraph targets. docs-jdk-api-javadoc: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-api-javadoc) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-api-javadoc) docs-jdk-api-modulegraph: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-api-modulegraph) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-api-modulegraph) docs-javase-api-javadoc: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-javase-api-javadoc) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-javase-api-javadoc) docs-javase-api-modulegraph: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-javase-api-modulegraph) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-javase-api-modulegraph) docs-jdk-specs: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-jdk-specs) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-specs) + +docs-jdk-index: + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-jdk-index) docs-zip: - +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs-zip) + +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Docs.gmk docs-zip) update-build-docs: +($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f UpdateBuildDocs.gmk) ALL_TARGETS += docs-jdk-api-javadoc docs-jdk-api-modulegraph \ docs-javase-api-javadoc docs-javase-api-modulegraph docs-jdk-specs \ - docs-zip update-build-docs + docs-jdk-index docs-zip update-build-docs ################################################################################ # Cross compilation support @@ -631,6 +637,7 @@ # jdk libs, even though they don't need to. To avoid warnings, make sure they # aren't built until after libjava and libjvm are available to link to. demos-jdk: java.base-libs exploded-image-optimize + test-image-demos-jdk: demos-jdk # Declare dependency from <module>-java to <module>-gensrc $(foreach m, $(GENSRC_MODULES), $(eval $m-java: $m-gensrc)) @@ -793,6 +800,8 @@ # The gensrc steps for hotspot and jdk.jdi create html spec files. docs-jdk-specs: hotspot-$(JVM_VARIANT_MAIN)-gensrc jdk.jdi-gensrc + docs-jdk-index: exploded-image buildtools-modules + docs-zip: docs-jdk test: jdk-image test-image @@ -922,7 +931,7 @@ docs-javase-api: docs-javase-api-modulegraph endif -docs-jdk: docs-jdk-api docs-jdk-specs +docs-jdk: docs-jdk-api docs-jdk-specs docs-jdk-index docs-javase: docs-javase-api # alias for backwards compatibility @@ -963,7 +972,8 @@ # This target builds the test image test-image: prepare-test-image test-image-hotspot-jtreg-native \ - test-image-jdk-jtreg-native test-image-failure-handler test-image-hotspot-gtest + test-image-jdk-jtreg-native test-image-failure-handler test-image-hotspot-gtest \ + test-image-demos-jdk # all-images builds all our deliverables as images. all-images: product-images test-image docs-image
--- a/make/RunTests.gmk Tue May 23 22:38:58 2017 +0000 +++ b/make/RunTests.gmk Wed Jul 05 23:29:16 2017 +0200 @@ -299,6 +299,12 @@ $1_TEST_NAME := $$(strip $$(patsubst jtreg:%, %, $$($1_TEST))) $1_COMPONENT := $$(firstword $$(subst /, $$(SPACE), $$($1_TEST_NAME))) + ifeq ($$(JT_HOME), ) + $$(info Error: jtreg framework is not found.) + $$(info Please run configure using --with-jtreg.) + $$(error Cannot continue) + endif + # Unfortunately, we need different defaults for some JTREG values, # depending on what component we're running.
--- a/make/common/Modules.gmk Tue May 23 22:38:58 2017 +0000 +++ b/make/common/Modules.gmk Wed Jul 05 23:29:16 2017 +0200 @@ -391,7 +391,10 @@ else ifeq ($$(classloader), ext) PLATFORM_MODULES += $1 endif - DOCS_MODULES += $1 + ifneq ($$(include_in_docs), false) + # defaults to true if unspecified + DOCS_MODULES += $1 + endif else # Default to include in all JRE_MODULES += $1
--- a/test/lib/RedefineClassHelper.java Tue May 23 22:38:58 2017 +0000 +++ b/test/lib/RedefineClassHelper.java Wed Jul 05 23:29:16 2017 +0200 @@ -23,7 +23,7 @@ import java.io.PrintWriter; import java.lang.instrument.*; -import jdk.test.lib.InMemoryJavaCompiler; +import jdk.test.lib.compiler.InMemoryJavaCompiler; /* * Helper class to write tests that redefine classes.
--- a/test/lib/jdk/test/lib/DynamicVMOption.java Tue May 23 22:38:58 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package jdk.test.lib; - -import com.sun.management.HotSpotDiagnosticMXBean; -import java.lang.management.ManagementFactory; - -/** - * A utility class to work with VM options which could be altered during - * execution. - * - * This class is a wrapper around {@code com.sun.management.VMOption}. - * It provides more convenient interface to read/write the values. - * - */ -public class DynamicVMOption { - - private final HotSpotDiagnosticMXBean mxBean; - - /** - * VM option name, like "MinHeapFreeRatio". - */ - public final String name; - - /** - * Creates an instance of DynamicVMOption. - * - * @param name the VM option name - */ - public DynamicVMOption(String name) { - this.name = name; - mxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); - } - - /** - * Sets a new value for the option. - * Trying to set not applicable value will cause IllegalArgumentException. - * Behavior with null is undefined, most likely NPE will be thrown. - * - * @param newValue the value to be set - * @see #getValue() - * @throws IllegalArgumentException if newValue is not applicable to the option - */ - public final void setValue(String newValue) { - mxBean.setVMOption(name, newValue); - } - - /** - * Returns the value of option. - * - * @return the current option value - * @see #setValue(java.lang.String) - */ - public final String getValue() { - return mxBean.getVMOption(name).getValue(); - } - - /** - * Returns true, if option is writable, false otherwise. - * - * @return true, if option is writable, false otherwise - */ - public final boolean isWriteable() { - return mxBean.getVMOption(name).isWriteable(); - } - - /** - * Checks if the given value is applicable for the option. - * - * This method tries to set the option to the new value. If no exception - * has been thrown the value is treated as valid. - * - * Calling this method will not change the option value. After an attempt - * to set a new value, the option will be restored to its previous value. - * - * @param value the value to verify - * @return true if option could be set to the given value - */ - public boolean isValidValue(String value) { - boolean isValid = true; - String oldValue = getValue(); - try { - setValue(value); - } catch (NullPointerException e) { - if (value == null) { - isValid = false; - } - } catch (IllegalArgumentException e) { - isValid = false; - } finally { - setValue(oldValue); - } - return isValid; - } - - /** - * Returns the value of the given VM option as String. - * - * This is a simple shortcut for {@code new DynamicVMOption(name).getValue()} - * - * @param name the name of VM option - * @return value as a string - * @see #getValue() - */ - public static String getString(String name) { - return new DynamicVMOption(name).getValue(); - } - - /** - * Returns the value of the given option as int. - * - * @param name the name of VM option - * @return value parsed as integer - * @see #getString(java.lang.String) - * - */ - public static int getInt(String name) { - return Integer.parseInt(getString(name)); - } - - /** - * Sets the VM option to a new value. - * - * This is a simple shortcut for {@code new DynamicVMOption(name).setValue(value)} - * - * @param name the name of VM option - * @param value the value to be set - * @see #setValue(java.lang.String) - */ - public static void setString(String name, String value) { - new DynamicVMOption(name).setValue(value); - } - - /** - * Sets the VM option value to a new integer value. - * - * @param name the name of VM option - * @param value the integer value to be set - * @see #setString(java.lang.String, java.lang.String) - */ - public static void setInt(String name, int value) { - new DynamicVMOption(name).setValue(Integer.toString(value)); - } - -}
--- a/test/lib/jdk/test/lib/InMemoryJavaCompiler.java Tue May 23 22:38:58 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.test.lib; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.tools.ForwardingJavaFileManager; -import javax.tools.FileObject; -import javax.tools.JavaCompiler; -import javax.tools.JavaCompiler.CompilationTask; -import javax.tools.JavaFileObject; -import javax.tools.JavaFileObject.Kind; -import javax.tools.SimpleJavaFileObject; -import javax.tools.StandardLocation; -import javax.tools.ToolProvider; - -/** - * {@code InMemoryJavaCompiler} can be used for compiling a {@link - * CharSequence} to a {@code byte[]}. - * - * The compiler will not use the file system at all, instead using a {@link - * ByteArrayOutputStream} for storing the byte code. For the source code, any - * kind of {@link CharSequence} can be used, e.g. {@link String}, {@link - * StringBuffer} or {@link StringBuilder}. - * - * The {@code InMemoryCompiler} can easily be used together with a {@code - * ByteClassLoader} to easily compile and load source code in a {@link String}: - * - * <pre> - * {@code - * import jdk.test.lib.InMemoryJavaCompiler; - * import jdk.test.lib.ByteClassLoader; - * - * class Example { - * public static void main(String[] args) { - * String className = "Foo"; - * String sourceCode = "public class " + className + " {" + - * " public void bar() {" + - * " System.out.println("Hello from bar!");" + - * " }" + - * "}"; - * byte[] byteCode = InMemoryJavaCompiler.compile(className, sourceCode); - * Class fooClass = ByteClassLoader.load(className, byteCode); - * } - * } - * } - * </pre> - */ -public class InMemoryJavaCompiler { - private static class MemoryJavaFileObject extends SimpleJavaFileObject { - private final String className; - private final CharSequence sourceCode; - private final ByteArrayOutputStream byteCode; - - public MemoryJavaFileObject(String className, CharSequence sourceCode) { - super(URI.create("string:///" + className.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE); - this.className = className; - this.sourceCode = sourceCode; - this.byteCode = new ByteArrayOutputStream(); - } - - @Override - public CharSequence getCharContent(boolean ignoreEncodingErrors) { - return sourceCode; - } - - @Override - public OutputStream openOutputStream() throws IOException { - return byteCode; - } - - public byte[] getByteCode() { - return byteCode.toByteArray(); - } - - public String getClassName() { - return className; - } - } - - private static class FileManagerWrapper extends ForwardingJavaFileManager { - private static final Location PATCH_LOCATION = new Location() { - @Override - public String getName() { - return "patch module location"; - } - - @Override - public boolean isOutputLocation() { - return false; - } - }; - private final MemoryJavaFileObject file; - private final String moduleOverride; - - public FileManagerWrapper(MemoryJavaFileObject file, String moduleOverride) { - super(getCompiler().getStandardFileManager(null, null, null)); - this.file = file; - this.moduleOverride = moduleOverride; - } - - @Override - public JavaFileObject getJavaFileForOutput(Location location, String className, - Kind kind, FileObject sibling) - throws IOException { - if (!file.getClassName().equals(className)) { - throw new IOException("Expected class with name " + file.getClassName() + - ", but got " + className); - } - return file; - } - - @Override - public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException { - if (fo == file && moduleOverride != null) { - return PATCH_LOCATION; - } - return super.getLocationForModule(location, fo); - } - - @Override - public String inferModuleName(Location location) throws IOException { - if (location == PATCH_LOCATION) { - return moduleOverride; - } - return super.inferModuleName(location); - } - - @Override - public boolean hasLocation(Location location) { - return super.hasLocation(location) || location == StandardLocation.PATCH_MODULE_PATH; - } - - } - - /** - * Compiles the class with the given name and source code. - * - * @param className The name of the class - * @param sourceCode The source code for the class with name {@code className} - * @param options additional command line options - * @throws RuntimeException if the compilation did not succeed - * @return The resulting byte code from the compilation - */ - public static byte[] compile(String className, CharSequence sourceCode, String... options) { - MemoryJavaFileObject file = new MemoryJavaFileObject(className, sourceCode); - CompilationTask task = getCompilationTask(file, options); - - if(!task.call()) { - throw new RuntimeException("Could not compile " + className + " with source code " + sourceCode); - } - - return file.getByteCode(); - } - - private static JavaCompiler getCompiler() { - return ToolProvider.getSystemJavaCompiler(); - } - - private static CompilationTask getCompilationTask(MemoryJavaFileObject file, String... options) { - List<String> opts = new ArrayList<>(); - String moduleOverride = null; - for (String opt : options) { - if (opt.startsWith("-Xmodule:")) { - moduleOverride = opt.substring("-Xmodule:".length()); - } else { - opts.add(opt); - } - } - return getCompiler().getTask(null, new FileManagerWrapper(file, moduleOverride), null, opts, null, Arrays.asList(file)); - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/LockFreeLogger.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib; + +import java.util.Collection; +import java.util.Comparator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +/** + * A logger designed specifically to allow collecting ordered log messages + * in a multi-threaded environment without involving any kind of locking. + * <p> + * It is particularly useful in situations when one needs to assert various + * details about the tested thread state or the locks it hold while also wanting + * to produce diagnostic log messages. + * <p> + * The logger does not provide any guarantees about the completness of the + * logs written from different threads - it is up to the caller to make sure + * {@code toString()} method is called only when all the activity has ceased + * and the per-thread logs contain all the necessary data. + * + * @author Jaroslav Bachorik + **/ +public class LockFreeLogger { + private final AtomicInteger logCntr = new AtomicInteger(0); + private final Collection<Map<Integer, String>> allRecords = new ConcurrentLinkedQueue<>(); + private final ThreadLocal<Map<Integer, String>> records = ThreadLocal.withInitial(ConcurrentHashMap::new); + + public LockFreeLogger() { + allRecords.add(records.get()); + } + + /** + * Log a message + * @param format Message format + * @param params Message parameters + */ + public void log(String format, Object ... params) { + int id = logCntr.getAndIncrement(); + records.get().put(id, String.format(format, params)); + } + + /** + * Will generate an aggregated log of chronologically ordered messages. + * <p> + * Make sure that you call this method only when all the related threads + * have finished; otherwise you might get incomplete data. + * + * @return An aggregated log of chronologically ordered messages + */ + @Override + public String toString() { + return allRecords.stream() + .flatMap(m -> m.entrySet().stream()) + .sorted(Comparator.comparing(Map.Entry::getKey)) + .map(Map.Entry::getValue) + .collect(Collectors.joining()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/NetworkConfiguration.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib; + +import java.io.PrintStream; +import java.io.UncheckedIOException; +import java.io.IOException; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import static java.net.NetworkInterface.getNetworkInterfaces; +import static java.util.Collections.list; + +/** + * Helper class for retrieving network interfaces and local addresses + * suitable for testing. + */ +public class NetworkConfiguration { + + private Map<NetworkInterface,List<Inet4Address>> ip4Interfaces; + private Map<NetworkInterface,List<Inet6Address>> ip6Interfaces; + + private NetworkConfiguration( + Map<NetworkInterface,List<Inet4Address>> ip4Interfaces, + Map<NetworkInterface,List<Inet6Address>> ip6Interfaces) { + this.ip4Interfaces = ip4Interfaces; + this.ip6Interfaces = ip6Interfaces; + } + + /** + * Returns a stream of interfaces suitable for functional tests. + */ + public Stream<NetworkInterface> interfaces() { + return Stream.concat(ip4Interfaces(), ip6Interfaces()) + .distinct(); + } + + /** + * Returns a stream of interfaces suitable for IPv4 functional tests. + */ + public Stream<NetworkInterface> ip4Interfaces() { + return ip4Interfaces.keySet() + .stream() + .filter(NetworkConfiguration::isNotExcludedInterface) + .filter(hasIp4Addresses); + } + + /** + * Returns a stream of interfaces suitable for IPv6 functional tests. + */ + public Stream<NetworkInterface> ip6Interfaces() { + return ip6Interfaces.keySet() + .stream() + .filter(NetworkConfiguration::isNotExcludedInterface) + .filter(hasIp6Addresses); + } + + private static boolean isNotExcludedInterface(NetworkInterface nif) { + if (Platform.isOSX() && nif.getName().contains("awdl")) { + return false; + } + String dName = nif.getDisplayName(); + if (Platform.isWindows() && dName != null && dName.contains("Teredo")) { + return false; + } + return true; + } + + private final Predicate<NetworkInterface> hasIp4Addresses = nif -> + ip4Interfaces.get(nif).stream().anyMatch(a -> !a.isAnyLocalAddress()); + + private final Predicate<NetworkInterface> hasIp6Addresses = nif -> + ip6Interfaces.get(nif).stream().anyMatch(a -> !a.isAnyLocalAddress()); + + + /** + * Returns a stream of interfaces suitable for IPv4 multicast tests. + */ + public Stream<NetworkInterface> ip4MulticastInterfaces() { + return ip4Interfaces().filter(supportsIp4Multicast); + } + + /** + * Returns a stream of interfaces suitable for IPv6 multicast tests. + */ + public Stream<NetworkInterface> ip6MulticastInterfaces() { + return ip6Interfaces().filter(supportsIp6Multicast); + } + + private final Predicate<NetworkInterface> supportsIp4Multicast = nif -> { + try { + if (!nif.supportsMulticast() || nif.isLoopback()) { + return false; + } + return hasIp4Addresses.test(nif); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }; + + private final Predicate<NetworkInterface> supportsIp6Multicast = nif -> { + try { + if (!nif.supportsMulticast() || nif.isLoopback()) { + return false; + } + + return hasIp6Addresses.test(nif); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }; + + /** + * Returns all addresses on all "functional" interfaces. + */ + public Stream<InetAddress> addresses(NetworkInterface nif) { + return Stream.concat(ip4Interfaces.get(nif).stream(), + ip6Interfaces.get(nif).stream()); + } + + /** + * Returns all IPv4 addresses on all "functional" interfaces. + */ + public Stream<Inet4Address> ip4Addresses() { + return ip4Interfaces().flatMap(this::ip4Addresses); + } + + /** + * Returns all IPv6 addresses on all "functional" interfaces. + */ + public Stream<Inet6Address> ip6Addresses() { + return ip6Interfaces().flatMap(this::ip6Addresses); + } + + /** + * Returns all IPv4 addresses the given interface. + */ + public Stream<Inet4Address> ip4Addresses(NetworkInterface nif) { + return ip4Interfaces.get(nif).stream(); + } + + /** + * Returns all IPv6 addresses for the given interface. + */ + public Stream<Inet6Address> ip6Addresses(NetworkInterface nif) { + return ip6Interfaces.get(nif).stream(); + } + + /** + * Return a NetworkConfiguration instance. + */ + public static NetworkConfiguration probe() throws IOException { + Map<NetworkInterface, List<Inet4Address>> ip4Interfaces = new HashMap<>(); + Map<NetworkInterface, List<Inet6Address>> ip6Interfaces = new HashMap<>(); + + List<NetworkInterface> nifs = list(getNetworkInterfaces()); + for (NetworkInterface nif : nifs) { + // ignore interfaces that are down + if (!nif.isUp() || nif.isPointToPoint()) { + continue; + } + + List<Inet4Address> ip4Addresses = new LinkedList<>(); + List<Inet6Address> ip6Addresses = new LinkedList<>(); + ip4Interfaces.put(nif, ip4Addresses); + ip6Interfaces.put(nif, ip6Addresses); + for (InetAddress addr : list(nif.getInetAddresses())) { + if (addr instanceof Inet4Address) { + ip4Addresses.add((Inet4Address) addr); + } else if (addr instanceof Inet6Address) { + ip6Addresses.add((Inet6Address) addr); + } + } + } + return new NetworkConfiguration(ip4Interfaces, ip6Interfaces); + } + + @Override + public String toString() { + return interfaces().map(NetworkConfiguration::interfaceInformation) + .collect(Collectors.joining()); + } + + /** Returns detailed information for the given interface. */ + public static String interfaceInformation(NetworkInterface nif) { + StringBuilder sb = new StringBuilder(); + try { + sb.append("Display name: ") + .append(nif.getDisplayName()) + .append("\n"); + sb.append("Name: ") + .append(nif.getName()) + .append("\n"); + for (InetAddress inetAddress : list(nif.getInetAddresses())) { + sb.append("InetAddress: ") + .append(inetAddress) + .append("\n"); + } + sb.append("Up? ") + .append(nif.isUp()) + .append("\n"); + sb.append("Loopback? ") + .append(nif.isLoopback()) + .append("\n"); + sb.append("PointToPoint? ") + .append(nif.isPointToPoint()) + .append("\n"); + sb.append("Supports multicast? ") + .append(nif.supportsMulticast()) + .append("\n"); + sb.append("Virtual? ") + .append(nif.isVirtual()) + .append("\n"); + sb.append("Hardware address: ") + .append(Arrays.toString(nif.getHardwareAddress())) + .append("\n"); + sb.append("MTU: ") + .append(nif.getMTU()) + .append("\n"); + sb.append("Index: ") + .append(nif.getIndex()) + .append("\n"); + sb.append("\n"); + return sb.toString(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + /** Prints all the system interface information to the give stream. */ + public static void printSystemConfiguration(PrintStream out) { + try { + out.println("*** all system network interface configuration ***"); + for (NetworkInterface nif : list(getNetworkInterfaces())) { + out.print(interfaceInformation(nif)); + } + out.println("*** end ***"); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/classloader/FilterClassLoader.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.classloader; + +import java.util.function.Predicate; +/** + * A classloader, which using target classloader in case provided condition + * for class name is met, and using parent otherwise + */ +public class FilterClassLoader extends ClassLoader { + + private final ClassLoader target; + private final Predicate<String> condition; + + public FilterClassLoader(ClassLoader target, ClassLoader parent, + Predicate<String> condition) { + super(parent); + this.condition = condition; + this.target = target; + } + + @Override + public Class<?> loadClass(String name) throws ClassNotFoundException { + if (condition.test(name)) { + return target.loadClass(name); + } + return super.loadClass(name); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/classloader/ParentLastURLClassLoader.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.classloader; + +import java.net.URL; +import java.net.URLClassLoader; + +/** + * An url classloader, which trying to load class from provided URL[] first, + * and using parent classloader in case it failed + */ +public class ParentLastURLClassLoader extends URLClassLoader { + + public ParentLastURLClassLoader(URL urls[], ClassLoader parent) { + super(urls, parent); + } + + @Override + public Class<?> loadClass(String name) throws ClassNotFoundException { + try { + Class<?> c = findClass(name); + if (c != null) { + return c; + } + } catch (ClassNotFoundException e) { + // ignore + } + return super.loadClass(name); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/compiler/InMemoryJavaCompiler.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.compiler; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.tools.ForwardingJavaFileManager; +import javax.tools.FileObject; +import javax.tools.JavaCompiler; +import javax.tools.JavaCompiler.CompilationTask; +import javax.tools.JavaFileObject; +import javax.tools.JavaFileObject.Kind; +import javax.tools.SimpleJavaFileObject; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; + +/** + * {@code InMemoryJavaCompiler} can be used for compiling a {@link + * CharSequence} to a {@code byte[]}. + * + * The compiler will not use the file system at all, instead using a {@link + * ByteArrayOutputStream} for storing the byte code. For the source code, any + * kind of {@link CharSequence} can be used, e.g. {@link String}, {@link + * StringBuffer} or {@link StringBuilder}. + * + * The {@code InMemoryCompiler} can easily be used together with a {@code + * ByteClassLoader} to easily compile and load source code in a {@link String}: + * + * <pre> + * {@code + * import jdk.test.lib.compiler.InMemoryJavaCompiler; + * import jdk.test.lib.ByteClassLoader; + * + * class Example { + * public static void main(String[] args) { + * String className = "Foo"; + * String sourceCode = "public class " + className + " {" + + * " public void bar() {" + + * " System.out.println("Hello from bar!");" + + * " }" + + * "}"; + * byte[] byteCode = InMemoryJavaCompiler.compile(className, sourceCode); + * Class fooClass = ByteClassLoader.load(className, byteCode); + * } + * } + * } + * </pre> + */ +public class InMemoryJavaCompiler { + private static class MemoryJavaFileObject extends SimpleJavaFileObject { + private final String className; + private final CharSequence sourceCode; + private final ByteArrayOutputStream byteCode; + + public MemoryJavaFileObject(String className, CharSequence sourceCode) { + super(URI.create("string:///" + className.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE); + this.className = className; + this.sourceCode = sourceCode; + this.byteCode = new ByteArrayOutputStream(); + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return sourceCode; + } + + @Override + public OutputStream openOutputStream() throws IOException { + return byteCode; + } + + public byte[] getByteCode() { + return byteCode.toByteArray(); + } + + public String getClassName() { + return className; + } + } + + private static class FileManagerWrapper extends ForwardingJavaFileManager { + private static final Location PATCH_LOCATION = new Location() { + @Override + public String getName() { + return "patch module location"; + } + + @Override + public boolean isOutputLocation() { + return false; + } + }; + private final MemoryJavaFileObject file; + private final String moduleOverride; + + public FileManagerWrapper(MemoryJavaFileObject file, String moduleOverride) { + super(getCompiler().getStandardFileManager(null, null, null)); + this.file = file; + this.moduleOverride = moduleOverride; + } + + @Override + public JavaFileObject getJavaFileForOutput(Location location, String className, + Kind kind, FileObject sibling) + throws IOException { + if (!file.getClassName().equals(className)) { + throw new IOException("Expected class with name " + file.getClassName() + + ", but got " + className); + } + return file; + } + + @Override + public Location getLocationForModule(Location location, JavaFileObject fo) throws IOException { + if (fo == file && moduleOverride != null) { + return PATCH_LOCATION; + } + return super.getLocationForModule(location, fo); + } + + @Override + public String inferModuleName(Location location) throws IOException { + if (location == PATCH_LOCATION) { + return moduleOverride; + } + return super.inferModuleName(location); + } + + @Override + public boolean hasLocation(Location location) { + return super.hasLocation(location) || location == StandardLocation.PATCH_MODULE_PATH; + } + + } + + /** + * Compiles the class with the given name and source code. + * + * @param className The name of the class + * @param sourceCode The source code for the class with name {@code className} + * @param options additional command line options + * @throws RuntimeException if the compilation did not succeed + * @return The resulting byte code from the compilation + */ + public static byte[] compile(String className, CharSequence sourceCode, String... options) { + MemoryJavaFileObject file = new MemoryJavaFileObject(className, sourceCode); + CompilationTask task = getCompilationTask(file, options); + + if(!task.call()) { + throw new RuntimeException("Could not compile " + className + " with source code " + sourceCode); + } + + return file.getByteCode(); + } + + private static JavaCompiler getCompiler() { + return ToolProvider.getSystemJavaCompiler(); + } + + private static CompilationTask getCompilationTask(MemoryJavaFileObject file, String... options) { + List<String> opts = new ArrayList<>(); + String moduleOverride = null; + for (String opt : options) { + if (opt.startsWith("-Xmodule:")) { + moduleOverride = opt.substring("-Xmodule:".length()); + } else { + opts.add(opt); + } + } + return getCompiler().getTask(null, new FileManagerWrapper(file, moduleOverride), null, opts, null, Arrays.asList(file)); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/compiler/ModuleInfoMaker.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.compiler; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +/** + * Utility class for creating test modules. + */ +public class ModuleInfoMaker { + private static final String MODULE_INFO_JAVA = "module-info.java"; + private static final Pattern MODULE_PATTERN = + Pattern.compile("module\\s+((?:\\w+\\.)*)"); + private static final Pattern PACKAGE_PATTERN = + Pattern.compile("package\\s+(((?:\\w+\\.)*)(?:\\w+))"); + private static final Pattern CLASS_PATTERN = + Pattern.compile("(?:public\\s+)?(?:class|enum|interface)\\s+(\\w+)"); + + private final Path dir; + + public ModuleInfoMaker(Path dir) { + this.dir = dir; + } + + /** + * Create java source files of the given module + */ + public void writeJavaFiles(String module, String moduleInfoJava, String... contents) + throws IOException + { + Path msrc = dir.resolve(module); + new JavaSource(moduleInfoJava).write(msrc); + for (String c : contents) { + new JavaSource(c).write(msrc); + } + } + + /** + * Compile the module to the given destination. + */ + public void compile(String module, Path dest, String... options) + throws IOException + { + Path msrc = dir.resolve(module); + String[] args = + Stream.concat(Arrays.stream(options), + Stream.of("--module-source-path", + dir.toString())).toArray(String[]::new); + if (!CompilerUtils.compile(msrc, dest, args)) { + throw new Error("Fail to compile " + module); + } + } + + static class JavaSource { + final String source; + JavaSource(String source) { + this.source = source; + } + + /** + * Writes the source code to a file in a specified directory. + * @param dir the directory + * @throws IOException if there is a problem writing the file + */ + public void write(Path dir) throws IOException { + Path file = dir.resolve(getJavaFileNameFromSource(source)); + Files.createDirectories(file.getParent()); + try (BufferedWriter out = Files.newBufferedWriter(file)) { + out.write(source.replace("\n", System.lineSeparator())); + } + } + + /** + * Extracts the Java file name from the class declaration. + * This method is intended for simple files and uses regular expressions, + * so comments matching the pattern can make the method fail. + */ + static String getJavaFileNameFromSource(String source) { + String packageName = null; + + Matcher matcher = MODULE_PATTERN.matcher(source); + if (matcher.find()) + return MODULE_INFO_JAVA; + + matcher = PACKAGE_PATTERN.matcher(source); + if (matcher.find()) + packageName = matcher.group(1).replace(".", "/"); + + matcher = CLASS_PATTERN.matcher(source); + if (matcher.find()) { + String className = matcher.group(1) + ".java"; + return (packageName == null) ? className : packageName + "/" + className; + } else if (packageName != null) { + return packageName + "/package-info.java"; + } else { + throw new Error("Could not extract the java class " + + "name from the provided source"); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/management/DynamicVMOption.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.management; + +import com.sun.management.HotSpotDiagnosticMXBean; +import java.lang.management.ManagementFactory; + +/** + * A utility class to work with VM options which could be altered during + * execution. + * + * This class is a wrapper around {@code com.sun.management.VMOption}. + * It provides more convenient interface to read/write the values. + * + */ +public class DynamicVMOption { + + private final HotSpotDiagnosticMXBean mxBean; + + /** + * VM option name, like "MinHeapFreeRatio". + */ + public final String name; + + /** + * Creates an instance of DynamicVMOption. + * + * @param name the VM option name + */ + public DynamicVMOption(String name) { + this.name = name; + mxBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); + } + + /** + * Sets a new value for the option. + * Trying to set not applicable value will cause IllegalArgumentException. + * Behavior with null is undefined, most likely NPE will be thrown. + * + * @param newValue the value to be set + * @see #getValue() + * @throws IllegalArgumentException if newValue is not applicable to the option + */ + public final void setValue(String newValue) { + mxBean.setVMOption(name, newValue); + } + + /** + * Returns the value of option. + * + * @return the current option value + * @see #setValue(java.lang.String) + */ + public final String getValue() { + return mxBean.getVMOption(name).getValue(); + } + + /** + * Returns true, if option is writable, false otherwise. + * + * @return true, if option is writable, false otherwise + */ + public final boolean isWriteable() { + return mxBean.getVMOption(name).isWriteable(); + } + + /** + * Checks if the given value is applicable for the option. + * + * This method tries to set the option to the new value. If no exception + * has been thrown the value is treated as valid. + * + * Calling this method will not change the option value. After an attempt + * to set a new value, the option will be restored to its previous value. + * + * @param value the value to verify + * @return true if option could be set to the given value + */ + public boolean isValidValue(String value) { + boolean isValid = true; + String oldValue = getValue(); + try { + setValue(value); + } catch (NullPointerException e) { + if (value == null) { + isValid = false; + } + } catch (IllegalArgumentException e) { + isValid = false; + } finally { + setValue(oldValue); + } + return isValid; + } + + /** + * Returns the value of the given VM option as String. + * + * This is a simple shortcut for {@code new DynamicVMOption(name).getValue()} + * + * @param name the name of VM option + * @return value as a string + * @see #getValue() + */ + public static String getString(String name) { + return new DynamicVMOption(name).getValue(); + } + + /** + * Returns the value of the given option as int. + * + * @param name the name of VM option + * @return value parsed as integer + * @see #getString(java.lang.String) + * + */ + public static int getInt(String name) { + return Integer.parseInt(getString(name)); + } + + /** + * Sets the VM option to a new value. + * + * This is a simple shortcut for {@code new DynamicVMOption(name).setValue(value)} + * + * @param name the name of VM option + * @param value the value to be set + * @see #setValue(java.lang.String) + */ + public static void setString(String name, String value) { + new DynamicVMOption(name).setValue(value); + } + + /** + * Sets the VM option value to a new integer value. + * + * @param name the name of VM option + * @param value the integer value to be set + * @see #setString(java.lang.String, java.lang.String) + */ + public static void setInt(String name, int value) { + new DynamicVMOption(name).setValue(Integer.toString(value)); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/management/ThreadMXBeanTool.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.management; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.lang.management.ThreadMXBean; + +/** + * A few utility methods to use ThreadMXBean. + */ +public final class ThreadMXBeanTool { + + /** + * Waits until {@link Thread} is in the certain {@link Thread.State} + * and blocking on {@code object}. + * + * @param state The thread state + * @param object The object to block on + */ + public static void waitUntilBlockingOnObject(Thread thread, Thread.State state, Object object) + throws InterruptedException { + String want = object == null ? null : object.getClass().getName() + '@' + + Integer.toHexString(System.identityHashCode(object)); + ThreadMXBean tmx = ManagementFactory.getThreadMXBean(); + while (thread.isAlive()) { + ThreadInfo ti = tmx.getThreadInfo(thread.getId()); + if (ti.getThreadState() == state + && (want == null || want.equals(ti.getLockName()))) { + return; + } + Thread.sleep(1); + } + } + + /** + * Waits until {@link Thread} is in native. + */ + public static void waitUntilInNative(Thread thread) throws InterruptedException { + ThreadMXBean tmx = ManagementFactory.getThreadMXBean(); + while (thread.isAlive()) { + ThreadInfo ti = tmx.getThreadInfo(thread.getId()); + if (ti.isInNative()) { + return; + } + Thread.sleep(1); + } + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/lib/jdk/test/lib/util/SerializationUtils.java Wed Jul 05 23:29:16 2017 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.test.lib.util; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +/** + * Common library for various test serialization utility functions. + */ +public final class SerializationUtils { + /** + * Serialize an object into byte array. + */ + public static byte[] serialize(Object obj) throws IOException { + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + try (ObjectOutputStream out = new ObjectOutputStream(bs)) { + out.writeObject(obj); + } + return bs.toByteArray(); + } + + /** + * Deserialize an object from byte array. + */ + public static Object deserialize(byte[] ba) throws IOException, ClassNotFoundException { + try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(ba))) { + return in.readObject(); + } + } + private SerializationUtils() {} +}