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

ifndef _JAVA_COMPILATION_GMK
_JAVA_COMPILATION_GMK := 1

ifeq (,$(_MAKEBASE_GMK))
  $(error You must include MakeBase.gmk prior to including JavaCompilation.gmk)
endif

# Java compilation needs SetupJarArchive and/or SetupZipArchive, if we're
# generating a jar file or a source zip.
include JarArchive.gmk
include ZipArchive.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. Apply the file unicode2x.sed which does a whole bunch of \u00XX to \xXX
#    conversions.
# 3. Delete all lines starting with #.
# 4. Delete empty lines.
# 5. Append lines ending with \ with the next line.
# 6. Remove leading and trailing white space. Note that tabs must be explicit
#    as sed on macosx does not understand '\t'.
# 7. Replace the first \= with just =.
# 8. 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 depency 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) -f "$$(TOPDIR)/make/common/support/unicode2x.sed" \
	    | $(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
#   SRCZIP:=Create a src.zip based on the found sources and copied files.
#   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.
#   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 dependecy
#   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

  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)

    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), 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+)
      $1_JAVAC := $$(INTERIM_LANGTOOLS_ARGS) -m jdk.compiler.interim/com.sun.tools.sjavac.Main

      # How to launch the server. This must use JAVA_DETACH, which is the "big" java
      # with an ability to detach from fixpath (on Windows)
      # This will be executed by the client, if needed.
      $1_JAVAC_SERVER_CMD := $$(JAVA_DETACH) $$($1_JAVA_FLAGS) $$($1_JAVAC)
      $1_ESCAPED_CMD := $$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_JAVAC_SERVER_CMD))))

      # The port file contains the tcp/ip on which the server listens
      # and the cookie necessary to talk to the server.
      $1_JAVA_SERVER_FLAGS := --server:portfile=$$(JAVAC_SERVER_DIR)/server.port,sjavac=$$($1_ESCAPED_CMD)

      # Always use small to launch client
      $1_JAVAC_CMD := $$(JAVA_SMALL) $$($1_JAVA_FLAGS) $$($1_JAVAC) $$($1_JAVA_SERVER_FLAGS)
    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

  # Allow overriding on the command line
  JAVA_WARNINGS_ARE_ERRORS ?= -Werror

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

  $1_FLAGS += -g -Xlint:all --doclint-format html5 $$($1_TARGET_RELEASE) $$(PARANOIA_FLAGS) $$(JAVA_WARNINGS_ARE_ERRORS)
  $1_FLAGS += $$($1_JAVAC_FLAGS)

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

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

  ifneq ($$($1_MODULE), )
    $1_MODULE_SUBDIR := /$$($1_MODULE)
  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

  # 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.
    $1_SRCS := $$(strip $$(foreach s, $$($1_SRCS), \
        $$(eval relative_src := $$(call remove-prefixes, $$($1_SRC), $$(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

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

    # 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_API_TARGET := $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$1_pubapi

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

    ifeq ($$($1_CREATE_API_DIGEST), true)
      $1_API_DIGEST_FLAGS := \
          -classpath $$(BUILDTOOLS_OUTPUTDIR)/depend \
          -Xplugin:"depend $$($1_API_TARGET)" \
          #

      $1_EXTRA_DEPS := $$(BUILDTOOLS_OUTPUTDIR)/depend/_the.COMPILE_DEPEND_batch
    endif

    # 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 $$(words $$($1_SRCS)) files for $1)
		$$(eval $$(call ListPathsSafely, $1_SRCS, $$($1_FILELIST)))

    # Do the actual compilation
    $$($1_COMPILE_TARGET): $$($1_SRCS) $$($1_FILELIST) $$($1_DEPENDS) \
        $$($1_VARDEPS_FILE) $$($1_EXTRA_DEPS)
		$$(call MakeDir, $$(@D))
		$$(call ExecuteWithLog, $$($1_BIN)$$($1_MODULE_SUBDIR)/_the.$$($1_SAFE_NAME)_batch, \
		    $$($1_JAVAC_CMD) $$($1_FLAGS) \
		        $$($1_API_DIGEST_FLAGS) \
		        -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

    # Check if a srczip was specified, then setup the rules for the srczip.
    ifneq (,$$($1_SRCZIP))
      $$(eval $$(call SetupZipArchive, ZIP_ARCHIVE_$1, \
          SRC:=$$($1_SRC), \
          ZIP:=$$($1_SRCZIP), \
          INCLUDES:=$$($1_INCLUDES), \
          EXCLUDES:=$$($1_EXCLUDES), \
          EXCLUDE_FILES:=$$($1_EXCLUDE_FILES)))

      # Add zip to target list
      $1 += $$($1_SRCZIP)
    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 # _JAVA_COMPILATION_GMK
