# # Copyright (c) 2016, 2023, 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 TextFileProcessing.gmk include Utils.gmk include Modules.gmk JVM_VARIANT := $(JVM_VARIANT_MAIN) include hotspot/HotspotCommon.gmk include hotspot/lib/JvmFeatures.gmk include hotspot/lib/JvmOverrideFiles.gmk include hotspot/lib/JvmFlags.gmk # Random number generation, with the amount of specified digits # No need to check if the parameter passed is a valid number, the shell will # be more than happy to complain if it isn't ;) RandomDigits = \ $(shell od -An -N8 -d /dev/urandom | sed -e 's| ||g' -e 's|\(.\{$(strip $1)\}\).*|\1|') # Modified version of utility from JdkNativeCompilation.gmk # The full path could be omitted, but it was chosen not to so wildcard # can work properly for existing directories. The pathsubst below that # this necessitates is a relatively small price to pay. FindModuleNativeDirs = \ $(call uniq, $(wildcard \ $(TOPDIR)/src/$(strip $1)/$(OPENJDK_TARGET_OS)/native \ $(TOPDIR)/src/$(strip $1)/$(OPENJDK_TARGET_OS_TYPE)/native \ $(TOPDIR)/src/$(strip $1)/share/native)) # Taken from JdkNativeCompilation.gmk FindJavaHeaderDir = \ $(if $(strip $1), $(wildcard $(SUPPORT_OUTPUTDIR)/headers/$(strip $1))) JAVA_DIRS := $(strip $(foreach module, $(call FindAllModules), \ $(patsubst $(TOPDIR)/%,%,$(filter-out $(OUTPUTDIR)%, \ $(call FindModuleSrcDirs, $(module)))))) NATIVE_DIRS := $(strip $(foreach module, $(call FindAllModules), \ $(patsubst $(TOPDIR)/%,%,$(call FindModuleNativeDirs, $(module))))) # Emit the defines extracted from the list of options specified in the first parameter into # the language settings file, in Eclipse format. EmitExtractedDefines = \ $(shell echo $(1) | grep -o "\-D\s\?") ################################################################################ # Create an Eclipse Workspace with the specified nature # # Parameter 1 is the name of the rule. This name is used as variable prefix, # and the targets generated are listed in a variable by that name. # # Remaining parameter(s) are named arguments: # NATURE - Which Eclipse Workspace nature to generate for the Workspace. Can # be one of JAVA, HOTSPOT, NATIVE, or MIXED. SetupEclipseWorkspace = $(NamedParamsMacroTemplate) define SetupEclipseWorkspaceBody $1_NATURES := $1_BUILD_MANAGERS := $1_LINKED_RESOURCES := ifeq ($$($1_NATURE), ) $$(error No nature specified for Eclipse Workspace, cannot continue) endif ifeq ($$(findstring $$($1_NATURE), JAVA HOTSPOT NATIVE MIXED), ) $$(error Unrecognised nature $$($1_NATURE) specified for Eclipse Workspace) endif $1_IDE_OUTPUTDIR := $(OUTPUTDIR)/ide/eclipse $1_CLASSPATH_FILE := $$($1_IDE_OUTPUTDIR)/.classpath $1_WORKSPACE_FILE := $$($1_IDE_OUTPUTDIR)/.project $1_NATIVE_FILE := $$($1_IDE_OUTPUTDIR)/.cproject $1_SETTINGS_FILE := $$($1_IDE_OUTPUTDIR)/.settings/language.settings.xml $$(call MakeDir, $$($1_IDE_OUTPUTDIR)) ifneq ($$(findstring $$($1_NATURE), HOTSPOT NATIVE MIXED), ) ifeq ($$(call isCompiler, microsoft), true) $$(error Visual C++ is not yet supported as an indexer for Native Workspaces!) endif endif ifneq ($$(findstring $$($1_NATURE), JAVA MIXED), ) $1_CLASSPATH := # Eclipse crashes when processing multiple module-info.java files # This is an annoying bug that has not been fixed for some time now $1_CLASSPATH += $$(foreach src, $(JAVA_DIRS), \ $$(NEWLINE)) $$(eval $$(call SetupTextFileProcessing, $1_CREATE_CLASSPATH_FILE, \ SOURCE_FILES := $(TOPDIR)/make/ide/eclipse/classpath.template, \ OUTPUT_FILE := $$($1_CLASSPATH_FILE), \ REPLACEMENTS := \ @@CLASSPATH@@ => $$($1_CLASSPATH), \ )) TARGETS += $$($1_CREATE_CLASSPATH_FILE) $1_NATURES += org.eclipse.jdt.core.javanature$$(NEWLINE) endif ifneq ($$(findstring $$($1_NATURE), HOTSPOT NATIVE MIXED), ) $1_NATIVE_SRCS := $1_BUILD_MANAGERS += \ \ org.eclipse.cdt.managedbuilder.core.genmakebuilder \ clean$$(COMMA)full$$(COMMA)incremental$$(COMMA) \ \ \ \ \ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder \ full$$(COMMA)incremental$$(COMMA) \ \ \ $$(NEWLINE) $1_NATURES += \ org.eclipse.cdt.core.cnature \ org.eclipse.cdt.core.ccnature \ org.eclipse.cdt.managedbuilder.core.managedBuildNature \ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature$$(NEWLINE) # This is always emitted, no matter which of the 3 natures were selected $1_NATIVE_SRCS += \ $$(NEWLINE) ifneq ($$(findstring $$($1_NATURE), NATIVE MIXED), ) $1_NATIVE_SRCS += $$(foreach src, $(NATIVE_DIRS), \ $$(NEWLINE)) endif $1_WORKSPACE_MAJOR := $$(call RandomDigits, 10) $1_WORKSPACE_MINOR := $$(call RandomDigits, 9) # FixPath already removes $(FIXPATH) automatically, but if we rely on FixPath # to do it for us dir won't be able to handle the converted path (if on Windows). # Reversing the order causes dir to mangle the preceeding $(FIXPATH) which breaks # the ability of FixPath to remove it, so it has to be manually removed here. # # Note that the workspace setup system currently does not support Visual C++ when # extracting compiler and/or system headers vital to the build! $1_ENV := $$(call FixPath, $$(dir $$(patsubst $(FIXPATH), , $(CC)))) # Sidestep annoying issue of WSL path conversion not working properly with true # Unix paths. Eclipse can't run the WSL make by itself anyway, even if we could # properly convert the path. ifeq ($$(call isBuildOsEnv, windows.wsl1 windows.wsl2), true) $1_MAKE := wsl.exe $(MAKE) else $1_MAKE := $$(call FixPath, $(MAKE)) endif # make reconfigure omitted since it is sensitive to which make was used # make dist-clean omitted since it would delete the Workspace as well $1_MATCHING_MAKE_TARGETS := $1_PLAIN_MAKE_TARGETS := update-build-docs docs gensrc gendata copy java \ launchers libs hotspot jdk product-images product-bundles all-images test-image clean $1_MATCHING_MAKE_TARGETS += $$(foreach name, $$($1_PLAIN_MAKE_TARGETS), \ \ $$($1_MAKE) \ -C $$(call FixPath, $(TOPDIR)) \ $$(strip $$(name)) \ true \ false \ true \ $$(NEWLINE)) $$(eval $$(call SetupTextFileProcessing, $1_CREATE_NATIVE_FILE, \ SOURCE_FILES := $(TOPDIR)/make/ide/eclipse/native.template, \ OUTPUT_FILE := $$($1_NATIVE_FILE), \ REPLACEMENTS := \ @@DIR@@ => $$(call FixPath, $(TOPDIR)) ; \ @@ENV@@ => $$($1_ENV) ; \ @@WORKSPACE@@ => $$($1_WORKSPACE_MAJOR) ; \ @@MINOR@@ => $$($1_WORKSPACE_MINOR) ; \ @@MAKE@@ => $$($1_MAKE) ; \ @@SRC@@ => $$($1_NATIVE_SRCS) ; \ @@MAKE_TARGETS@@ => $$($1_MATCHING_MAKE_TARGETS), \ )) TARGETS += $$($1_CREATE_NATIVE_FILE) $$(call MakeDir, $$($1_IDE_OUTPUTDIR)/.settings) $1_CSETTINGS := $1_CXXSETTINGS := ifneq ($$(findstring $$($1_NATURE), NATIVE MIXED), ) $1_CSETTINGS += $$(foreach module, $$(call FindAllModules), $$(if $$(call FindJavaHeaderDir, $$(module)), \ $$(foreach dirs, $$(strip $$(patsubst $(TOPDIR)/%,%,$$(call FindModuleNativeDirs, $$(module)))), \ \ \ $$(if $$(findstring jdk.sctp,$$(module)), ) \ $$(NEWLINE)))) # main.c source file used for generic launchers $1_CSETTINGS += \ \ \ $$(NEWLINE) endif # HotSpot first $1_CXXSETTINGS += $$(NEWLINE) # If only the Java Virtual Machine sources were requested, headers from other parts of # the native source that it needs will not be available. Add them as include paths here # instead. ifeq ($$($1_NATURE), HOTSPOT) $1_CXXSETTINGS += $$(foreach src, $$(strip $$(patsubst %,%/include,$$(call FindModuleNativeDirs, java.base))), \ $(X) $(X)$$(NEWLINE)) $1_CXXSETTINGS += $(X) $(X)$$(NEWLINE) endif $1_CXXSETTINGS += $(X) $(X)$$(NEWLINE) ifeq ($$(call check-jvm-feature, compiler2), true) $1_CXXSETTINGS += $(X) $(X)$$(NEWLINE) endif $1_CXXSETTINGS += $$(NEWLINE) $1_CXXSETTINGS += \ \ \ \ \ \ \ \ \ \ \ \ \ \ $$(NEWLINE) # Now the rest of the C++ sources in the codebase ifneq ($$(findstring $$($1_NATURE), NATIVE MIXED), ) $1_CXXSETTINGS += $$(foreach module, $$(call FindAllModules), $$(if $$(call FindJavaHeaderDir, $$(module)), \ $$(foreach dirs, $$(strip $$(patsubst $(TOPDIR)/%,%,$$(call FindModuleNativeDirs, $$(module)))), \ \ \ $$(NEWLINE)))) endif $$(eval $$(call SetupTextFileProcessing, $1_CREATE_SETTINGS_FILE, \ SOURCE_FILES := $(TOPDIR)/make/ide/eclipse/settings.template, \ OUTPUT_FILE := $$($1_SETTINGS_FILE), \ REPLACEMENTS := \ @@WORKSPACE@@ => $$($1_WORKSPACE_MAJOR) ; \ @@CSETTINGS@@ => $$($1_CSETTINGS) ; \ @@CXXSETTINGS@@ => $$($1_CXXSETTINGS), \ )) TARGETS += $$($1_CREATE_SETTINGS_FILE) endif ifneq ($$(findstring $$($1_NATURE), JAVA MIXED), ) $1_LINKED_RESOURCES += $$(foreach src, $(JAVA_DIRS), \ \ $$(strip $$(src)) \ 2 \ $$(subst \\,/,$$(call FixPath, $(TOPDIR)/$$(src))) \ $$(NEWLINE)) endif ifneq ($$(findstring $$($1_NATURE), HOTSPOT NATIVE MIXED), ) # CDT includes a Makefile editor, so if CDT support was indicated there's no harm in # including the make sources as well, since the cost of indexing them is miniscule $1_LINKED_RESOURCES += \ \ make \ 2 \ $$(subst \\,/,$$(call FixPath, $(TOPDIR)/make)) \ \ \ src/hotspot \ 2 \ $$(subst \\,/,$$(call FixPath, $(TOPDIR)/src/hotspot)) \ $$(NEWLINE) endif ifneq ($$(findstring $$($1_NATURE), NATIVE MIXED), ) $1_LINKED_RESOURCES += $$(foreach src, $(NATIVE_DIRS), \ \ $$(strip $$(src)) \ 2 \ $$(subst \\,/,$$(call FixPath, $(TOPDIR)/$$(src))) \ $$(NEWLINE)) endif $$(eval $$(call SetupTextFileProcessing, $1_CREATE_WORKSPACE_FILE, \ SOURCE_FILES := $(TOPDIR)/make/ide/eclipse/workspace.template, \ OUTPUT_FILE := $$($1_WORKSPACE_FILE), \ REPLACEMENTS := \ @@BUILD_MANAGERS@@ => $$($1_BUILD_MANAGERS) ; \ @@NATURES@@ => $$($1_NATURES) ; \ @@LINKED_RESOURCES@@ => $$($1_LINKED_RESOURCES), \ )) TARGETS += $$($1_CREATE_WORKSPACE_FILE) endef ifeq ($(WORKSPACE), java) $(eval $(call SetupEclipseWorkspace, SETUP_WORKSPACE, \ NATURE := JAVA, \ )) else ifeq ($(WORKSPACE), hotspot) $(eval $(call SetupEclipseWorkspace, SETUP_WORKSPACE, \ NATURE := HOTSPOT, \ )) else ifeq ($(WORKSPACE), native) $(eval $(call SetupEclipseWorkspace, SETUP_WORKSPACE, \ NATURE := NATIVE, \ )) else $(eval $(call SetupEclipseWorkspace, SETUP_WORKSPACE, \ NATURE := MIXED, \ )) endif all: $(TARGETS)