| # |
| # Copyright (c) 2018, 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 MakeIncludeStart.gmk |
| ifeq ($(INCLUDE), true) |
| |
| ################################################################################ |
| |
| include NativeCompilation.gmk |
| |
| FindSrcDirsForComponent += \ |
| $(call uniq, $(wildcard \ |
| $(TOPDIR)/src/$(strip $1)/$(OPENJDK_TARGET_OS)/native/$(strip $2) \ |
| $(TOPDIR)/src/$(strip $1)/$(OPENJDK_TARGET_OS_TYPE)/native/$(strip $2) \ |
| $(TOPDIR)/src/$(strip $1)/share/native/$(strip $2))) |
| |
| # Find a library. Used for declaring dependencies on libraries in different |
| # modules. |
| # Param 1 - module name |
| # Param 2 - library name |
| # Param 3 - optional subdir for library |
| FindLib = \ |
| $(call FindLibDirForModule, \ |
| $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) |
| |
| # Find a static library |
| # Param 1 - module name |
| # Param 2 - library name |
| # Param 3 - optional subdir for library |
| FindStaticLib = \ |
| $(addprefix $(SUPPORT_OUTPUTDIR)/native/, \ |
| $(strip $1)$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(STATIC_LIBRARY_SUFFIX)) |
| |
| # If only generating compile_commands.json, make these return empty to avoid |
| # declaring dependencies. |
| ifeq ($(GENERATE_COMPILE_COMMANDS_ONLY), true) |
| FindLib = |
| FindStaticLib = |
| endif |
| # If building static versions of libraries, make these return empty to avoid |
| # declaring dependencies. |
| ifeq ($(STATIC_LIBS), true) |
| FindLib = |
| FindStaticLib = |
| endif |
| |
| # Returns the module specific java header dir if it exists. |
| # Param 1 - module name |
| GetJavaHeaderDir = \ |
| $(if $(strip $1),$(wildcard $(SUPPORT_OUTPUTDIR)/headers/$(strip $1))) |
| |
| HOTSPOT_INCLUDE_DIR := $(TOPDIR)/src/hotspot/share/include \ |
| $(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include |
| |
| # Preprocess a source dir destination. Pass on absolute paths unchanged. Expand |
| # description such as "java.base:headers" into a set of proper absolute paths, |
| # by looking in $MODULE/[shared|$OS|$OSTYPE]/native. |
| # Treat *:libjvm as a special case, and replace it with the proper hotspot |
| # include directories. |
| ProcessSrcDir = \ |
| $(if $(findstring :, $1), \ |
| $(if $(filter %:libjvm, $1), \ |
| $(HOTSPOT_INCLUDE_DIR) \ |
| , \ |
| $(call FindSrcDirsForComponent, $(firstword $(subst :, , $1)), \ |
| $(lastword $(subst :, , $1))) \ |
| ) \ |
| , \ |
| $(if $(filter /%, $1), \ |
| $1 \ |
| , \ |
| $(if $(filter libjvm, $1), \ |
| $(HOTSPOT_INCLUDE_DIR) \ |
| , \ |
| $(call FindSrcDirsForComponent, $(MODULE), $1) \ |
| ) \ |
| ) \ |
| ) |
| |
| # Create a proper LIBPATH for the given library. Sets result in $1_$2_LIBPATH. |
| # $1: The name of the rule (namespace) |
| # $2: The safe namespace of the library |
| define ResolveLibPath |
| # Determine proper LIBPATH. This is quite messy due to historical reasons, |
| # and because we need to have special treatment for "gtest:" and ":jvm". |
| ifneq ($$($1_$2_MODULE), gtest) |
| ifneq ($$($1_$2_NAME), jvm) |
| # This is the common case |
| ifeq ($$(call isTargetOs, windows), true) |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/native/$$($1_$2_MODULE)/lib$$($1_$2_NAME) |
| else |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/native/$$($1_$2_MODULE)/lib$$($1_$2_NAME)/static |
| else ifeq ($$($1_$2_STATIC_LIBRARY), true) |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/native/$$($1_$2_MODULE) |
| else |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/modules_libs/$$($1_$2_MODULE) |
| endif |
| endif |
| else |
| # Special treatment for hotspot |
| ifeq ($(CREATING_BUILDJDK), true) |
| # When building a buildjdk, it's always only the server variant |
| $1_$2_JVM_VARIANT_PATH := server |
| else |
| $1_$2_JVM_VARIANT_PATH := $(JVM_VARIANT_MAIN) |
| endif |
| ifeq ($$(call isTargetOs, windows), true) |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(HOTSPOT_OUTPUTDIR)/variant-$$($1_$2_JVM_VARIANT_PATH)/libjvm/objs/static |
| else |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/modules_libs/$$($1_$2_MODULE) |
| endif |
| else |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(HOTSPOT_OUTPUTDIR)/variant-$$($1_$2_JVM_VARIANT_PATH)/libjvm/objs/static |
| else |
| $1_$2_LIBPATH := $$(SUPPORT_OUTPUTDIR)/modules_libs/$$($1_$2_MODULE)/$$($1_$2_JVM_VARIANT_PATH) |
| endif |
| endif |
| endif |
| else |
| # Special treatment for virtual module "gtest" |
| ifeq ($$($1_$2_NAME), jvm) |
| ifeq ($$(call isTargetOs, windows), true) |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/gtest/objs/static |
| else |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/gtest/objs |
| endif |
| else |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/gtest/objs/static |
| else |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/gtest |
| endif |
| endif |
| else ifeq ($$($1_$2_NAME), gtest) |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/libgtest |
| ifeq ($(STATIC_LIBS), true) |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/libgtest/objs/static |
| else |
| $1_$2_LIBPATH := $$(JVM_OUTPUTDIR)/libgtest |
| endif |
| endif |
| endif |
| endef |
| |
| # Process a JDK library designation such as "java.desktop:jawt" into the needed |
| # additions to EXTRA_LINK_DEPS, LDFLAGS, LIBS and EXTRA_HEADER_DIRS. |
| # $1: The name of the rule (namespace) |
| # $2: The safe namespace of the library |
| # $3: The actual string given to represent the library |
| define AddJdkLibrary |
| $1_$2_NAME := $$(strip $$(lastword $$(subst :, , $3))) |
| $1_$2_MODULE := $$(strip $$(patsubst %$$($1_$2_NAME), %, $3)) |
| |
| ifeq ($$(filter lib%, $$($1_$2_NAME)), ) |
| $$(error Library name $$($1_$2_NAME) missing lib prefix in $1) |
| endif |
| $1_$2_NAME := $$(strip $$(patsubst lib%, %, $$($1_$2_NAME))) |
| |
| ifeq ($$($1_$2_MODULE), ) |
| $1_$2_MODULE := $$(MODULE) |
| else |
| $1_$2_MODULE := $$(strip $$(patsubst %:, %, $$($1_$2_MODULE))) |
| endif |
| |
| # Determine if the library in question is static. |
| # Ideally, we should not hardcode these |
| ifeq ($(call isTargetOs, aix)+$$($1_$2_MODULE):$$($1_$2_NAME), true+java.base:jli) |
| $1_$2_STATIC_LIBRARY := true |
| endif |
| ifeq ($$($1_$2_MODULE):$$($1_$2_NAME), gtest:gtest) |
| $1_$2_STATIC_LIBRARY := true |
| endif |
| |
| # Setup $1_$2_LIBPATH. |
| $$(eval $$(call ResolveLibPath,$1,$2)) |
| |
| $1_EXTRA_HEADER_DIRS += $$($1_$2_MODULE):lib$$($1_$2_NAME) |
| |
| ifneq ($(STATIC_LIBS), true) |
| ifeq ($$(call isTargetOs, windows), true) |
| ifeq ($$(filter -libpath:$$($1_$2_LIBPATH), $$($1_LDFLAGS)), ) |
| $1_LDFLAGS += -libpath:$$($1_$2_LIBPATH) |
| endif |
| $1_LIBS += $$($1_$2_NAME)$(STATIC_LIBRARY_SUFFIX) |
| $1_$2_LIBFILE := $(LIBRARY_PREFIX)$$($1_$2_NAME)$(STATIC_LIBRARY_SUFFIX) |
| else |
| ifeq ($$(filter -L$$($1_$2_LIBPATH), $$($1_LDFLAGS)), ) |
| $1_LDFLAGS += -L$$($1_$2_LIBPATH) |
| endif |
| $1_LIBS += -l$$($1_$2_NAME) |
| ifeq ($$($1_$2_STATIC_LIBRARY), true) |
| $1_$2_LIBFILE := $(LIBRARY_PREFIX)$$($1_$2_NAME)$(STATIC_LIBRARY_SUFFIX) |
| else |
| $1_$2_LIBFILE := $(LIBRARY_PREFIX)$$($1_$2_NAME)$(SHARED_LIBRARY_SUFFIX) |
| endif |
| endif |
| |
| $1_EXTRA_LINK_DEPS += $$($1_$2_LIBPATH)/$$($1_$2_LIBFILE) |
| endif |
| endef |
| |
| GLOBAL_VERSION_INFO_RESOURCE := $(TOPDIR)/src/java.base/windows/native/common/version.rc |
| |
| # \xA9 is the copyright symbol in ANSI encoding (Windows-1252), which rc.exe |
| # assumes the resource file is in. |
| JDK_RCFLAGS=$(RCFLAGS) \ |
| -D"JDK_VERSION_STRING=$(VERSION_STRING)" \ |
| -D"JDK_COMPANY=$(JDK_RC_COMPANY_NAME)" \ |
| -D"JDK_VER=$(VERSION_NUMBER_FOUR_POSITIONS)" \ |
| -D"JDK_COPYRIGHT=Copyright \xA9 $(COPYRIGHT_YEAR)" \ |
| -D"JDK_NAME=$(JDK_RC_NAME) $(VERSION_SHORT)" \ |
| -D"JDK_FVER=$(subst .,$(COMMA),$(VERSION_NUMBER_FOUR_POSITIONS))" |
| |
| # Setup make rules for creating a native binary with suitable defaults |
| # for the OpenJDK project. This macro is mostly considered to be an internal |
| # support version. Please use SetupJdkLibrary or SetupJdkExecutable instead. |
| # |
| # 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 parameters are named arguments. These are all passed on to |
| # SetupNativeCompilation. This macro also adds the following additional |
| # arguments: |
| # |
| # SRC -- this is passed on after preprocessing. The preprocessing will pass on |
| # absolute paths unchanged, but relative paths will be expanded to include |
| # all directories with this name in $MODULE/[shared|$OS|$OSTYPE]/native. |
| # EXTRA_SRC -- additional directories to look for source in. This is processed |
| # like SRC. |
| # EXCLUDE_SRC_PATTERNS -- exclude source dirs matching these patterns from |
| # appearing in SRC. |
| # EXTRA_HEADER_DIRS -- additional directories to look for headers in. This can |
| # be specified either as an absolute path, or relative directory names which |
| # are preprocessed like SRC, or in the format <module>:<directory>, which |
| # will be processed like SRC but for the given module. The names |
| # "java.base:libjvm" and "gtest:libjvm" symbolise virtual libraries that |
| # will be replaced with proper values for hotspot. |
| # HEADERS_FROM_SRC -- if false, does not add source dirs automatically as |
| # header include dirs. (Defaults to true.) |
| # JAVA_HEADERS -- if false, does not add the directory with the generated |
| # headers from the Java compilation of the current module to the search |
| # path for include files. (Defaults to true.) |
| # JDK_LIBS -- libraries generated by the JDK build system to link against. |
| # These take the form <module>:<basename>. For the current module, the |
| # module name and colon can be omitted. The basename should be specified |
| # as the source directory, e.g. "libjava". The gtest module is a virtual |
| # module that will be replaced with correct values for gtest. When |
| # specifying JDK_LIBS, suitable values for EXTRA_LINK_DEPS, LDFLAGS, LIBS |
| # and EXTRA_HEADER_DIRS will be added. |
| # JDK_LIBS_<os> or JDK_LIBS_<osType> -- additional JDK_LIBS for the given OS |
| # or OS type only |
| # ONLY_EXPORTED -- if true, this library will be flagged as not |
| # to be included for this module when building static libs |
| # EXTRA_RCFLAGS -- additional RCFLAGS to append. |
| # RC_FILEDESC -- override the default FILEDESC for Windows version.rc |
| # DEFAULT_LIBCXX -- if false, do not add LIBCXX to LIBS for C++ compilations |
| # DEFAULT_CFLAGS -- if false, do not add default CFLAGS and CXXFLAGS |
| # DEFAULT_LDFLAGS -- if false, do not add default LDFLAGS |
| # CFLAGS_FILTER_OUT -- flags to filter out from default CFLAGS |
| # CXXFLAGS_FILTER_OUT -- flags to filter out from default CXXFLAGS |
| # LDFLAGS_FILTER_OUT -- flags to filter out from default LDFLAGS |
| # LD_SET_ORIGIN -- if false, do not add SET_*_ORIGIN flags to LDFLAGS |
| # APPEND_LDFLAGS -- a quirk to have additional LDFLAGS that will be set after |
| # the origin flags |
| # DEFAULT_VERSIONINFO_RESOURCE -- if false, do not set the default |
| # VERSIONINFO_RESOURCE |
| # |
| SetupJdkNativeCompilation = $(NamedParamsMacroTemplate) |
| define SetupJdkNativeCompilationBody |
| ifeq ($$($1_TYPE), EXECUTABLE) |
| $1_NATIVE_DIR_PREFIX := |
| $1_MODULES_PATH := modules_cmds |
| $1_RC_EXT := exe |
| $1_RC_FTYPE := 0x1L |
| else |
| $1_NATIVE_DIR_PREFIX := lib |
| $1_MODULES_PATH := modules_libs |
| $1_RC_EXT := dll |
| $1_RC_FTYPE := 0x2L |
| endif |
| |
| ifneq ($$(MODULE), ) |
| # Record the fact that this native library is part of the current module |
| # (unless told otherwise). This variable stores information about all |
| # created libraries, and is read by ModuleWrapper. |
| ifneq ($$($1_ONLY_EXPORTED), true) |
| $$(MODULE)_INCLUDED_LIBS += $$($1_NAME) |
| endif |
| endif |
| |
| ifeq ($$($1_OUTPUT_DIR), ) |
| ifneq ($$(MODULE), ) |
| ifeq ($$($1_TYPE), STATIC_LIBRARY) |
| $1_OUTPUT_DIR := $$(SUPPORT_OUTPUTDIR)/native/$$(MODULE) |
| else |
| $1_OUTPUT_DIR := $$(SUPPORT_OUTPUTDIR)/$$($1_MODULES_PATH)/$$(strip $$(MODULE)) |
| endif |
| else |
| $$(error Must specify OUTPUT_DIR in a MODULE free context) |
| endif |
| endif |
| |
| ifeq ($$($1_OBJECT_DIR), ) |
| ifneq ($$(MODULE), ) |
| $1_OBJECT_DIR := $$(SUPPORT_OUTPUTDIR)/native/$$(MODULE)/$$($1_NATIVE_DIR_PREFIX)$$($1_NAME) |
| else |
| $$(error Must specify OBJECT_DIR in a MODULE free context) |
| endif |
| endif |
| |
| ifneq ($$($1_DEFAULT_LIBCXX), false) |
| ifeq ($$($1_LINK_TYPE), C++) |
| $1_LIBS += $(LIBCXX) |
| endif |
| endif |
| |
| ifeq ($$($1_SRC), ) |
| ifneq ($$(MODULE), ) |
| $1_SRC := $$(call FindSrcDirsForComponent, $$(MODULE), $$($1_NATIVE_DIR_PREFIX)$$($1_NAME)) |
| else |
| ifeq ($$($1_EXTRA_FILES), ) |
| $$(error Must specify SRC or EXTRA_FILES in a MODULE free context) |
| endif |
| endif |
| else |
| $1_SRC := $$(foreach dir, $$($1_SRC), $$(call ProcessSrcDir, $$(dir))) |
| endif |
| ifneq ($$($1_EXTRA_SRC), ) |
| $1_SRC += $$(foreach dir, $$($1_EXTRA_SRC), $$(call ProcessSrcDir, $$(dir))) |
| endif |
| |
| ifneq ($$($1_EXCLUDE_SRC_PATTERNS), ) |
| $1_SRC_WITHOUT_WORKSPACE_ROOT := $$(patsubst $$(WORKSPACE_ROOT)/%, %, $$($1_SRC)) |
| $1_EXCLUDE_SRC := $$(addprefix %, $$(call containing, $$($1_EXCLUDE_SRC_PATTERNS), \ |
| $$($1_SRC_WITHOUT_WORKSPACE_ROOT))) |
| $1_SRC := $$(filter-out $$($1_EXCLUDE_SRC), $$($1_SRC)) |
| endif |
| |
| ifneq ($$($1_DEFAULT_VERSIONINFO_RESOURCE), false) |
| ifeq ($$($1_VERSIONINFO_RESOURCE), ) |
| $1_VERSIONINFO_RESOURCE := $$(GLOBAL_VERSION_INFO_RESOURCE) |
| endif |
| endif |
| |
| ifeq ($$($1_RC_FILEDESC), ) |
| $1_RC_FILEDESC := $(JDK_RC_NAME) binary |
| endif |
| $1_RCFLAGS := $(JDK_RCFLAGS) \ |
| -D"JDK_FILEDESC=$$($1_RC_FILEDESC)" \ |
| -D"JDK_FNAME=$$($1_NAME).$$($1_RC_EXT)" \ |
| -D"JDK_INTERNAL_NAME=$$($1_NAME)" \ |
| -D"JDK_FTYPE=$$($1_RC_FTYPE)" \ |
| -I$(TOPDIR)/src/java.base/windows/native/common \ |
| $$($1_EXTRA_RCFLAGS) |
| |
| ifneq ($$($1_HEADERS_FROM_SRC), false) |
| $1_SRC_HEADER_FLAGS := $$(addprefix -I, $$(wildcard $$($1_SRC))) |
| endif |
| |
| # Add the module specific java header dir |
| ifneq ($$(MODULE), ) |
| ifneq ($$($1_JAVA_HEADERS), false) |
| $1_SRC_HEADER_FLAGS += $$(addprefix -I, $$(call GetJavaHeaderDir, $$(MODULE))) |
| endif |
| endif |
| |
| $1_JDK_LIBS += $$($1_JDK_LIBS_$$(OPENJDK_TARGET_OS)) |
| $1_JDK_LIBS += $$($1_JDK_LIBS_$$(OPENJDK_TARGET_OS_TYPE)) |
| $$(foreach lib, $$($1_JDK_LIBS), \ |
| $$(eval $$(call AddJdkLibrary,$1,$$(subst :,_,$$(lib)),$$(lib))) \ |
| ) |
| |
| # Add the include path for jni.h to all native compilations |
| $1_EXTRA_HEADER_DIRS += \ |
| $(SUPPORT_OUTPUTDIR)/modules_include/java.base \ |
| java.base:include \ |
| # |
| |
| $1_PROCESSED_EXTRA_HEADER_DIRS := $$(foreach dir, $$($1_EXTRA_HEADER_DIRS), \ |
| $$(call ProcessSrcDir, $$(dir))) |
| $1_EXTRA_HEADER_FLAGS := $$(addprefix -I, $$($1_PROCESSED_EXTRA_HEADER_DIRS)) |
| |
| ifneq ($$($1_DEFAULT_CFLAGS), false) |
| ifeq ($$($1_TYPE), EXECUTABLE) |
| # Set the default flags first to be able to override |
| $1_CFLAGS := $$(filter-out $$($1_CFLAGS_FILTER_OUT), $$(CFLAGS_JDKEXE)) $$($1_CFLAGS) |
| |
| # Set the default flags first to be able to override |
| $1_CXXFLAGS := $$(filter-out $$($1_CXXFLAGS_FILTER_OUT), $$(CXXFLAGS_JDKEXE)) $$($1_CXXFLAGS) |
| else |
| # Set the default flags first to be able to override |
| $1_CFLAGS := $$(filter-out $$($1_CFLAGS_FILTER_OUT), $$(CFLAGS_JDKLIB)) $$($1_CFLAGS) |
| |
| # Set the default flags first to be able to override |
| $1_CXXFLAGS := $$(filter-out $$($1_CXXFLAGS_FILTER_OUT), $$(CXXFLAGS_JDKLIB)) $$($1_CXXFLAGS) |
| endif |
| endif |
| |
| ifneq ($$($1_CFLAGS), ) |
| $1_CFLAGS += $$($1_SRC_HEADER_FLAGS) $$($1_EXTRA_HEADER_FLAGS) |
| endif |
| ifneq ($$($1_CXXFLAGS), ) |
| $1_CXXFLAGS += $$($1_SRC_HEADER_FLAGS) $$($1_EXTRA_HEADER_FLAGS) |
| endif |
| ifeq ($$($1_CFLAGS)$$($1_CXXFLAGS), ) |
| $1_CFLAGS += $$($1_SRC_HEADER_FLAGS) $$($1_EXTRA_HEADER_FLAGS) |
| endif |
| |
| ifneq ($$($1_DEFAULT_LDFLAGS), false) |
| ifeq ($$($1_TYPE), EXECUTABLE) |
| # Set the default flags first to be able to override |
| $1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKEXE) $$($1_LDFLAGS)) |
| else |
| # Set the default flags first to be able to override |
| $1_LDFLAGS := $$(filter-out $$($1_LDFLAGS_FILTER_OUT), $$(LDFLAGS_JDKLIB) $$($1_LDFLAGS)) |
| endif |
| endif |
| |
| ifneq ($$($1_LD_SET_ORIGIN), false) |
| ifeq ($$($1_TYPE), EXECUTABLE) |
| $1_LDFLAGS += $$(call SET_EXECUTABLE_ORIGIN) |
| else |
| $1_LDFLAGS += $$(call SET_SHARED_LIBRARY_ORIGIN) |
| endif |
| endif |
| # APPEND_LDFLAGS, if it exists, must be set after the origin flags |
| # This is a workaround to keep existing behavior |
| $1_LDFLAGS += $$($1_APPEND_LDFLAGS) |
| |
| # Since we reuse the rule name ($1), all our arguments will pass through. |
| # We lose in transparency, but gain in brevity in this call... |
| $$(eval $$(call SetupNativeCompilation, $1)) |
| endef |
| |
| # Setup make rules for creating a native library with suitable defaults |
| # for the OpenJDK project. The default is to create a shared library, |
| # but by passing TYPE := STATIC_LIBARY, a static library can be created. |
| # |
| # 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 parameters are named arguments. These are all passed on to |
| # SetupJdkNativeCompilation. Please see that macro for details. |
| SetupJdkLibrary = $(NamedParamsMacroTemplate) |
| define SetupJdkLibraryBody |
| # If type is unspecified, default to LIBRARY |
| ifeq ($$($1_TYPE), ) |
| $1_TYPE := LIBRARY |
| endif |
| |
| # Since we reuse the rule name ($1), all our arguments will pass through. |
| # We lose in transparency, but gain in brevity in this call... |
| $$(eval $$(call SetupJdkNativeCompilation, $1)) |
| endef |
| |
| # Setup make rules for creating a native executable with suitable defaults |
| # for the OpenJDK project. |
| # |
| # 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 parameters are named arguments. These are all passed on to |
| # SetupJdkNativeCompilation. Please see that macro for details. |
| SetupJdkExecutable = $(NamedParamsMacroTemplate) |
| define SetupJdkExecutableBody |
| $1_TYPE := EXECUTABLE |
| |
| # Since we reuse the rule name ($1), all our arguments will pass through. |
| # We lose in transparency, but gain in brevity in this call... |
| $$(eval $$(call SetupJdkNativeCompilation, $1)) |
| endef |
| |
| ################################################################################ |
| |
| endif # include guard |
| include MakeIncludeEnd.gmk |