Merge
authorduke
Wed, 05 Jul 2017 21:39:55 +0200
changeset 37777 08b7d4a71e11
parent 37776 3657c978f79a (current diff)
parent 37771 30f2faf0e7a6 (diff)
child 37820 abe7aa589158
Merge
--- a/.hgtags-top-repo	Sat May 07 00:43:37 2016 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 21:39:55 2017 +0200
@@ -359,3 +359,4 @@
 1d992540870ff33fe6cc550443388588df9b9e4f jdk-9+114
 09617ce980b99d49abfd54dacfed353c47e2a115 jdk-9+115
 6743a8e0cab7b5f6f4a0575f6664892f0ab740af jdk-9+116
+e882bcdbdac436523f3d5681611d3118a3804ea7 jdk-9+117
--- a/common/autoconf/boot-jdk.m4	Sat May 07 00:43:37 2016 +0200
+++ b/common/autoconf/boot-jdk.m4	Wed Jul 05 21:39:55 2017 +0200
@@ -435,6 +435,9 @@
       elif test ! -x "$BUILD_JDK/bin/jlink"; then
         AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring])
         BUILD_JDK_FOUND=no
+      elif test ! -x "$BUILD_JDK/bin/jmod"; then
+        AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring])
+        BUILD_JDK_FOUND=no
       elif test ! -x "$BUILD_JDK/bin/javac"; then
         # Do we have a bin/javac?
         AC_MSG_NOTICE([Potential Build JDK found at $BUILD_JDK did not contain bin/javac; ignoring])
@@ -474,7 +477,8 @@
   AC_ARG_WITH(build-jdk, [AS_HELP_STRING([--with-build-jdk],
       [path to JDK of same version as is being built@<:@the newly built JDK@:>@])])
 
-  CREATE_BUILDJDK_FOR_HOST=false
+  CREATE_BUILDJDK=false
+  EXTERNAL_BUILDJDK=false
   BUILD_JDK_FOUND="no"
   if test "x$with_build_jdk" != "x"; then
     BOOTJDK_CHECK_BUILD_JDK([
@@ -483,6 +487,7 @@
          BUILD_JDK_FOUND=maybe
          AC_MSG_NOTICE([Found potential Build JDK using configure arguments])
        fi])
+    EXTERNAL_BUILDJDK=true
   else
     if test "x$COMPILE_TYPE" = "xcross"; then
       BUILD_JDK="\$(BUILDJDK_OUTPUTDIR)/jdk"
@@ -498,6 +503,11 @@
     fi
   fi
 
+  JMOD="$BUILD_JDK/bin/jmod"
+  JLINK="$BUILD_JDK/bin/jlink"
+  AC_SUBST(JMOD)
+  AC_SUBST(JLINK)
+
   if test "x$BUILD_JDK_FOUND" != "xyes"; then
     AC_MSG_CHECKING([for Build JDK])
     AC_MSG_RESULT([no])
@@ -506,4 +516,5 @@
 
   AC_SUBST(CREATE_BUILDJDK)
   AC_SUBST(BUILD_JDK)
+  AC_SUBST(EXTERNAL_BUILDJDK)
 ])
--- a/common/autoconf/buildjdk-spec.gmk.in	Sat May 07 00:43:37 2016 +0200
+++ b/common/autoconf/buildjdk-spec.gmk.in	Wed Jul 05 21:39:55 2017 +0200
@@ -46,6 +46,7 @@
 HOTSPOT_DIST := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(HOTSPOT_DIST))
 SUPPORT_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(SUPPORT_OUTPUTDIR))
 JDK_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(JDK_OUTPUTDIR))
+IMAGES_OUTPUTDIR := $(patsubst $(BUILD_OUTPUT)%,$(BUILDJDK_OUTPUTDIR)%,$(IMAGES_OUTPUTDIR))
 
 OPENJDK_BUILD_CPU_LEGACY := @OPENJDK_BUILD_CPU_LEGACY@
 OPENJDK_BUILD_CPU_LEGACY_LIB := @OPENJDK_BUILD_CPU_LEGACY_LIB@
--- a/common/autoconf/generated-configure.sh	Sat May 07 00:43:37 2016 +0200
+++ b/common/autoconf/generated-configure.sh	Wed Jul 05 21:39:55 2017 +0200
@@ -896,8 +896,11 @@
 JAXP_TOPDIR
 CORBA_TOPDIR
 LANGTOOLS_TOPDIR
+EXTERNAL_BUILDJDK
 BUILD_JDK
 CREATE_BUILDJDK
+JLINK
+JMOD
 BOOT_JDK_BITS
 JAVAC_FLAGS
 BOOT_JDK_MODULAR
@@ -5070,7 +5073,7 @@
 #CUSTOM_AUTOCONF_INCLUDE
 
 # Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1462204427
+DATE_WHEN_GENERATED=1462806878
 
 ###############################################################################
 #
@@ -30171,7 +30174,8 @@
 fi
 
 
-  CREATE_BUILDJDK_FOR_HOST=false
+  CREATE_BUILDJDK=false
+  EXTERNAL_BUILDJDK=false
   BUILD_JDK_FOUND="no"
   if test "x$with_build_jdk" != "x"; then
 
@@ -30196,6 +30200,10 @@
         { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring" >&5
 $as_echo "$as_me: Potential Build JDK found at $BUILD_JDK did not contain bin/jlink; ignoring" >&6;}
         BUILD_JDK_FOUND=no
+      elif test ! -x "$BUILD_JDK/bin/jmod"; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring" >&5
+$as_echo "$as_me: Potential Build JDK found at $BUILD_JDK did not contain bin/jmod; ignoring" >&6;}
+        BUILD_JDK_FOUND=no
       elif test ! -x "$BUILD_JDK/bin/javac"; then
         # Do we have a bin/javac?
         { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Build JDK found at $BUILD_JDK did not contain bin/javac; ignoring" >&5
@@ -30364,6 +30372,7 @@
     fi # end check build jdk found
   fi
 
+    EXTERNAL_BUILDJDK=true
   else
     if test "x$COMPILE_TYPE" = "xcross"; then
       BUILD_JDK="\$(BUILDJDK_OUTPUTDIR)/jdk"
@@ -30383,6 +30392,11 @@
     fi
   fi
 
+  JMOD="$BUILD_JDK/bin/jmod"
+  JLINK="$BUILD_JDK/bin/jlink"
+
+
+
   if test "x$BUILD_JDK_FOUND" != "xyes"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Build JDK" >&5
 $as_echo_n "checking for Build JDK... " >&6; }
@@ -30395,6 +30409,7 @@
 
 
 
+
 ###############################################################################
 #
 # Configure the sources to use. We can add or override individual directories.
--- a/common/autoconf/spec.gmk.in	Sat May 07 00:43:37 2016 +0200
+++ b/common/autoconf/spec.gmk.in	Wed Jul 05 21:39:55 2017 +0200
@@ -283,6 +283,7 @@
 
 BUILD_JDK:=@BUILD_JDK@
 CREATE_BUILDJDK:=@CREATE_BUILDJDK@
+EXTERNAL_BUILDJDK:=@EXTERNAL_BUILDJDK@
 
 # When compiling Java source to be run by the boot jdk
 # use these extra flags, eg -source 6 -target 6
@@ -542,6 +543,8 @@
 JAVAC_CMD:=@JAVAC@
 JAVAH_CMD:=@JAVAH@
 JAR_CMD:=@JAR@
+JLINK_CMD := @JLINK@
+JMOD_CMD := @JMOD@
 JARSIGNER_CMD:=@JARSIGNER@
 SJAVAC_SERVER_JAVA_CMD:=@SJAVAC_SERVER_JAVA@
 # These variables are meant to be used. They are defined with = instead of := to make
@@ -552,6 +555,8 @@
 JAVAC=@FIXPATH@ $(JAVAC_CMD)
 JAVAH=@FIXPATH@ $(JAVAH_CMD)
 JAR=@FIXPATH@ $(JAR_CMD)
+JLINK = @FIXPATH@ $(JLINK_CMD) $(JAVA_TOOL_FLAGS_SMALL)
+JMOD = @FIXPATH@ $(JMOD_CMD) $(JAVA_TOOL_FLAGS_SMALL)
 JARSIGNER=@FIXPATH@ $(JARSIGNER_CMD)
 # A specific java binary with specific options can be used to run
 # the long running background sjavac servers and other long running tasks.
@@ -569,14 +574,15 @@
 # Use ?= as this can be overridden from bootcycle-spec.gmk
 BOOT_JDK_MODULAR ?= @BOOT_JDK_MODULAR@
 
+INTERIM_OVERRIDE_MODULES := java.compiler jdk.compiler \
+    jdk.jdeps jdk.javadoc jdk.rmic
 ifeq ($(BOOT_JDK_MODULAR), true)
-  INTERIM_OVERRIDE_MODULES_ARGS = -Xpatch:$(BUILDTOOLS_OUTPUTDIR)/override_modules
+  INTERIM_OVERRIDE_MODULES_ARGS = $(foreach m, $(INTERIM_OVERRIDE_MODULES), \
+      -Xpatch:$m=$(BUILDTOOLS_OUTPUTDIR)/override_modules/$m)
   INTERIM_LANGTOOLS_ARGS = $(INTERIM_OVERRIDE_MODULES_ARGS)
   JAVAC_MAIN_CLASS = -m jdk.compiler/com.sun.tools.javac.Main
   JAVADOC_MAIN_CLASS = -m jdk.javadoc/jdk.javadoc.internal.tool.Main
 else
-  INTERIM_OVERRIDE_MODULES := java.compiler jdk.compiler \
-      jdk.jdeps jdk.javadoc jdk.rmic
   INTERIM_OVERRIDE_MODULES_ARGS = \
       -Xbootclasspath/p:$(call PathList, \
           $(addprefix $(BUILDTOOLS_OUTPUTDIR)/override_modules/, \
@@ -591,12 +597,8 @@
 NEW_JAVAC   = $(INTERIM_LANGTOOLS_ARGS) $(JAVAC_MAIN_CLASS)
 NEW_JAVADOC = $(INTERIM_LANGTOOLS_ARGS) $(JAVADOC_MAIN_CLASS)
 
-# JLink/Jmod are run using the BUILD_JDK, which is normally the jdk output dir.
 JLINK_KEEP_PACKAGED_MODULES:=@JLINK_KEEP_PACKAGED_MODULES@
 
-JLINK = @FIXPATH@ $(BUILD_JDK)/bin/jlink $(JAVA_TOOL_FLAGS_SMALL)
-JMOD = @FIXPATH@ $(BUILD_JDK)/bin/jmod $(JAVA_TOOL_FLAGS_SMALL)
-
 # Base flags for RC
 # Guarding this against resetting value. Legacy make files include spec multiple
 # times.
@@ -776,6 +778,9 @@
 SYMBOLS_IMAGE_SUBDIR:=symbols
 SYMBOLS_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(SYMBOLS_IMAGE_SUBDIR)
 
+# Interim image
+INTERIM_IMAGE_DIR := $(SUPPORT_OUTPUTDIR)/interim-image
+
 # Macosx bundles directory definitions
 JDK_MACOSX_BUNDLE_SUBDIR=jdk-bundle/jdk-$(VERSION_NUMBER).jdk/Contents
 JRE_MACOSX_BUNDLE_SUBDIR=jre-bundle/jre-$(VERSION_NUMBER).jre/Contents
--- a/common/conf/jib-profiles.js	Sat May 07 00:43:37 2016 +0200
+++ b/common/conf/jib-profiles.js	Wed Jul 05 21:39:55 2017 +0200
@@ -404,7 +404,7 @@
         jtreg: {
             server: "javare",
             revision: "4.2",
-            build_number: "b01",
+            build_number: "b02",
             checksum_file: "MD5_VALUES",
             file: "jtreg_bin-4.2.zip",
             environment_name: "JT_HOME"
--- a/make/CompileJavaModules.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/CompileJavaModules.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -99,7 +99,7 @@
 ################################################################################
 
 java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference \
-    '-Xdoclint/package:java.*,javax.*'
+    '-Xdoclint/package:java.*,javax.*' -Xlint:-deprecation 
 java.desktop_COPY := .gif .png .wav .txt .xml .css .pf
 java.desktop_CLEAN := iio-plugin.properties cursors.properties
 
--- a/make/CreateBuildJdkCopy.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/CreateBuildJdkCopy.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -29,13 +29,15 @@
 include MakeBase.gmk
 include Modules.gmk
 
-MODULES_TO_COPY := $(call FindTransitiveDepsForModule, jdk.jlink) jdk.jlink
+MODULES_TO_COPY := $(sort \
+    $(foreach m, jdk.jlink $(INTERIM_IMAGE_MODULES), \
+      $(call FindTransitiveDepsForModule, $m) $m))
 
 ################################################################################
 # Copy the modules needed to run jlink and jmod. Use bulk copy instead of
 # SetupCopyFiles since there are so many files.
 
-COPY_CLASSES_TARGET := $(BUILDJDK_OUTPUTDIR)/jdk/modules/_buildjdk-copy-maker
+COPY_CLASSES_TARGET := $(BUILDJDK_OUTPUTDIR)/jdk/modules/java.base/_the.buildjdk-copy-marker
 
 $(COPY_CLASSES_TARGET): $(call CacheFind, $(wildcard \
     $(addprefix $(JDK_OUTPUTDIR)/modules/, $(MODULES_TO_COPY))))
@@ -49,15 +51,6 @@
 
 TARGETS += $(COPY_CLASSES_TARGET)
 
-#$(eval $(call SetupCopyFiles, COPY_JDK_MODULES, \
-    SRC := $(BUILD_OUTPUT), \
-    DEST := $(BUILDJDK_OUTPUTDIR), \
-    FILES := $(call DoubleDollar, $(call DoubleDollar, $(call CacheFind, $(wildcard \
-        $(addprefix $(JDK_OUTPUTDIR)/modules/, $(MODULES_TO_COPY)))))), \
-))
-
-#TARGETS += $(COPY_JDK_MODULES)
-
 ################################################################################
 
 $(eval $(call SetupCopyFiles, COPY_SUPPORT_HEADERS, \
--- a/make/CreateJmods.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/CreateJmods.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -1,4 +1,4 @@
-#
+
 # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
@@ -35,6 +35,8 @@
 
 ################################################################################
 
+JMODS_DIR := $(IMAGES_OUTPUTDIR)/jmods
+
 LIBS_DIR := $(firstword $(wildcard $(addsuffix /$(MODULE), \
     $(SUPPORT_OUTPUTDIR)/modules_libs-stripped $(IMPORT_MODULES_LIBS))))
 CMDS_DIR := $(firstword $(wildcard $(addsuffix /$(MODULE), \
@@ -64,15 +66,35 @@
   DEPS += $(call CacheFind, $(CLASSES_DIR))
 endif
 
-# Add dependencies on other jmod files
-DEPS += $(patsubst %, $(IMAGES_OUTPUTDIR)/jmods/%.jmod, \
-    $(call FindDepsForModule, $(MODULE)))
+# Add dependencies on other jmod files. Only java.base needs access to other
+# jmods.
+ifeq ($(MODULE), java.base)
+  # When creating a BUILDJDK, we don't need to add hashes to java.base
+  ifneq ($(CREATING_BUILDJDK), true)
+    DEPS += $(patsubst %, $(JMODS_DIR)/%.jmod, \
+        $(filter-out java.base, $(call FindAllModules)))
+
+    # TODO: find modules that directly and indirectly depend on upgradeable
+    # modules
+    EXCLUDE_HASH_MODULES := $(UPGRADEABLE_MODULES) \
+      java.se.ee \
+      jdk.rmic \
+      jdk.xml.bind \
+      jdk.xml.ws \
+      #
+
+    EXCLUDE_PATTERN := $(strip $(subst $(SPACE),|,$(strip $(EXCLUDE_HASH_MODULES))))
+
+    JMOD_FLAGS += --modulepath $(JMODS_DIR) \
+        --hash-modules '^(?!$(EXCLUDE_PATTERN))'
+  endif
+endif
 
 # TODO: What about headers?
 # Create jmods in a temp dir and then move them into place to keep the
 # module path in $(IMAGES_OUTPUTDIR)/jmods valid at all times.
-$(IMAGES_OUTPUTDIR)/jmods/$(MODULE).jmod: $(DEPS)
-	$(call LogWarn, Creating $(notdir $@))
+$(JMODS_DIR)/$(MODULE).jmod: $(DEPS)
+	$(call LogWarn, Creating $(patsubst $(OUTPUT_ROOT)/%, %, $@))
 	$(call MakeDir, $(@D) $(SUPPORT_OUTPUTDIR)/jmods)
 	$(RM) $@ $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@)
 	$(JMOD) create \
@@ -80,8 +102,7 @@
             --os-name $(REQUIRED_OS_NAME) \
             --os-arch $(OPENJDK_TARGET_CPU_LEGACY) \
             --os-version $(REQUIRED_OS_VERSION) \
-	    --modulepath $(IMAGES_OUTPUTDIR)/jmods\
-            --hash-dependencies '.*' \
+	        --modulepath $(JMODS_DIR) \
             --exclude '**{_the.*,*.diz,*.debuginfo,*.dSYM/**,*.pdb,*.map}' \
 	    $(JMOD_FLAGS) $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@)
 	$(MV) $(SUPPORT_OUTPUTDIR)/jmods/$(notdir $@) $@
--- a/make/Images.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/Images.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -56,19 +56,11 @@
 JRE_COMPACT2_MODULES := $(JRE_COMPACT1_MODULES) java.compact2 $(COMPACT2_EXTRA_MODULES)
 JRE_COMPACT3_MODULES := $(JRE_COMPACT2_MODULES) java.compact3 $(COMPACT3_EXTRA_MODULES)
 
-# Replacing double-comma with a single comma is to workaround the issue
-# with some version of make on windows that doesn't substitute spaces
-# with one comma properly as with make 4.0
-SubstComma = \
-    $(strip \
-        $(subst $(COMMA)$(COMMA),$(COMMA),$(subst $(SPACE),$(COMMA),$(strip $1))) \
-    )
-
-JRE_MODULES_LIST := $(call SubstComma, $(JRE_MODULES))
-JDK_MODULES_LIST := $(call SubstComma, $(JDK_MODULES))
-JRE_COMPACT1_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT1_MODULES))
-JRE_COMPACT2_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT2_MODULES))
-JRE_COMPACT3_MODULES_LIST := $(call SubstComma, $(JRE_COMPACT3_MODULES))
+JRE_MODULES_LIST := $(call CommaList, $(JRE_MODULES))
+JDK_MODULES_LIST := $(call CommaList, $(JDK_MODULES))
+JRE_COMPACT1_MODULES_LIST := $(call CommaList, $(JRE_COMPACT1_MODULES))
+JRE_COMPACT2_MODULES_LIST := $(call CommaList, $(JRE_COMPACT2_MODULES))
+JRE_COMPACT3_MODULES_LIST := $(call CommaList, $(JRE_COMPACT3_MODULES))
 
 ################################################################################
 # Release file
@@ -364,6 +356,23 @@
 JDK_TARGETS += $(JDK_IMAGE_DIR)/src.zip
 
 ################################################################################
+# classlist
+
+$(eval $(call SetupCopyFiles, JDK_COPY_CLASSLIST, \
+    FILES := $(SUPPORT_OUTPUTDIR)/classlist/classlist, \
+    DEST := $(JDK_IMAGE_DIR)/lib, \
+))
+
+JDK_TARGETS += $(JDK_COPY_CLASSLIST)
+
+$(eval $(call SetupCopyFiles, JRE_COPY_CLASSLIST, \
+    FILES := $(SUPPORT_OUTPUTDIR)/classlist/classlist, \
+    DEST := $(JRE_IMAGE_DIR)/lib, \
+))
+
+JRE_TARGETS += $(JRE_COPY_CLASSLIST)
+
+################################################################################
 # /demo dir
 ifneq ($(findstring images, $(MAKECMDGOALS)), )
   $(eval $(call SetupCopyFiles, JDK_COPY_DEMOS, \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/InterimImage.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -0,0 +1,60 @@
+#
+# 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.  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
+
+################################################################################
+
+# Use this file inside the image as target for make rule
+JIMAGE_TARGET_FILE := bin/java$(EXE_SUFFIX)
+
+INTERIM_MODULES_LIST := $(call CommaList, $(INTERIM_IMAGE_MODULES))
+
+JMODS := $(patsubst %, $(IMAGES_OUTPUTDIR)/jmods/%.jmod, $(INTERIM_IMAGE_MODULES))
+
+JLINK_TOOL := $(JLINK) \
+    --modulepath $(IMAGES_OUTPUTDIR)/jmods \
+    --endian $(OPENJDK_BUILD_CPU_ENDIAN)
+
+$(INTERIM_IMAGE_DIR)/$(JIMAGE_TARGET_FILE): $(JMODS) \
+    $(call DependOnVariable, INTERIM_MODULES_LIST)
+	$(ECHO) Creating interim jimage
+	$(RM) -r $(INTERIM_IMAGE_DIR)
+	$(JLINK_TOOL) \
+	    --output $(INTERIM_IMAGE_DIR) \
+	    --addmods $(INTERIM_MODULES_LIST)
+	$(TOUCH) $@
+
+TARGETS += $(INTERIM_IMAGE_DIR)/$(JIMAGE_TARGET_FILE)
+
+################################################################################
+
+all: $(TARGETS)
+
+.PHONY: all
--- a/make/Main.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/Main.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -348,25 +348,35 @@
 ################################################################################
 # Cross compilation support
 
-ifeq ($(CREATE_BUILDJDK), true)
+ifeq ($(CREATING_BUILDJDK), true)
   # This target is only called by the recursive call below.
-  create-buildjdk-compile-hotspot-helper: hotspot
-  create-buildjdk-compile-modules-helper: jdk.jlink-launchers java.base-copy \
-      jdk.jdeps-launchers
+  create-buildjdk-interim-image-helper: interim-image jdk.jlink-launchers \
+      java.base-copy jdk.jdeps-launchers
 endif
 
 create-buildjdk-copy:
 	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f CreateBuildJdkCopy.gmk)
 
-create-buildjdk-compile-hotspot create-buildjdk-compile-modules:
+create-buildjdk-interim-image:
 	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f Main.gmk \
 	    $@-helper \
 	    SPEC=$(dir $(SPEC))buildjdk-spec.gmk \
 	    HOTSPOT_SPEC=$(dir $(SPEC))buildjdk-spec.gmk \
 	    CREATING_BUILDJDK=true)
 
-ALL_TARGETS += create-buildjdk-copy create-buildjdk-compile-hotspot \
-    create-buildjdk-compile-modules
+ALL_TARGETS += create-buildjdk-copy create-buildjdk-interim-image
+
+################################################################################
+# The interim-image is a small jlinked image that is used to generate artifacts 
+# at build time for use when linking the real images.
+
+interim-image:
+	+($(CD) $(SRC_ROOT)/make && $(MAKE) $(MAKE_ARGS) -f InterimImage.gmk)
+
+generate-classlist:
+	+($(CD) $(JDK_TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f GenerateClasslist.gmk)
+
+ALL_TARGETS += interim-image generate-classlist
 
 ################################################################################
 # Build tests
@@ -522,10 +532,11 @@
   $(foreach m, $(RMIC_MODULES), $(eval $m-rmic: $m-java))
 
   # Declare dependencies from <module>-lib to <module>-java
-  # Skip modules that do not have java source. When creating a BUILD_JDK, the
-  # java compilation has already been done by the normal build and copied in.
+  # Skip modules that do not have java source.
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
   ifneq ($(CREATING_BUILDJDK), true)
-  $(foreach m, $(filter $(JAVA_MODULES), $(LIBS_MODULES)), $(eval $m-libs: $m-java))
+    $(foreach m, $(filter $(JAVA_MODULES), $(LIBS_MODULES)), $(eval $m-libs: $m-java))
   endif
 
   # Declare dependencies from all other <module>-lib to java.base-lib
@@ -562,13 +573,21 @@
   $(foreach m, $(GENDATA_MODULES), $(eval $m-strip: $m-gendata))
   $(foreach m, $(COPY_MODULES), $(eval $m-strip: $m-copy))
 
-  # Declare dependencies between jmod targets
-  $(foreach m, $(JMOD_MODULES), \
-      $(eval $m-jmod: $(addsuffix -jmod, $(call FindDepsForModule,$m))))
+  # Declare dependencies between jmod targets. Only java.base jmod needs access
+  # to the other jmods to be built.
+  # When creating a BUILDJDK, we don't need to add hashes to java.base, thus
+  # we don't need to depend on all other jmods
+  ifneq ($(CREATING_BUILDJDK), true)
+    java.base-jmod: $(filter-out java.base-jmod, $(JMOD_TARGETS))
+  endif
 
   # Declare dependencies from <module>-jmod to all other module targets
   $(foreach m, $(STRIP_MODULES), $(eval $m-jmod: $m-strip))
-  $(foreach m, $(JAVA_MODULES), $(eval $m-jmod: $m-java))
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
+  ifneq ($(CREATING_BUILDJDK), true)
+    $(foreach m, $(JAVA_MODULES), $(eval $m-jmod: $m-java))
+  endif
   $(foreach m, $(GENDATA_MODULES), $(eval $m-jmod: $m-gendata))
   $(foreach m, $(RMIC_MODULES), $(eval $m-jmod: $m-rmic))
   $(foreach m, $(LIBS_MODULES), $(eval $m-jmod: $m-libs))
@@ -577,10 +596,18 @@
 
   # Jmods cannot be created until we have the jlink tool ready to run, which requires
   # all java modules to be compiled and jdk.jlink-launchers.
-  $(JMOD_TARGETS): java java.base-libs jdk.jlink-launchers
+  $(JMOD_TARGETS): java.base-libs jdk.jlink-launchers
+  # When creating a BUILDJDK, the java compilation has already been done by the
+  # normal build and copied in.
+  ifneq ($(CREATING_BUILDJDK), true)
+    $(JMOD_TARGETS): java
+  endif
 
   ifeq ($(CREATE_BUILDJDK), true)
-    $(JMOD_TARGETS): create-buildjdk
+    # Avoid calling create-buildjdk from within a create-buildjdk call
+    ifneq ($(CREATING_BUILDJDK), true)
+      $(JMOD_TARGETS): create-buildjdk
+    endif
   endif
 
   zip-security: java.base-java java.security.jgss-java java.security.jgss-libs \
@@ -590,7 +617,18 @@
 
   jrtfs-jar: interim-langtools
 
-  jimages: jmods zip-source source-tips demos samples jrtfs-jar
+  ifeq ($(CREATE_BUILDJDK), true)
+    # If creating a buildjdk, the interim image needs to be based on that.
+    generate-classlist: create-buildjdk
+  else ifeq ($(EXTERNAL_BUILDJDK), false)
+    # If an external buildjdk has been provided, we skip generating an
+    # interim-image and just use the external buildjdk for generating
+    # classlist.
+    generate-classlist: interim-image
+  endif
+  generate-classlist: buildtools-jdk
+
+  jimages: jmods zip-source source-tips demos samples jrtfs-jar generate-classlist
 
   profiles: jmods zip-source source-tips jrtfs-jar
 
@@ -606,9 +644,12 @@
 
   test: jimages test-image
 
-  create-buildjdk-copy: jdk.jlink-java java.base-gendata
+  create-buildjdk-copy: jdk.jlink-java java.base-gendata \
+      $(addsuffix -java, $(INTERIM_IMAGE_MODULES))
 
-  create-buildjdk-compile-modules: create-buildjdk-copy create-buildjdk-compile-hotspot
+  create-buildjdk-interim-image: create-buildjdk-copy
+
+  interim-image: $(addsuffix -jmod, $(INTERIM_IMAGE_MODULES))
 
   test-make: clean-test-make
 
@@ -682,8 +723,7 @@
 # The "exploded image" is a locally runnable JDK in $(BUILD_OUTPUT)/jdk.
 exploded-image: $(ALL_MODULES)
 
-create-buildjdk: create-buildjdk-compile-modules create-buildjdk-copy \
-    create-buildjdk-compile-hotspot
+create-buildjdk: create-buildjdk-copy create-buildjdk-interim-image
 
 mac-bundles: mac-bundles-jdk
 
@@ -694,10 +734,14 @@
 # (and possibly other, more specific versions)
 product-images: jimages demos samples zip-security exploded-image
 
-# When cross compiling and building a partial BUILDJDK for the build host,
-# the summary generation cannot be run.
+# The module summary cannot be run when:
+# * Cross compiling and building a partial BUILDJDK for the build host
+# * An external buildjdk has been supplied since it may not match the
+#   module selection of the target jdk
 ifneq ($(CREATE_BUILDJDK), true)
-  product-images: generate-summary
+  ifeq ($(EXTERNAL_BUILDJDK), false)
+    product-images: generate-summary
+  endif
 endif
 
 ifeq ($(OPENJDK_TARGET_OS), macosx)
--- a/make/common/JavaCompilation.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/common/JavaCompilation.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -181,7 +181,7 @@
   # Extract the info from the java compiler setup.
   $1_JVM := $$($$($1_SETUP)_JVM)
   $1_JAVAC := $$($$($1_SETUP)_JAVAC)
-  $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
+  $1_FLAGS := $$($$($1_SETUP)_FLAGS) $$($1_ADD_JAVAC_FLAGS) $(JAVAC_FLAGS)
   ifneq ($$($1_CLASSPATH), )
     $1_FLAGS += -cp $$(call PathList, $$($1_CLASSPATH))
   endif
--- a/make/common/MakeBase.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/common/MakeBase.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -742,6 +742,17 @@
     $(if $(filter $1, $(JVM_VARIANTS)), true, false))
 
 ################################################################################
+# Converts a space separated list to a comma separated list.
+#
+# Replacing double-comma with a single comma is to workaround the issue with
+# some version of make on windows that doesn't substitute spaces with one comma
+# properly.
+CommaList = \
+  $(strip \
+      $(subst $(COMMA)$(COMMA),$(COMMA),$(subst $(SPACE),$(COMMA),$(strip $1))) \
+  )
+
+################################################################################
 
 # Hook to include the corresponding custom file, if present.
 $(eval $(call IncludeCustomExtension, , common/MakeBase.gmk))
--- a/make/common/Modules.gmk	Sat May 07 00:43:37 2016 +0200
+++ b/make/common/Modules.gmk	Wed Jul 05 21:39:55 2017 +0200
@@ -38,13 +38,12 @@
 BOOT_MODULES :=
 PLATFORM_MODULES :=
 JRE_TOOL_MODULES :=
+UPGRADEABLE_MODULES :=
+AGGREGATOR_MODULES :=
 
 # Hook to include the corresponding custom file, if present.
 $(eval $(call IncludeCustomExtension, , common/Modules.gmk))
 
-UPGRADEABLE_MDOULES :=
-AGGREGATOR_MDOULES :=
-
 BOOT_MODULES += \
     java.base \
     java.datatransfer \
@@ -73,11 +72,9 @@
 
 # to be deprivileged
 BOOT_MODULES += \
-    java.compiler \
     java.scripting \
     java.sql.rowset \
     java.smartcardio \
-    jdk.charsets \
     jdk.naming.rmi \
     #
 
@@ -104,7 +101,9 @@
     #
 
 PLATFORM_MODULES += \
+    java.compiler \
     jdk.accessibility \
+    jdk.charsets \
     jdk.crypto.ec \
     jdk.crypto.pkcs11 \
     jdk.dynalink \
@@ -129,6 +128,10 @@
   PLATFORM_MODULES += jdk.crypto.ucrypto
 endif
 
+# These modules are included in the interim image which is used to run profiling
+# before building the real images.
+INTERIM_IMAGE_MODULES := java.base java.logging
+
 ################################################################################
 # Some platforms don't have the serviceability agent