#
# 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)

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

include MakeIO.gmk

# Java compilation needs SetupJarArchive if we're generating a jar file
include JarArchive.gmk

###
### Definitions for common release targets
###

# Create classes that can run on the bootjdk
TARGET_RELEASE_BOOTJDK := $(BOOT_JDK_SOURCETARGET)

# Create classes that can be used in (or be a part of) the new jdk we're building
TARGET_RELEASE_NEWJDK := -source $(JDK_SOURCE_TARGET_VERSION) -target $(JDK_SOURCE_TARGET_VERSION)

# Create classes that can be used in JDK 8, for legacy support
TARGET_RELEASE_JDK8 := --release 8

# Create classes for the new jdk, relying only on the modules of the new jdk
TARGET_RELEASE_NEWJDK_UPGRADED := $(TARGET_RELEASE_NEWJDK) \
    --upgrade-module-path $(JDK_OUTPUTDIR)/modules --system none

define add_file_to_copy
  # param 1 = BUILD_MYPACKAGE
  # parma 2 = The source file to copy.
  $2_TARGET := $2
  # Remove the source prefix.
  $$(foreach i, $$($1_SRC), $$(eval $$(call remove_string,$$i,$2_TARGET)))
  # To allow for automatic overrides, do not create a rule for a target file that
  # already has one
  ifneq ($$($1_COPY_$$($2_TARGET)), 1)
    $1_COPY_$$($2_TARGET) := 1
    # Now we can setup the dependency that will trigger the copying.
    $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET) : $2
	$$(call LogInfo, Copying $$(patsubst $$(OUTPUTDIR)/%,%, $$@))
	$$(install-file)
	$(CHMOD) -f ug+w $$@

    # And do not forget this target
    $1_ALL_COPY_TARGETS += $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET)
  endif
endef

# This macro is used only for properties files that are to be
# copied over to the classes directory in cleaned form.
#
# An empty echo ensures that the input to sed always ends with a newline.
# Certain implementations (e.g. Solaris) will skip the last line without
# it.
#
# The sed expression does this:
# 1. Add a backslash before any :, = or ! that do not have a backslash already.
# 2. Delete all lines starting with #.
# 3. Delete empty lines.
# 4. Append lines ending with \ with the next line.
# 5. Remove leading and trailing white space. Note that tabs must be explicit
#    as sed on macosx does not understand '\t'.
# 6. Replace the first \= with just =.
# 7. Finally it's all sorted to create a stable output.
#
# It is assumed that = is the character used for separating names and values.
define add_file_to_clean
  # param 1 = BUILD_MYPACKAGE
  # parma 2 = The source file to copy and clean.
  $2_TARGET := $2
  # Remove the source prefix.
  $$(foreach i, $$($1_SRC), $$(eval $$(call remove_string,$$i,$2_TARGET)))
  # Now we can setup the dependency that will trigger the copying.
  # To allow for automatic overrides, do not create a rule for a target file that
  # already has one
  ifneq ($$($1_CLEAN_$$($2_TARGET)), 1)
    $1_CLEAN_$$($2_TARGET) := 1
    $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET) : $2
	$$(call LogInfo, Cleaning $$(patsubst $$(OUTPUTDIR)/%,%, $$@))
	$$(call MakeTargetDir)
	( $(CAT) $$< && $(ECHO) "" ) \
	    | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' \
	        -e 's/\([^\\]\)!/\1\\!/g' -e 's/^[ 	]*#.*/#/g' \
	    | $(SED) -e '/^#/d' -e '/^$$$$/d' \
	        -e :a -e '/\\$$$$/N; s/\\\n//; ta' \
	        -e 's/^[ 	]*//;s/[ 	]*$$$$//' \
	        -e 's/\\=/=/' \
	    | $(SORT) > $$@
	$(CHMOD) -f ug+w $$@

    # And do not forget this target
    $1_ALL_COPY_CLEAN_TARGETS += $$($1_BIN)$$($1_MODULE_SUBDIR)$$($2_TARGET)
  endif
endef

define remove_string
  $2 := $$(subst $1,,$$($2))
endef

# Setup make rules for compiling Java source code to class files and/or a
# resulting jar file.
#
# 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.
#
# The target for public API digest is returned in $1_API_TARGET.
#
# Remaining parameters are named arguments. These include:
#   SMALL_JAVA set to false to run javac as a "big" java app
#   COMPILER bootjdk or interim, the latter is default
#   TARGET_RELEASE javac flags to set the targeted jdk release (-source/-target or --release)
#   Defaults to $(TARGET_RELEASE_NEWJDK).
#   JAVAC_FLAGS javac flags to append to the default ones.
#   JAVA_FLAGS flags to be appended to the java launching the compiler
#   DISABLED_WARNINGS list of Xlint warnings that should be disabled
#   SRC one or more directories to search for sources. The order of the source roots
#        is significant. The first found file of a certain name has priority.
#   BIN store classes here
#   MODULE Name of module being compiled. If set, classes are put in BIN/MODULE.
#   CLASSPATH a list of additional entries to set as classpath to javac
#   INCLUDES myapp.foo means will only compile java files in myapp.foo or any of its sub-packages.
#   EXCLUDES myapp.foo means will do not compile java files in myapp.foo or any of its sub-packages.
#   COPY .prp means copy all prp files to the corresponding package in BIN.
#   COPY_FILES myapp/foo/setting.txt means copy this file over to the package myapp/foo
#   CLEAN .properties means copy and clean all properties file to the corresponding package in BIN.
#   CLEAN_FILES myapp/foo/setting.txt means clean this file over to the package myapp/foo
#   INCLUDE_FILES "com/sun/SolarisFoobar.java" means only compile this file!
#   EXCLUDE_FILES "com/sun/SolarisFoobar.java" means do not compile this particular file!
#       "SolarisFoobar.java" means do not compile SolarisFoobar, wherever it is found.
#   EXCLUDE_PATTERNS Exclude files matching any of these substrings
#   EXTRA_FILES List of extra source files to include in compilation. Can be used to
#       specify files that need to be generated by other rules first.
#   HEADERS path to directory where all generated c-headers are written.
#   DEPENDS Extra dependency
#   KEEP_DUPS Do not remove duplicate file names from different source roots.
#   FAIL_NO_SRC Set to false to not fail the build if no source files are found,
#        default is true.
#   CREATE_API_DIGEST Set to true to use a javac plugin to generate a public API
#        hash which can be used for down stream dependencies to only rebuild
#        when the API changes.
#   KEEP_ALL_TRANSLATIONS Set to true to skip translation filtering
SetupJavaCompilation = $(NamedParamsMacroTemplate)
define SetupJavaCompilationBody

  # Verify arguments
  ifeq ($$($1_BIN), )
    $$(error Must specify BIN (in $1))
  endif

  ifneq ($$($1_MODULE), )
    $1_MODULE_SUBDIR := /$$($1_MODULE)
  endif

  $1_SAFE_NAME := $$(strip $$(subst /,_, $1))

  ifeq ($$($1_SMALL_JAVA), )
    # If unspecified, default to true
    $1_SMALL_JAVA := true
  endif

  ifeq ($$($1_COMPILER), )
    # If unspecified, default to interim compiler
    $1_COMPILER := interim
  endif

  ifeq ($$($1_COMPILER), bootjdk)
    # Javac server is not available when using the bootjdk compiler.
    $1_JAVAC_CMD := $$(JAVAC) -J$$(JAVA_FLAGS_TMPDIR)

    ifeq ($$($1_SMALL_JAVA), true)
      $1_FLAGS += $$(addprefix -J, $$(JAVA_FLAGS_SMALL))
    endif
    ifeq ($$($1_JAVA_FLAGS), true)
      $1_FLAGS += $$(addprefix -J, $$($1_JAVA_FLAGS))
    endif

    ifeq ($$($1_TARGET_RELEASE), )
      # If unspecified, default to the new jdk we're building
      $1_TARGET_RELEASE := $$(TARGET_RELEASE_BOOTJDK)
    endif
  else ifeq ($$($1_COMPILER), buildjdk)
    $1_JAVAC_CMD := $$(BUILD_JAVAC) -J$$(JAVA_FLAGS_TMPDIR)

    ifeq ($$($1_TARGET_RELEASE), )
      # If unspecified, default to the new jdk we're building
      $1_TARGET_RELEASE := $$(TARGET_RELEASE_NEWJDK)
    endif
  else ifeq ($$($1_COMPILER), interim)
    # Use java server if it is enabled, and the user does not want a specialized
    # class path.
    ifeq ($$(ENABLE_JAVAC_SERVER)+$$($1_CLASSPATH), true+)
      # Create a configuration file with the needed information for the javac
      # server to function properly.
      $1_JAVAC_SERVER_CONFIG := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$$($1_SAFE_NAME)-javacserver.conf

      # Arguments needed to launch the javacserver client, as well as for the
      # client to launch the server.
      $1_JAVAC_SERVER_ARGS := $$(INTERIM_LANGTOOLS_ARGS) \
          -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_javacserver_classes

      # The portfile contains the tcp/ip on which the server listens
      # and the cookie necessary to talk to the server.
      $1_JAVAC_PORT_FILE := $$(call FixPath, $$(JAVAC_SERVER_DIR)/server.port)

      # The javacmd tells the client how to run java to launch the server.
      $1_JAVAC_SERVER_JAVA_CMD := $$(call FixPath, $$(JAVA) $$($1_JAVA_FLAGS) \
          $$($1_JAVAC_SERVER_ARGS))

      $1_CONFIG_VARDEPS := $$($1_JAVAC_PORT_FILE) $$($1_JAVAC_SERVER_JAVA_CMD)
      $1_CONFIG_VARDEPS_FILE := $$(call DependOnVariable, $1_CONFIG_VARDEPS, \
          $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1.config_vardeps)

      # Write these values to a config file
      $$($1_JAVAC_SERVER_CONFIG): $$($1_CONFIG_VARDEPS_FILE)
	$(ECHO) portfile=$$($1_JAVAC_PORT_FILE) > $$@
	$(ECHO) javacmd=$$($1_JAVAC_SERVER_JAVA_CMD) >> $$@

      # Always use small java to launch client
      $1_JAVAC_CMD := $$(JAVA_SMALL) $$($1_JAVA_FLAGS) $$($1_JAVAC_SERVER_ARGS) \
          javacserver.Main --conf=$$($1_JAVAC_SERVER_CONFIG)
    else
      # No javac server
      $1_JAVAC := $$(INTERIM_LANGTOOLS_ARGS) -m jdk.compiler.interim/com.sun.tools.javac.Main

      ifeq ($$($1_SMALL_JAVA), true)
        $1_JAVAC_CMD := $$(JAVA_SMALL) $$($1_JAVA_FLAGS) $$($1_JAVAC)
      else
        $1_JAVAC_CMD := $$(JAVA) $$($1_JAVA_FLAGS) $$($1_JAVAC)
      endif
    endif

    ifeq ($$($1_TARGET_RELEASE), )
      # If unspecified, default to the new jdk we're building
      $1_TARGET_RELEASE := $$(TARGET_RELEASE_NEWJDK)
    endif
  else
    $$(error Invalid value for COMPILER in SetupJavaCompilation for $1: '$$($1_COMPILER)')
  endif

  # Tell javac to do exactly as told and no more
  PARANOIA_FLAGS := -implicit:none -Xprefer:source -XDignore.symbol.file=true

  $1_FLAGS += -g -Xlint:all $$($1_TARGET_RELEASE) $$(PARANOIA_FLAGS)
  $1_FLAGS += $$($1_JAVAC_FLAGS)
  # Set character encoding in source
  $1_FLAGS += -encoding utf-8

  ifeq ($$(JAVA_WARNINGS_AS_ERRORS), true)
    $1_FLAGS += -Werror
  endif

  ifneq ($$($1_DISABLED_WARNINGS), )
    $1_FLAGS += -Xlint:$$(call CommaList, $$(addprefix -, $$($1_DISABLED_WARNINGS)))
  endif

  $1_AUGMENTED_CLASSPATH := $$($1_CLASSPATH)
  $1_API_TARGET := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_pubapi
  $1_API_INTERNAL := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_internalapi

  ifeq ($$($1_CREATE_API_DIGEST), true)
    $1_API_DIGEST_FLAGS := \
        -Xplugin:"depend $$($1_API_TARGET)" \
        "-XDinternalAPIPath=$$($1_API_INTERNAL)" \
        "-XDLOG_LEVEL=$(LOG_LEVEL)" \
        #

    $1_EXTRA_DEPS := $$(BUILDTOOLS_OUTPUTDIR)/depend/_the.COMPILE_DEPEND_batch
    # including the compilation output on the classpath, so that incremental
    # compilations in unnamed module can refer to other classes from the same
    # source root, which are not being recompiled in this compilation:
    $1_AUGMENTED_CLASSPATH += $$(BUILDTOOLS_OUTPUTDIR)/depend $$($1_BIN)
  endif

  ifneq ($$($1_AUGMENTED_CLASSPATH), )
    $1_FLAGS += -cp $$(call PathList, $$($1_AUGMENTED_CLASSPATH))
  endif

  # Make sure the dirs exist, or that one of the EXTRA_FILES, that may not
  # exist yet, is in it.
  $$(foreach d, $$($1_SRC), \
    $$(if $$(wildcard $$d), , \
      $$(if $$(filter $$d%, $$($1_EXTRA_FILES)), , \
        $$(error SRC specified to SetupJavaCompilation $1 contains missing directory >$$d<) \
      ) \
    ) \
  )
  $$(call MakeDir, $$($1_BIN))
  # Order src files according to the order of the src dirs. Correct ordering is
  # needed for correct overriding between different source roots.
  $1_ALL_SRC_RAW := $$(call FindFiles, $$($1_SRC))
  $1_ALL_SRCS := $$($1_EXTRA_FILES) \
      $$(foreach d, $$($1_SRC), $$(filter $$d%, $$($1_ALL_SRC_RAW)))

  # Extract the java files.
  $1_SRCS := $$(filter %.java, $$($1_ALL_SRCS))

  # Translate include/exclude into patterns
  ifneq ($$($1_EXCLUDE_FILES), )
    $1_EXCLUDE_PATTERN := $$(addprefix %, $$($1_EXCLUDE_FILES))
  endif
  ifneq ($$($1_INCLUDE_FILES), )
    $1_INCLUDE_PATTERN := $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$($1_INCLUDE_FILES)))
  endif
  ifneq ($$($1_EXCLUDES), )
    $1_EXCLUDE_PATTERN += $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$(addsuffix /%, $$($1_EXCLUDES))))
  endif
  ifneq ($$($1_INCLUDES), )
    $1_INCLUDE_PATTERN += $$(foreach i, $$($1_SRC), $$(addprefix $$i/, $$(addsuffix /%, $$($1_INCLUDES))))
  endif

  ifneq ($$($1_EXCLUDE_PATTERNS), )
    # We must not match the exclude pattern against the src roots, so first
    # strip the src prefixes from the absolute file paths in SRCS.
    $1_SRCS_WITHOUT_ROOTS := $$(foreach i, $$($1_SRC), \
        $$(patsubst $$i/%,%, $$(filter $$i/%, $$($1_SRCS))))
    $1_EXCLUDE_PATTERNS_WITHOUT_ROOTS := $$(call containing, \
        $$($1_EXCLUDE_PATTERNS), $$($1_SRCS_WITHOUT_ROOTS))
    # The add back all possible src prefixes; this will generate more paths
    # than really exists, but it does not matter since we will use this as
    # input to filter-out.
    $1_EXCLUDE_PATTERN += $$(foreach i, $$($1_SRC), $$(addprefix $$i/, \
        $$($1_EXCLUDE_PATTERNS_WITHOUT_ROOTS)))
  endif

  # Apply include/exclude patterns to java sources
  ifneq ($$($1_EXCLUDE_PATTERN), )
    $1_SRCS := $$(filter-out $$($1_EXCLUDE_PATTERN), $$($1_SRCS))
  endif
  ifneq ($$($1_INCLUDE_PATTERN), )
    $1_SRCS := $$(filter $$($1_INCLUDE_PATTERN) $$($1_EXTRA_FILES), $$($1_SRCS))
  endif

  ifneq ($$($1_KEEP_DUPS), true)
    # Remove duplicate source files by keeping the first found of each duplicate.
    # This allows for automatic overrides with custom or platform specific versions
    # source files. Need to call DoubleDollar as we have java classes with '$' in
    # their names.
    $1_SRCS := $$(strip $$(foreach s, $$($1_SRCS), \
        $$(eval relative_src := $$(call remove-prefixes, $$($1_SRC), \
            $$(call DoubleDollar, $$(s)))) \
        $$(if $$($1_$$(relative_src)), \
          , \
          $$(eval $1_$$(relative_src) := 1) $$(s))))
  endif

  # Filter out any excluded translations
  ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true)
    $1_SRCS := $$(call FilterExcludedTranslations, $$($1_SRCS), .java)
  endif

  ifeq ($$(strip $$($1_SRCS)), )
    ifneq ($$($1_FAIL_NO_SRC), false)
      $$(error No source files found for $1)
    endif
  else
    # All files below META-INF are always copied.
    $1_ALL_COPIES := $$(filter $$(addsuffix /META-INF%, $$($1_SRC)), $$($1_ALL_SRCS))
    # Find all files to be copied from source to bin.
    ifneq ($$($1_COPY)$$($1_COPY_FILES), )
      # Search for all files to be copied.
      $1_ALL_COPIES += $$(filter $$(addprefix %, $$($1_COPY)), $$($1_ALL_SRCS))
      # Copy these explicitly
      $1_ALL_COPIES += $$($1_COPY_FILES)
    endif
    # Copy must also respect filters.
    ifneq ($$($1_INCLUDE_PATTERN), )
      $1_ALL_COPIES := $$(filter $$($1_INCLUDE_PATTERN), $$($1_ALL_COPIES))
    endif
    ifneq ($$($1_EXCLUDE_PATTERN), )
      $1_ALL_COPIES := $$(filter-out $$($1_EXCLUDE_PATTERN), $$($1_ALL_COPIES))
    endif
    # Filter out any excluded translations
    ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true)
      $1_ALL_COPIES := $$(call FilterExcludedTranslations, $$($1_ALL_COPIES), .properties)
    endif
    ifneq ($$($1_ALL_COPIES), )
      # Yep, there are files to be copied!
      $1_ALL_COPY_TARGETS :=
          $$(foreach i, $$($1_ALL_COPIES), $$(eval $$(call add_file_to_copy,$1,$$i)))
      # Now we can depend on $$($1_ALL_COPY_TARGETS) to copy all files!
    endif

    # Find all property files to be copied and cleaned from source to bin.
    ifneq ($$($1_CLEAN)$$($1_CLEAN_FILES), )
      # Search for all files to be copied.
      $1_ALL_CLEANS := $$(filter $$(addprefix %, $$($1_CLEAN)), $$($1_ALL_SRCS))
      # Clean these explicitly
      $1_ALL_CLEANS += $$($1_CLEAN_FILES)
      # Copy and clean must also respect filters.
      ifneq ($$($1_INCLUDE_PATTERN), )
        $1_ALL_CLEANS := $$(filter $$($1_INCLUDE_PATTERN), $$($1_ALL_CLEANS))
      endif
      ifneq ($$($1_EXCLUDE_PATTERN), )
        $1_ALL_CLEANS := $$(filter-out $$($1_EXCLUDE_PATTERN), $$($1_ALL_CLEANS))
      endif
      # Filter out any excluded translations
      ifneq ($$($1_KEEP_ALL_TRANSLATIONS), true)
        $1_ALL_CLEANS := $$(call FilterExcludedTranslations, $$($1_ALL_CLEANS), .properties)
      endif
      ifneq ($$($1_ALL_CLEANS), )
        # Yep, there are files to be copied and cleaned!
        $1_ALL_COPY_CLEAN_TARGETS :=
            $$(foreach i, $$($1_ALL_CLEANS), $$(eval $$(call add_file_to_clean,$1,$$i)))
        # Now we can depend on $$($1_ALL_COPY_CLEAN_TARGETS) to copy all files!
      endif
    endif

    # Create a sed expression to remove the source roots and to replace / with .
    # and remove .java at the end.
    $1_REWRITE_INTO_CLASSES := $$(foreach i, $$($1_SRC), -e 's|$$i/||g') -e 's|/|.|g' -e 's|.java$$$$||g'

    $1_COMPILE_TARGET := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_batch
    $1_FILELIST := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_batch.filelist
    $1_MODFILELIST := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_batch.modfiles
    $1_MODFILELIST_FIXED := $$($1_MODFILELIST).fixed

    # Put headers in a temp dir to filter out those that actually
    # changed before copying them to the real header dir.
    ifneq ($$($1_HEADERS), )
      $1_HEADERS_ARG := -h $$($1_HEADERS).$1.tmp

      $$($1_HEADERS)/_the.$1_headers: $$($1_COMPILE_TARGET)
		$$(call MakeTargetDir)
		if [ -d "$$($1_HEADERS).$1.tmp" ]; then \
		  for f in `$(CD) $$($1_HEADERS).$1.tmp && $(FIND) . -type f`; do \
		    if [ ! -f "$$($1_HEADERS)/$$$$f" ] \
		        || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).$1.tmp/$$$$f`" != "" ]; then \
		      $(MKDIR) -p `$(DIRNAME) $$($1_HEADERS)/$$$$f`; \
		      $(CP) -f $$($1_HEADERS).$1.tmp/$$$$f $$($1_HEADERS)/$$$$f; \
		    fi; \
		  done; \
		fi
		$(RM) -r $$($1_HEADERS).$1.tmp
		$(TOUCH) $$@

      $1_HEADER_TARGETS := $$($1_HEADERS)/_the.$1_headers
    endif

    $1_VARDEPS := $$($1_JAVAC_CMD) $$($1_FLAGS) $$($1_BIN) \
        $$($1_HEADERS_ARG) $$($1_EXCLUDES) $$($1_INCLUDES) \
        $$($1_EXCLUDE_FILES) $$($1_INCLUDE_FILES)
    $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \
        $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1.vardeps)

    # Create a file with all sources, to pass to javac in an @file.
    # $$($1_VARDEPS_FILE) is used as dependency to track changes in set of
    # list of files.
    $$($1_FILELIST): $$($1_SRCS) $$($1_VARDEPS_FILE)
		$$(call MakeDir, $$(@D))
		$$(call LogWarn, Compiling up to $$(words $$($1_SRCS)) files for $1)
		$$(eval $$(call ListPathsSafely, $1_SRCS, $$($1_FILELIST)))

    # Create a $$($1_MODFILELIST) file with significant modified dependencies
    # (either sources files or the other mark dependencies).
    # It is then sent using a side-channel
    # to the custom Depend plugin. The Depend plugin will check the provided list
    # of modified files, and if none of the Java source files is changed in a way
    # observable from outside of the file, and the list of modified files does
    # not include a non-Java source file, it will only compile the modified files.
    # Otherwise, all module's sources will be compiled. If a non-Java file is included,
    # it will be considered to be a significant change, and all module source will
    # be recompiled
    $$($1_MODFILELIST): $$($1_SRCS) $$($1_DEPENDS) \
        $$($1_VARDEPS_FILE) $$($1_EXTRA_DEPS) $$($1_JAVAC_SERVER_CONFIG)
		$$(eval $1_MODFILES := $$?)
		$$(eval $$(call ListPathsSafely, $1_MODFILES, $$($1_MODFILELIST)))

    # Convert the paths in the MODFILELIST file to Windows-style paths
    # on Windows. This is needed because javac operates on Windows-style paths
    # when running on Windows. On other platforms this just copies the MODFILELIST file.
    $$($1_MODFILELIST_FIXED): $$($1_MODFILELIST)
		$$(call FixPathFile, $$($1_MODFILELIST), $$($1_MODFILELIST_FIXED))

    # Do the actual compilation
    $$($1_COMPILE_TARGET): $$($1_SRCS) $$($1_FILELIST) $$($1_DEPENDS) \
        $$($1_VARDEPS_FILE) $$($1_EXTRA_DEPS) $$($1_JAVAC_SERVER_CONFIG) \
        $$($1_MODFILELIST_FIXED)
		$$(call MakeDir, $$(@D))
		$$(call ExecuteWithLog, $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$$($1_SAFE_NAME)_batch, \
		    $$($1_JAVAC_CMD) $$($1_FLAGS) \
		        $$($1_API_DIGEST_FLAGS) \
		        -XDmodifiedInputs=$$($1_MODFILELIST_FIXED) \
		        -d $$($1_BIN) $$($1_HEADERS_ARG) @$$($1_FILELIST)) && \
		$(TOUCH) $$@

    # Add all targets to main variable
    $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_COMPILE_TARGET) \
        $$($1_HEADER_TARGETS)

    # Check if a jar file was specified, then setup the rules for the jar.
    ifneq ($$($1_JAR), )
      # If no suffixes was explicitly set for this jar file.
      # Use class and the cleaned/copied properties file suffixes as the default
      # for the types of files to be put into the jar.
      ifeq ($$($1_SUFFIXES), )
        $1_SUFFIXES := .class $$($1_CLEAN) $$($1_COPY)
      endif

      $$(eval $$(call SetupJarArchive, ARCHIVE_$1, \
          DEPENDENCIES := $$($1), \
          SRCS := $$($1_BIN)$$($1_MODULE_SUBDIR), \
          SUFFIXES := $$($1_SUFFIXES), \
          EXCLUDE := $$($1_EXCLUDES), \
          INCLUDES := $$($1_INCLUDES), \
          EXTRA_FILES := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS), \
          JAR := $$($1_JAR), \
          JARMAIN := $$($1_JARMAIN), \
          MANIFEST := $$($1_MANIFEST), \
          EXTRA_MANIFEST_ATTR := $$($1_EXTRA_MANIFEST_ATTR), \
          JARINDEX := $$($1_JARINDEX), \
          HEADERS := $$($1_HEADERS), \
      ))

      # Add jar to target list
      $1 += $$($1_JAR)
    endif
  endif # Source files found
endef

# Use this macro to find the correct target to depend on when the original
# SetupJavaCompilation is declared in a different makefile, to avoid having
# to declare and evaluate it again.
# param 1 is for example BUILD_MYPACKAGE
# param 2 is the output directory (BIN)
SetupJavaCompilationCompileTarget = \
    $(strip $2)/_the.$(strip $1)_batch

SetupJavaCompilationApiTarget = \
    $(strip $2)/_the.$(strip $1)_pubapi

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

endif # include guard
include MakeIncludeEnd.gmk
