#
# Copyright (c) 2011, 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)

################################################################################

################################################################################
# Install the launcher name, release version string, full version
# string and the runtime name into the VersionProps.java file.

$(eval $(call SetupTextFileProcessing, BUILD_VERSION_JAVA, \
    SOURCE_FILES := $(TOPDIR)/src/java.base/share/classes/java/lang/VersionProps.java.template, \
    OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/java/lang/VersionProps.java, \
    REPLACEMENTS := \
        @@LAUNCHER_NAME@@ => $(LAUNCHER_NAME) ; \
        @@RUNTIME_NAME@@ => $(RUNTIME_NAME) ; \
        @@VERSION_SHORT@@ => $(VERSION_SHORT) ; \
        @@VERSION_STRING@@ => $(VERSION_STRING) ; \
        @@VERSION_NUMBER@@ => $(VERSION_NUMBER) ; \
        @@VERSION_PRE@@ => $(VERSION_PRE) ; \
        @@VERSION_BUILD@@ => $(VERSION_BUILD) ; \
        @@VERSION_OPT@@ => $(VERSION_OPT) ; \
        @@VERSION_DATE@@ => $(VERSION_DATE) ; \
        @@VERSION_CLASSFILE_MAJOR@@ => $(VERSION_CLASSFILE_MAJOR) ; \
        @@VERSION_CLASSFILE_MINOR@@ => $(VERSION_CLASSFILE_MINOR) ; \
        @@VERSION_SPECIFICATION@@ => $(VERSION_SPECIFICATION) ; \
        @@VENDOR_VERSION_STRING@@ => $(VENDOR_VERSION_STRING) ; \
        @@VENDOR@@ => $(COMPANY_NAME) ; \
        @@VENDOR_URL@@ => $(VENDOR_URL) ; \
        @@VENDOR_URL_BUG@@ => $(VENDOR_URL_BUG) ; \
        @@VENDOR_URL_VM_BUG@@ => $(VENDOR_URL_VM_BUG), \
))


# Normalize OPENJDK_TARGET_CPU name to match jdk.internal.util.Architecture enum
ifneq ($(filter $(OPENJDK_TARGET_CPU), s390x), )
  OPENJDK_TARGET_ARCH_CANONICAL = s390
else ifneq ($(filter $(OPENJDK_TARGET_CPU), x86_64 amd64), )
  OPENJDK_TARGET_ARCH_CANONICAL = x64
else
  OPENJDK_TARGET_ARCH_CANONICAL := $(OPENJDK_TARGET_CPU)
endif

# Normalize OPENJDK_TARGET_OS operating system name to match jdk.internal.util.OperatingSystem enum
ifeq ($(OPENJDK_TARGET_OS), macosx)
  OPENJDK_TARGET_OS_CANONICAL = macos
else
  OPENJDK_TARGET_OS_CANONICAL := $(OPENJDK_TARGET_OS)
endif

$(eval $(call SetupTextFileProcessing, BUILD_PLATFORMPROPERTIES_JAVA, \
    SOURCE_FILES := $(TOPDIR)/src/java.base/share/classes/jdk/internal/util/PlatformProps.java.template, \
    OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/util/PlatformProps.java, \
    REPLACEMENTS := \
        @@OPENJDK_TARGET_OS@@ => $(OPENJDK_TARGET_OS_CANONICAL) ; \
        @@OPENJDK_TARGET_CPU@@ => $(OPENJDK_TARGET_ARCH_CANONICAL) ; \
        @@OPENJDK_TARGET_CPU_ENDIAN@@ => $(OPENJDK_TARGET_CPU_ENDIAN) ; \
        @@OPENJDK_TARGET_CPU_BITS@@ => $(OPENJDK_TARGET_CPU_BITS), \
))

TARGETS += $(BUILD_VERSION_JAVA) $(BUILD_PLATFORMPROPERTIES_JAVA)
################################################################################

ifneq ($(filter $(TOOLCHAIN_TYPE), gcc clang), )
  # Need to specify language since the template file has a non standard
  # extension.
  CPP_FLAGS += -x c
else ifeq ($(TOOLCHAIN_TYPE), microsoft)
  CPP_FLAGS += -nologo

  ifeq ($(OPENJDK_TARGET_CPU), aarch64)
    # cl.exe does only recognize few file extensions as valid (ex: .c, .h, .cpp), so
    # make sure *.java.template files are recognized as valid input files
    CPP_FILEPREFIX = -Tc
  endif
endif

# Generate a java source file from a template through the C preprocessor for the
# target system. First extract the copyright notice at the start of the file.
# Run the preprocessor. Filter out the default compiler stderr output on
# Windows. Filter out all the header files output. Remove all "PREFIX_" strings
# that were added to variable references in the template files to avoid being
# matched by the preprocessor. Remove any #line directives left by the
# preprocessor.
define generate-preproc-src
	$(call MakeDir, $(@D))
	$(call ExecuteWithLog, $(SUPPORT_OUTPUTDIR)/gensrc/java.base/_$(@F), \
	    ( $(AWK) '/@@END_COPYRIGHT@@/{exit}1' $< && \
	      $(CPP) $(CPP_FLAGS) $(SYSROOT_CFLAGS) $(CFLAGS_JDKLIB) $(CPP_FILEPREFIX) $< \
	          2> >($(GREP) -v '^$(<F)$$' >&2) \
	          | $(AWK) '/@@START_HERE@@/,0' \
	          |  $(SED) -e 's/@@START_HERE@@/\/\/ AUTOMATICALLY GENERATED FILE - DO NOT EDIT/' \
	          -e 's/PREFIX_//' -e 's/^#.*//' \
	    ) > $@ \
	)
endef

GENSRC_SOR_FILE += $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/nio/ch/SocketOptionRegistry.java

$(GENSRC_SOR_FILE): \
    $(TOPDIR)/src/java.base/share/classes/sun/nio/ch/SocketOptionRegistry.java.template
	$(generate-preproc-src)

TARGETS += $(GENSRC_SOR_FILE)

################################################################################

ifeq ($(call isTargetOs, windows), false)

  GENSRC_UC_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/sun/nio/fs/UnixConstants.java

  $(GENSRC_UC_FILE): \
      $(TOPDIR)/src/java.base/unix/classes/sun/nio/fs/UnixConstants.java.template
	$(generate-preproc-src)

  TARGETS += $(GENSRC_UC_FILE)

endif

# Create the javax/crypto/JceSecurity.class, using the build default.
#
ifeq ($(UNLIMITED_CRYPTO), true)
    JCE_DEFAULT_POLICY = unlimited
else
    JCE_DEFAULT_POLICY = limited
endif

ifneq ($(wildcard $(TOPDIR)/src/java.base/share/classes/javax/crypto/JceSecurity.java.template), )
  $(eval $(call SetupTextFileProcessing, BUILD_JCESECURITY_JAVA, \
      SOURCE_FILES := $(TOPDIR)/src/java.base/share/classes/javax/crypto/JceSecurity.java.template, \
      OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/javax/crypto/JceSecurity.java, \
      REPLACEMENTS := \
        @@JCE_DEFAULT_POLICY@@ => $(JCE_DEFAULT_POLICY), \
  ))

  TARGETS += $(BUILD_JCESECURITY_JAVA)
endif

################################################################################

endif # include guard
include MakeIncludeEnd.gmk
