| # | |
| # Copyright (c) 2024, 2025, 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. | |
| # | |
| include MakeFileStart.gmk | |
| ################################################################################ | |
| include CopyFiles.gmk | |
| include DebugInfoUtils.gmk | |
| include Modules.gmk | |
| include modules/LauncherCommon.gmk | |
| include Execute.gmk | |
| ################################################################################ | |
| # | |
| # Create the static java launcher | |
| # | |
| ################################################################################ | |
| STATIC_JDK_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/static-jdk | |
| STATIC_LAUNCHER_OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/static-native/launcher | |
| HOTSPOT_STATIC_LIB_PATH := $(HOTSPOT_OUTPUTDIR)/*/libjvm/objs/static | |
| ifneq ($(word 2, $(wildcard $(HOTSPOT_STATIC_LIB_PATH))), ) | |
| $(error Cannot perform static linking when building more than one JVM library) | |
| endif | |
| # Find all modules with static libraries | |
| STATIC_LIB_MODULES := $(patsubst $(SUPPORT_OUTPUTDIR)/modules_static-libs/%, \ | |
| %, $(wildcard $(SUPPORT_OUTPUTDIR)/modules_static-libs/*)) | |
| # Filter out known broken libraries. This is a temporary measure until | |
| # proper support for these libraries can be provided. | |
| ifeq ($(call isTargetOs, linux), true) | |
| # libsplashscreen has a name conflict with libawt in the function | |
| # BitmapToYXBandedRectangles, so we exclude it for now. | |
| BROKEN_STATIC_LIBS += splashscreen | |
| else ifeq ($(call isTargetOs, macosx), true) | |
| # libosxsecurity has a name conflict with libosxapp in the function | |
| # JavaStringToNSString, so we exclude it for now. | |
| BROKEN_STATIC_LIBS += osxsecurity | |
| else ifeq ($(call isTargetOs, windows), true) | |
| # libsplashscreen has a name conflict with libawt in the function | |
| # BitmapToYXBandedRectangles, so we exclude it for now. | |
| BROKEN_STATIC_LIBS += splashscreen | |
| # libsspi_bridge has name conflicts with sunmscapi | |
| BROKEN_STATIC_LIBS += sspi_bridge | |
| # dt_shmem define jdwpTransport_OnLoad which conflict with dt_socket | |
| BROKEN_STATIC_LIBS += dt_shmem | |
| else ifeq ($(call isTargetOs, aix), true) | |
| # libsplashscreen has a name conflict with libawt in the function | |
| # BitmapToYXBandedRectangles, so we exclude it for now. | |
| BROKEN_STATIC_LIBS += splashscreen | |
| endif | |
| $(foreach module, $(STATIC_LIB_MODULES), \ | |
| $(eval LIBS_$(module) := $(filter-out $(BROKEN_STATIC_LIBS), $(shell cat \ | |
| $(SUPPORT_OUTPUTDIR)/modules_static-libs/$(module)/module-included-libs.txt))) \ | |
| ) | |
| STATIC_LIB_FILES := $(foreach module, $(STATIC_LIB_MODULES), \ | |
| $(foreach lib, $(LIBS_$(module)), \ | |
| $(SUPPORT_OUTPUTDIR)/native/$(module)/lib$(lib)/static/$(LIBRARY_PREFIX)$(lib)$(STATIC_LIBRARY_SUFFIX))) | |
| # Add Hotspot | |
| STATIC_LIB_FILES += $(wildcard $(HOTSPOT_STATIC_LIB_PATH)/$(LIBRARY_PREFIX)jvm$(STATIC_LIBRARY_SUFFIX)) | |
| # Figure out what external libraries are required to link these static JDK | |
| # libraries. | |
| LIB_FLAGS_FILES := $(addsuffix .lib-flags.txt, $(STATIC_LIB_FILES)) | |
| # Gather the lib flags from all individual libraries. There are many duplicates, | |
| # so sort and just keep unique instances. On macOS, a common pattern is | |
| # "-framework FooFramework", so we must make sure we keep the two words together. | |
| EXTERNAL_LIBS := $(strip $(shell $(CAT) $(LIB_FLAGS_FILES) | \ | |
| $(SED) -e 's/-framework /-framework_/g' | $(TR) ' ' '\n' | $(SORT) -u | \ | |
| $(SED) -e 's/-framework_/-framework /g')) | |
| ifeq ($(call isTargetOs, macosx), true) | |
| STATIC_LIBS := $(addprefix -force_load$(SPACE), $(STATIC_LIB_FILES)) | |
| else ifeq ($(call isTargetOs, linux), true) | |
| STATIC_LIBS := -Wl,--export-dynamic -Wl,--whole-archive $(STATIC_LIB_FILES) -Wl,--no-whole-archive | |
| else ifeq ($(call isTargetOs, windows), true) | |
| STATIC_LIBS := $(addprefix -wholearchive:, $(STATIC_LIB_FILES)) | |
| else ifeq ($(call isTargetOs, aix), true) | |
| # on AIX we have to generate export files for all static libs, because we have no whole-archive linker flag | |
| $(foreach lib, $(STATIC_LIB_FILES), \ | |
| $(eval $(call SetupExecute, generate_export_list_$(notdir $(lib)), \ | |
| INFO := Generating export list for $(notdir $(lib)), \ | |
| DEPS := $(lib), \ | |
| OUTPUT_FILE := $(lib).exp, \ | |
| COMMAND := ( $(AR) $(ARFLAGS) -w $(lib) | $(GREP) -v '^\.' | $(AWK) '{print $$1}' | $(SORT) -u > $(lib).exp ), \ | |
| )) \ | |
| $(eval STATIC_LIB_EXPORT_FILES += $(lib).exp) \ | |
| ) | |
| STATIC_LIBS := -Wl,-bexpfull $(STATIC_LIB_FILES) $(addprefix -Wl$(COMMA)-bE:, $(STATIC_LIB_EXPORT_FILES)) | |
| ifeq ($(DEBUG_LEVEL), slowdebug) | |
| STATIC_LIBS += -Wl,-bbigtoc | |
| endif | |
| else | |
| $(error Unsupported platform) | |
| endif | |
| $(eval $(call SetupBuildLauncher, java, \ | |
| ENABLE_ARG_FILES := true, \ | |
| EXPAND_CLASSPATH_WILDCARDS := true, \ | |
| EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \ | |
| VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \ | |
| OPTIMIZATION := HIGH, \ | |
| STATIC_LAUNCHER := true, \ | |
| LDFLAGS := $(LDFLAGS_STATIC_JDK), \ | |
| LIBS := $(STATIC_LIBS) $(EXTERNAL_LIBS), \ | |
| LINK_TYPE := C++, \ | |
| OUTPUT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \ | |
| OBJECT_DIR := $(STATIC_LAUNCHER_OUTPUT_DIR), \ | |
| )) | |
| $(java): $(STATIC_LIB_FILES) | |
| ifeq ($(call isTargetOs, aix), true) | |
| $(java): $(STATIC_LIB_EXPORT_FILES) | |
| endif | |
| TARGETS += $(java) | |
| JAVA_LAUNCHER := $(BUILD_LAUNCHER_java_TARGET) | |
| static-launcher: $(java) | |
| ################################################################################ | |
| # | |
| # Create the static-jdk image with the statically built java launcher | |
| # | |
| ################################################################################ | |
| # Until we get proper support in jlink for generating an image with static | |
| # builds, we need to create the image ourselves. We base it on a normal | |
| # dynamically linked JDK image. | |
| # All these files/dirs should be copied as-is | |
| JDK_IMAGE_COPY_FILES := $(addprefix $(JDK_IMAGE_DIR)/, conf demo include jmods \ | |
| legal man/man1/java.1 release README) | |
| # We need to copy some files from lib, but not the dynamic libraries themselves | |
| ALL_LIB_FILES := $(call FindFiles, $(JDK_IMAGE_DIR)/lib) | |
| # Remove all dynamic libraries from the list | |
| JDK_IMAGE_COPY_LIB_FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(ALL_LIB_FILES)) | |
| # Remove all debug files from the list | |
| ifeq ($(call isTargetOs, macosx), true) | |
| JDK_IMAGE_COPY_LIB_FILES := $(call not-containing, .dSYM, $(JDK_IMAGE_COPY_LIB_FILES)) | |
| else | |
| JDK_IMAGE_COPY_LIB_FILES := $(filter-out %.debuginfo %.pdb %.map, $(JDK_IMAGE_COPY_LIB_FILES)) | |
| endif | |
| static-jdk-info: | |
| $(call LogWarn, Creating static-jdk image) | |
| $(eval $(call SetupCopyFiles, copy-from-jdk-image, \ | |
| SRC := $(JDK_IMAGE_DIR), \ | |
| DEST := $(STATIC_JDK_IMAGE_DIR), \ | |
| FILES := $(call FindFiles, $(JDK_IMAGE_COPY_FILES)) \ | |
| $(JDK_IMAGE_COPY_LIB_FILES), \ | |
| )) | |
| TARGETS += $(copy-from-jdk-image) | |
| $(copy-from-jdk-image): | static-jdk-info | |
| $(eval $(call SetupCopyFiles, copy-static-launcher, \ | |
| FILES := $(JAVA_LAUNCHER), \ | |
| DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ | |
| )) | |
| TARGETS += $(copy-static-launcher) | |
| $(eval $(call SetupCopyFiles, copy-static-launcher-debuginfo, \ | |
| SRC := $(STATIC_LAUNCHER_OUTPUT_DIR), \ | |
| DEST := $(STATIC_JDK_IMAGE_DIR)/bin, \ | |
| FILES := $(call FindDebuginfoFiles, $(STATIC_LAUNCHER_OUTPUT_DIR)), \ | |
| )) | |
| TARGETS += $(copy-static-launcher-debuginfo) | |
| static-jdk-image: $(copy-from-jdk-image) $(copy-static-launcher) $(copy-static-launcher-debuginfo) | |
| TARGETS += static-jdk-image | |
| .PHONY: static-launcher static-jdk-image | |
| ################################################################################ | |
| include MakeFileEnd.gmk |