# # Copyright (c) 2014, 2024, 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 CopyFiles.gmk include Execute.gmk include Modules.gmk include Utils.gmk JDK_TARGETS := JRE_TARGETS := # Hook to include the corresponding custom file, if present. $(eval $(call IncludeCustomExtension, Images-pre.gmk)) ################################################################################ # All modules for the current target platform. ALL_MODULES := $(call FindAllModules) $(EXTRA_MODULES) $(eval $(call ReadImportMetaData)) JRE_MODULES += $(filter $(ALL_MODULES), $(BOOT_MODULES) \ $(PLATFORM_MODULES) jdk.jdwp.agent) JDK_MODULES += $(ALL_MODULES) JRE_MODULES_LIST := $(call CommaList, $(JRE_MODULES)) JDK_MODULES_LIST := $(call CommaList, $(JDK_MODULES)) ################################################################################ BASE_RELEASE_FILE := $(JDK_OUTPUTDIR)/release JMODS_DIRS := $(EXTRA_JMODS_DIR) $(IMAGES_OUTPUTDIR)/jmods JDK_JMODS := $(foreach m, $(JDK_MODULES), $(firstword $(wildcard $(addsuffix /$m.jmod, $(JMODS_DIRS))))) JRE_JMODS := $(foreach m, $(JRE_MODULES), $(firstword $(wildcard $(addsuffix /$m.jmod, $(JMODS_DIRS))))) JLINK_ORDER_RESOURCES := **module-info.class JLINK_JLI_CLASSES := ifeq ($(ENABLE_GENERATE_CLASSLIST), true) JLINK_ORDER_RESOURCES += @$(SUPPORT_OUTPUTDIR)/link_opt/classlist JLINK_JLI_CLASSES := --generate-jli-classes=@$(SUPPORT_OUTPUTDIR)/link_opt/default_jli_trace.txt endif JLINK_ORDER_RESOURCES += \ /java.base/java/** \ /java.base/jdk/** \ /java.base/sun/** \ /java.base/com/** \ /jdk.localedata/** \ # JLINK_TOOL := $(JLINK) -J-Djlink.debug=true \ --module-path $(call PathList, $(JMODS_DIRS)) \ --endian $(OPENJDK_TARGET_CPU_ENDIAN) \ --release-info $(BASE_RELEASE_FILE) \ --order-resources=$(call CommaList, $(JLINK_ORDER_RESOURCES)) \ --dedup-legal-notices=error-if-not-same-content \ $(JLINK_JLI_CLASSES) \ # JLINK_JRE_EXTRA_OPTS := --no-man-pages --no-header-files --strip-debug ifeq ($(JLINK_KEEP_PACKAGED_MODULES), true) JLINK_JDK_EXTRA_OPTS := --keep-packaged-modules $(JDK_IMAGE_DIR)/jmods endif JLINK_DISABLE_WARNINGS := | ( $(GREP) -v -e "WARNING: Using incubator module" || test "$$?" = "1" ) JDK_IMAGE_SUPPORT_DIR := $(SUPPORT_OUTPUTDIR)/images/jdk JRE_IMAGE_SUPPORT_DIR := $(SUPPORT_OUTPUTDIR)/images/jre $(eval $(call SetupExecute, jlink_jdk, \ WARN := Creating jdk image, \ DEPS := $(JDK_JMODS) $(BASE_RELEASE_FILE) \ $(call DependOnVariable, JDK_MODULES_LIST, $(JDK_IMAGE_SUPPORT_DIR)/_jlink_jdk.vardeps), \ OUTPUT_DIR := $(JDK_IMAGE_DIR), \ SUPPORT_DIR := $(JDK_IMAGE_SUPPORT_DIR), \ PRE_COMMAND := $(RM) -r $(JDK_IMAGE_DIR), \ COMMAND := $(JLINK_TOOL) --add-modules $(JDK_MODULES_LIST) \ $(JLINK_JDK_EXTRA_OPTS) --output $(JDK_IMAGE_DIR) \ $(JLINK_DISABLE_WARNINGS), \ )) JLINK_JDK_TARGETS := $(jlink_jdk) $(eval $(call SetupExecute, jlink_jre, \ WARN := Creating legacy jre image, \ DEPS := $(JRE_JMODS) $(BASE_RELEASE_FILE) \ $(call DependOnVariable, JRE_MODULES_LIST, $(JRE_IMAGE_SUPPORT_DIR)/_jlink_jre.vardeps), \ OUTPUT_DIR := $(JRE_IMAGE_DIR), \ SUPPORT_DIR := $(JRE_IMAGE_SUPPORT_DIR), \ PRE_COMMAND := $(RM) -r $(JRE_IMAGE_DIR), \ COMMAND := $(JLINK_TOOL) --add-modules $(JRE_MODULES_LIST) \ $(JLINK_JRE_EXTRA_OPTS) --output $(JRE_IMAGE_DIR), \ )) JLINK_JRE_TARGETS := $(jlink_jre) # Optimize CDS shared heap for small heap sizes, which are typically used # for small cloud-based apps that have the most critical start-up requirement. # The trade-off is that when larger heap sizes are used, the shared heap # may need to be relocated at runtime. CDS_DUMP_FLAGS = -Xmx128M -Xms128M # Helper function for creating the CDS archives for the JDK and JRE # # Param1 - VM variant (e.g., server, client, zero, ...) # Param2 - _nocoops, _coh, _nocoops_coh, or empty define CreateCDSArchive $1_$2_COOPS_OPTION := $(if $(findstring _nocoops, $2),-XX:-UseCompressedOops) # enable and also explicitly disable coh as needed. ifeq ($(call isTargetCpuBits, 64), true) $1_$2_COH_OPTION := -XX:+UnlockExperimentalVMOptions \ $(if $(findstring _coh, $2),-XX:+UseCompactObjectHeaders,-XX:-UseCompactObjectHeaders) endif $1_$2_DUMP_EXTRA_ARG := $$($1_$2_COOPS_OPTION) $$($1_$2_COH_OPTION) $1_$2_DUMP_TYPE := $(if $(findstring _nocoops, $2),-NOCOOPS,)$(if $(findstring _coh, $2),-COH,) # Only G1 supports dumping the shared heap, so explicitly use G1 if the JVM supports it. $1_$2_CDS_DUMP_FLAGS := $(CDS_DUMP_FLAGS) $(if $(filter g1gc, $(JVM_FEATURES_$1)), -XX:+UseG1GC) ifeq ($(OPENJDK_TARGET_OS), windows) $1_$2_CDS_ARCHIVE := bin/$1/classes$2.jsa else $1_$2_CDS_ARCHIVE := lib/$1/classes$2.jsa endif ifneq ($(COMPARE_BUILD), ) DEBUG_CDS_ARCHIVE := true endif ifeq ($(DEBUG_CDS_ARCHIVE), true) $1_$2_CDS_DUMP_FLAGS += -Xlog:cds+map*=trace:file=$$(JDK_IMAGE_DIR)/$$($1_$2_CDS_ARCHIVE).cdsmap:none:filesize=0 endif $$(eval $$(call SetupExecute, $1_$2_gen_cds_archive_jdk, \ WARN := Creating CDS$$($1_$2_DUMP_TYPE) archive for jdk image for $1, \ INFO := Using CDS flags for $1: $$($1_$2_CDS_DUMP_FLAGS), \ DEPS := $$(jlink_jdk), \ OUTPUT_FILE := $$(JDK_IMAGE_DIR)/$$($1_$2_CDS_ARCHIVE), \ SUPPORT_DIR := $$(JDK_IMAGE_SUPPORT_DIR), \ COMMAND := $$(FIXPATH) $$(JDK_IMAGE_DIR)/bin/java -Xshare:dump \ -XX:SharedArchiveFile=$$(JDK_IMAGE_DIR)/$$($1_$2_CDS_ARCHIVE) \ -$1 $$($1_$2_DUMP_EXTRA_ARG) $$($1_$2_CDS_DUMP_FLAGS) $$(LOG_INFO), \ )) JDK_TARGETS += $$($1_$2_gen_cds_archive_jdk) $$(eval $$(call SetupExecute, $1_$2_gen_cds_archive_jre, \ WARN := Creating CDS$$($1_$2_DUMP_TYPE) archive for jre image for $1, \ INFO := Using CDS flags for $1: $$($1_$2_CDS_DUMP_FLAGS), \ DEPS := $$(jlink_jre), \ OUTPUT_FILE := $$(JRE_IMAGE_DIR)/$$($1_$2_CDS_ARCHIVE), \ SUPPORT_DIR := $$(JRE_IMAGE_SUPPORT_DIR), \ COMMAND := $$(FIXPATH) $$(JRE_IMAGE_DIR)/bin/java -Xshare:dump \ -XX:SharedArchiveFile=$$(JRE_IMAGE_DIR)/$$($1_$2_CDS_ARCHIVE) \ -$1 $$($1_$2_DUMP_EXTRA_ARG) $$($1_$2_CDS_DUMP_FLAGS) $$(LOG_INFO), \ )) JRE_TARGETS += $$($1_$2_gen_cds_archive_jre) endef ifeq ($(BUILD_CDS_ARCHIVE), true) $(foreach v, $(JVM_VARIANTS), \ $(eval $(call CreateCDSArchive,$v,)) \ ) ifeq ($(call isTargetCpuBits, 64), true) $(foreach v, $(JVM_VARIANTS), \ $(eval $(call CreateCDSArchive,$v,_nocoops)) \ ) ifeq ($(BUILD_CDS_ARCHIVE_COH), true) $(foreach v, $(JVM_VARIANTS), \ $(eval $(call CreateCDSArchive,$v,_coh)) \ ) $(foreach v, $(JVM_VARIANTS), \ $(eval $(call CreateCDSArchive,$v,_nocoops_coh)) \ ) endif endif endif ################################################################################ # src.zip $(JDK_IMAGE_DIR)/lib/src.zip: $(SUPPORT_OUTPUTDIR)/src.zip $(call LogInfo, Copying $(patsubst $(OUTPUTDIR)/%,%,$@)) $(install-file) JDK_TARGETS += $(JDK_IMAGE_DIR)/lib/src.zip ################################################################################ # /demo dir # Avoid doing the expensive find unless called with "jdk" as target. ifneq ($(filter jdk, $(MAKECMDGOALS)), ) DEMO_FILES := \ $(if $(wildcard $(SUPPORT_OUTPUTDIR)/demos/image), \ $(shell $(FIND) $(SUPPORT_OUTPUTDIR)/demos/image \ -type f -a ! \( -name "_the*" -o -name "javac_state" \) ) \ ) ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true) ifeq ($(call isTargetOs, macosx), true) DEMO_FILES := $(call not-containing, .dSYM, $(DEMO_FILES)) else DEMO_FILES := $(filter-out %.debuginfo %.pdb %.map, $(DEMO_FILES)) endif endif $(eval $(call SetupCopyFiles, JDK_COPY_DEMOS, \ SRC := $(SUPPORT_OUTPUTDIR)/demos/image, \ DEST := $(JDK_IMAGE_DIR)/demo, \ FILES := $(DEMO_FILES), \ )) JDK_TARGETS += $(JDK_COPY_DEMOS) endif ################################################################################ # Code coverage data files ifeq ($(GCOV_ENABLED), true) $(eval $(call SetupCopyFiles, COPY_GCOV_GCNO, \ SRC := $(OUTPUTDIR), \ DEST := $(SYMBOLS_IMAGE_DIR)/gcov, \ FILES := $(call FindFiles, $(HOTSPOT_OUTPUTDIR) \ $(SUPPORT_OUTPUTDIR)/native, *.gcno) \ )) SYMBOLS_TARGETS += $(COPY_GCOV_GCNO) endif ################################################################################ # Debug symbols # Since debug symbols are not included in the jmod files, they need to be copied # in manually after generating the images. ALL_JDK_MODULES := $(JDK_MODULES) ALL_JRE_MODULES := $(sort $(JRE_MODULES), $(foreach m, $(JRE_MODULES), \ $(call FindTransitiveDepsForModule, $m))) ALL_SYMBOLS_MODULES := $(JDK_MODULES) ifeq ($(call isTargetOs, windows), true) LIBS_TARGET_SUBDIR := bin else LIBS_TARGET_SUBDIR := lib endif CMDS_TARGET_SUBDIR := bin # Param 1 - dir to find debuginfo files in FindDebuginfoFiles = \ $(wildcard $(addprefix $1/*, $(DEBUGINFO_SUFFIXES)) \ $(addprefix $1/*/*, $(DEBUGINFO_SUFFIXES)) \ $(addprefix $1/*/*/*, $(DEBUGINFO_SUFFIXES))) # Pick the correct debug info files to copy, either zipped or not. ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true) DEBUGINFO_SUFFIXES += .diz else DEBUGINFO_SUFFIXES := .debuginfo .pdb .map # On Macosx, if debug symbols have not been zipped, find all files inside *.dSYM # dirs. ifeq ($(call isTargetOs, macosx), true) $(call FillFindCache, \ $(SUPPORT_OUTPUTDIR)/modules_libs $(SUPPORT_OUTPUTDIR)/modules_cmds) FindDebuginfoFiles = \ $(if $(wildcard $1), $(call containing, .dSYM/, $(call FindFiles, $1))) endif endif # Param 1 - either JDK or JRE SetupCopyDebuginfo = \ $(foreach m, $(ALL_$1_MODULES), \ $(eval $(call SetupCopyFiles, COPY_$1_LIBS_DEBUGINFO_$m, \ SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/$m, \ DEST := $($1_IMAGE_DIR)/$(LIBS_TARGET_SUBDIR), \ FILES := $(call FindDebuginfoFiles, \ $(SUPPORT_OUTPUTDIR)/modules_libs/$m), \ )) \ $(eval $1_TARGETS += $$(COPY_$1_LIBS_DEBUGINFO_$m)) \ $(eval $(call SetupCopyFiles, COPY_$1_CMDS_DEBUGINFO_$m, \ SRC := $(SUPPORT_OUTPUTDIR)/modules_cmds/$m, \ DEST := $($1_IMAGE_DIR)/$(CMDS_TARGET_SUBDIR), \ FILES := $(call FindDebuginfoFiles, \ $(SUPPORT_OUTPUTDIR)/modules_cmds/$m), \ )) \ $(eval $1_TARGETS += $$(COPY_$1_CMDS_DEBUGINFO_$m)) \ ) # No space before argument to avoid having to put $(strip ) everywhere in # implementation above. $(call SetupCopyDebuginfo,JDK) $(call SetupCopyDebuginfo,JRE) $(call SetupCopyDebuginfo,SYMBOLS) ################################################################################ # Include custom post hook here to make it possible to augment the target lists # before actual target prerequisites are declared. $(eval $(call IncludeCustomExtension, Images-post.gmk)) ################################################################################ $(JRE_TARGETS): $(JLINK_JRE_TARGETS) $(JDK_TARGETS): $(JLINK_JDK_TARGETS) jdk: $(JLINK_JDK_TARGETS) $(JDK_TARGETS) jre: $(JLINK_JRE_TARGETS) $(JRE_TARGETS) symbols: $(SYMBOLS_TARGETS) all: jdk jre symbols .PHONY: default all jdk jre symbols