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

# This makefile is much simpler now that it can use the smart javac wrapper
# for dependency tracking between java packages and incremental compiles.
# It could be even more simple if we added support for incremental jar updates
# directly from the smart javac wrapper.

# Cleaning/copying properties here is not a good solution. The properties
# should be cleaned/copied by a annotation processor in sjavac.

# When you read this source. Remember that $(sort ...) has the side effect
# of removing duplicates. It is actually this side effect that is
# desired whenever sort is used below!

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

FALSE_FIND_PATTERN:=-name FILE_NAME_THAT_DOESNT_EXIST

define SetupJavaCompiler
  # param 1 is for example GENERATE_OLD_BYTECODE or GENERATE_NEW_JDKBYTECODE
  # This is the name of the compiler setup.
  # param 2-9 are named args.
  #   JVM:=The jvm used to run the javac/javah command
  #   JAVAC:=The javac jar and bootstrap classpath changes, or just bin/javac if JVM is left out
  #   FLAGS:=Flags to be supplied to javac
  #   SERVER_DIR:=Use a javac server (-XDserver) and store the server related files here
  #   SERVER_JVM:=Use this JVM for the server. Defaults to the JVM above.
  $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupJavaCompiler($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
  $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompiler, please update JavaCompilation.gmk))

  # The port file contains the tcp/ip on which the server listens
  # and the cookie necessary to talk to the server.
  $1_SJAVAC_PORTFILE:=$$($1_SERVER_DIR)/server.port
  # You can use a different JVM to run the background javac server.
  ifeq ($$($1_SERVER_JVM),)
    # It defaults to the same JVM that is used to start the javac command.
    $1_SERVER_JVM:=$$($1_JVM)
  endif
endef

define SetupArchive
  # param 1 is for example ARCHIVE_MYPACKAGE
  # param 2 are the dependecies
  # param 3,4,5,6,7,8,9 are named args.
  #   SRCS:=List of directories in where to find files to add to archive
  #   SUFFIXES:=File suffixes to include in jar
  #   INCLUDES:=List of directories/packages in SRCS that should be included
  #   EXCLUDES:=List of directories/packages in SRCS that should be excluded
  #   EXCLUDE_FILES:=List of files in SRCS that should be excluded
  #   EXTRA_FILES:=List of files in SRCS that should be included regardless of suffix match.
  #   JAR:=Jar file to create
  #   MANIFEST:=Optional manifest file template.
  #   JARMAIN:=Optional main class to add to manifest
  #   JARINDEX:=true means generate the index in the jar file.
  #   SKIP_METAINF:=Set to prevent contents of an META-INF directory to be automatically
  #       added to the archive.
  #   EXTRA_MANIFEST_ATTR:=Extra attribute to add to manifest.
  #   CHECK_COMPRESS_JAR Check the COMPRESS_JAR variable

  # NOTE: $2 is dependencies, not a named argument!
  $(foreach i,3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupArchive($1),<dependencies>,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
  $(if $(findstring $(LOG_LEVEL),trace), $(info *[2] <dependencies> = $(strip $2)))
  $(if $(16),$(error Internal makefile error: Too many arguments to SetupArchive, please update JavaCompilation.gmk))

  $1_JARMAIN:=$(strip $$($1_JARMAIN))
  $1_JARNAME:=$$(notdir $$($1_JAR))
  $1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest
  $1_DELETESS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletess
  $1_DELETES_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletes
  $1_BIN:=$$(dir $$($1_JAR))

  ifeq (,$$($1_SUFFIXES))
    # No suffix was set, default to classes.
    $1_SUFFIXES:=.class
  endif
  # Convert suffixes to a find expression
  $1_FIND_PATTERNS:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES))
  # On windows, a lot of includes/excludes risk making the command line too long, so
  # writing the grep patterns to files.
  ifneq (,$$($1_INCLUDES))
    $1_GREP_INCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS), \
        $$(addprefix $$(src)/,$$($1_INCLUDES)))
    # If there are a lot of include patterns, output to file to shorten command lines
    ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),)
      $1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS))
    else
      $1_GREP_INCLUDE_OUTPUT:=$(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include $$(NEWLINE) \
          $$(call ListPathsSafely,$1_GREP_INCLUDE_PATTERNS,\n, \
          >> $$($1_BIN)/_the.$$($1_JARNAME)_include)
      $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include
    endif
  endif
  ifneq (,$$($1_EXCLUDES)$$($1_EXCLUDE_FILES))
    $1_GREP_EXCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/, \
        $$($1_EXCLUDES) $$($1_EXCLUDE_FILES)))
    # If there are a lot of include patterns, output to file to shorten command lines
    ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),)
      $1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS))
    else
      $1_GREP_EXCLUDE_OUTPUT=$(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude $$(NEWLINE) \
          $$(call ListPathsSafely,$1_GREP_EXCLUDE_PATTERNS,\n, \
          >> $$($1_BIN)/_the.$$($1_JARNAME)_exclude)
      $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude
    endif
  endif

  # Check if this jar needs to have its index generated.
  ifneq (,$$($1_JARINDEX))
    $1_JARINDEX = (cd $$(dir $$@) && $(JAR) -i $$(notdir $$@))
  else
    $1_JARINDEX = true
  endif
  # When this macro is run in the same makefile as the java compilation, dependencies are
  # transfered in make variables. When the macro is run in a different makefile than the
  # java compilation, the dependencies need to be found in the filesystem.
  ifneq (,$2)
    $1_DEPS:=$2
  else
    $1_DEPS:=$$(filter $$(addprefix %,$$($1_SUFFIXES)), \
        $$(call CacheFind,$$($1_SRCS)))
    ifneq (,$$($1_GREP_INCLUDE_PATTERNS))
      $1_DEPS:=$$(filter $$(addsuffix %,$$($1_GREP_INCLUDE_PATTERNS)),$$($1_DEPS))
    endif
    ifneq (,$$($1_GREP_EXCLUDE_PATTERNS))
      $1_DEPS:=$$(filter-out $$(addsuffix %,$$($1_GREP_EXCLUDE_PATTERNS)),$$($1_DEPS))
    endif
    # The subst of \ is needed because $ has to be escaped with \ in EXTRA_FILES for the command
    # lines, but not here for use in make dependencies.
    $1_DEPS+=$$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES))))
    ifeq (,$$($1_SKIP_METAINF))
      $1_DEPS+=$$(call CacheFind,$$(wildcard $$(addsuffix /META-INF,$$($1_SRCS))))
    endif
  endif

  # Utility macros, to make the shell script receipt somewhat easier to decipher.

  # The capture contents macro finds all files (matching the patterns, typically
  # .class and .prp) that are newer than the jar-file, ie the new content to be put into the jar.
  # NOTICE: please leave the parentheses space separated otherwise the AIX build will break!
  $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS), \
      ( ( $(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) \
          $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' && \
      $(ECHO) $$(subst $$(src)/,,$$($1_EXTRA_FILES) ) ) > \
      $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE) )
  # The capture metainf macro finds all files below the META-INF directory that are newer than the jar-file.
  ifeq (,$$($1_SKIP_METAINF))
    $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) $$(NEWLINE))
  endif
  # The capture deletes macro finds all deleted files and concatenates them. The resulting file
  # tells us what to remove from the jar-file.
  $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) $$(NEWLINE))
  # The update contents macro updates the jar file with the previously capture contents.
  # Use 'wc -w' to see if the contents file is empty.
  $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS), \
      (cd $$(src) && \
       if [ "`$(WC) -w _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'`" -gt "0" ]; then \
         $(ECHO) "  updating" `$(WC) -l _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'` files && \
         $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @_the.$$($1_JARNAME)_contents; \
       fi) $$(NEWLINE))
  # The s-variants of the above macros are used when the jar is created from scratch.
  # NOTICE: please leave the parentheses space separated otherwise the AIX build will break!
  $1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS), \
      ( ( $(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \
          $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' && \
      $$(subst $$(src)/,,$(ECHO) $$($1_EXTRA_FILES) ) ) > \
      $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE) )

  ifeq (,$$($1_SKIP_METAINF))
    $1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS), \
        ($(FIND) $$(src)/META-INF -type f 2> /dev/null | $(SED) 's|$$(src)/||g' >> \
        $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE))
  endif
  $1_SUPDATE_CONTENTS=$$(foreach src,$$($1_SRCS), \
      (cd $$(src) && $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @$$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE))

  # Use a slightly shorter name for logging, but with enough path to identify this jar.
  $1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_JAR))

  ifneq (,$$($1_CHECK_COMPRESS_JAR))
    $1_JAR_CREATE_OPTIONS := c0fm
    $1_JAR_UPDATE_OPTIONS := u0f
    ifeq ($(COMPRESS_JARS), true)
      $1_JAR_CREATE_OPTIONS := cfm
      $1_JAR_UPDATE_OPTIONS := uf
    endif
  else
    $1_JAR_CREATE_OPTIONS := cfm
    $1_JAR_UPDATE_OPTIONS := uf
  endif

  # Here is the rule that creates/updates the jar file.
  $$($1_JAR) : $$($1_DEPS)
	$(MKDIR) -p $$($1_BIN)
	$$($1_GREP_INCLUDE_OUTPUT)
	$$($1_GREP_EXCLUDE_OUTPUT)
	$$(if $$($1_MANIFEST), \
	  $(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \
	      -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE) \
	, \
	  $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE))
	$$(if $$($1_JARMAIN),$(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE))
	$$(if $$($1_EXTRA_MANIFEST_ATTR),$(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE))
	$$(if $$(wildcard $$@), \
	  $(ECHO) Modifying $$($1_NAME) $$(NEWLINE) \
	  $$($1_CAPTURE_CONTENTS) \
	  $$($1_CAPTURE_METAINF) \
	  $(RM) $$($1_DELETES_FILE) $$(NEWLINE) \
	  $$($1_CAPTURE_DELETES) \
	  $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) $$(NEWLINE) \
	  if [ -s $$($1_DELETESS_FILE) ]; then \
	    $(ECHO) "  deleting" `$(WC) -l $$($1_DELETESS_FILE) | $(AWK) '{ print $$$$1 }'` files && \
	    $(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \
	  fi $$(NEWLINE) \
	  $$($1_UPDATE_CONTENTS) true $$(NEWLINE) \
	  $$($1_JARINDEX) && true \
	, \
	  $(ECHO) Creating $$($1_NAME) && $(JAR) $$($1_JAR_CREATE_OPTIONS) $$@ $$($1_MANIFEST_FILE) $$(NEWLINE) \
	  $$($1_SCAPTURE_CONTENTS) \
	  $$($1_SCAPTURE_METAINF) \
	  $$($1_SUPDATE_CONTENTS) \
	  $$($1_JARINDEX) && true )

endef

define SetupZipArchive
  # param 1 is for example ZIP_MYSOURCE
  # param 2,3,4,5,6,7,8,9 are named args.
  #   SRC,ZIP,INCLUDES,INCLUDE_FILES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS
  $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupZipArchive($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
  $(if $(16),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk))

  # To avoid running find over too large sets of files, which causes make to crash
  # on some configurations (cygwin), use INCLUDES and INCLUDE_FILES to build a set
  # of directories to run find in, if available.
  ifneq ($$($1_INCLUDES)$$($1_INCLUDE_FILES),)
    $1_FIND_LIST := $$(wildcard $$(foreach i,$$($1_SRC), \
        $$(addprefix $$i/,$$($1_INCLUDES) $$($1_INCLUDE_FILES))))
  else
    $1_FIND_LIST := $$($1_SRC)
  endif

  # Find all files in the source tree.
  $1_ALL_SRCS := $$(call not-containing,_the.,$$(call CacheFind,$$($1_FIND_LIST)))

  # Filter on suffixes if set
  ifneq ($$($1_SUFFIXES),)
    $1_ALL_SRCS := $$(filter $$(addprefix %, $$($1_SUFFIXES)), $$($1_ALL_SRCS))
  endif

  ifneq ($$($1_INCLUDES),)
    ifneq ($$($1_SUFFIXES),)
      $1_ZIP_INCLUDES := $$(foreach s,$$($1_SUFFIXES), \
          $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$$s$(DQUOTE),$$($1_INCLUDES))))
    else
      $1_ZIP_INCLUDES := $$(addprefix -i$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_INCLUDES)))
    endif
  endif
  ifneq ($$($1_INCLUDE_FILES),)
    $1_ZIP_INCLUDES += $$(addprefix -i$(SPACE),$$($1_INCLUDE_FILES))
  endif
  ifneq ($$($1_EXCLUDES),)
    $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
    $1_ZIP_EXCLUDES := $$(addprefix -x$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_EXCLUDES)))
    $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_SRCS))
  endif

  # Use a slightly shorter name for logging, but with enough path to identify this zip.
  $1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_ZIP))

  # Now $1_ALL_SRCS should contain all sources that are going to be put into the zip.
  # I.e. the zip -i and -x options should match the filtering done in the makefile.
  # Explicitly excluded files can be given with absolute path. The patsubst solution
  # isn't perfect but the likelyhood of an absolute path to match something in a src
  # dir is very small.
  # If zip has nothing to do, it returns 12 and would fail the build. Check for 12
  # and only fail if it's not.
  $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS)
	$(MKDIR) -p $$(@D)
	$(ECHO) Updating $$($1_NAME)
	$$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES))) || test "$$$$?" = "12" )$$(NEWLINE)) true
	$(TOUCH) $$@
endef

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)))
  # Now we can setup the depency that will trigger the copying.
  $$($1_BIN)$$($2_TARGET) : $2
	$(MKDIR) -p $$(@D)
	$(CP) $$< $$@
	$(CHMOD) -f ug+w $$@

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


# This macro is used only for properties files that are to be
# copied over to the classes directory in cleaned form:
# Previously this was inconsistently done in different repositories.
# This is the new clean standard. Though it is to be superseded by
# a standard annotation processor from with sjavac.
define add_file_to_copy_and_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.
  $$($1_BIN)$$($2_TARGET) : $2
	$(MKDIR) -p $$(@D)
	$(CAT) $$< | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \
	    | $(SED) -f "$(SRC_ROOT)/make/common/support/unicode2x.sed" \
	    | $(SED) -e '/^#/d' -e '/^$$$$/d' \
	        -e :a -e '/\\$$$$/N; s/\\\n//; ta' \
	        -e 's/^[ \t]*//;s/[ \t]*$$$$//' \
	        -e 's/\\=/=/' | LANG=C $(SORT) > $$@
	$(CHMOD) -f ug+w $$@

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

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

define replace_space_with_pathsep
  $1:=$(subst $(SPACE),$(PATH_SEP),$(strip $(patsubst %,%,$2)))
endef

define SetupJavaCompilation
  # param 1 is for example BUILD_MYPACKAGE
  # param 2,3,4,5,6,7,8 are named args.
  #   SETUP:=must point to a previously setup java compiler, for example: SETUP:=BOOTJAVAC
  #   JVM:=path to ..bin/java
  #   ADD_JAVAC_FLAGS:=javac flags to append to the default ones.
  #   SRC:=one or more directories to search for sources
  #   BIN:=store classes here
  #   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.
  #   CLEAN:=.properties means copy and clean all properties file to the corresponding package in BIN.
  #   COPY_FILES:=myapp/foo/setting.txt means copy 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.
  #   JAVAC_SOURCE_PATH_OVERRIDE:=This forces an explicit -sourcepath to javac instead of the complete
  #       source roots from SRC. This is sometimes needed when compiling specific subsets of the source.
  #   HEADERS:=path to directory where all generated c-headers are written.
  #   DEPENDS:=Extra dependecy
  $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupJavaCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
  $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompilation, please update JavaCompilation.gmk))

  # Extract the info from the java compiler setup.
  $1_JVM := $$($$($1_SETUP)_JVM)
  $1_JAVAC := $$($$($1_SETUP)_JAVAC)
  $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS)
  ifeq ($$($1_JAVAC),)
    $$(error The Java compilation $1 refers to a non-existant java compiler setup $$($1_SETUP))
  endif
  $1_SJAVAC_PORTFILE := $$($$($1_SETUP)_SJAVAC_PORTFILE)
  $1_SERVER_JVM := $$($$($1_SETUP)_SERVER_JVM)

  # Handle addons and overrides.
  $1_SRC:=$$(call ADD_SRCS,$$($1_SRC))
  # Make sure the dirs exist.
  $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupJavaCompilation $1 contains missing directory $$d)))
  $$(eval $$(call MakeDir,$$($1_BIN)))
  # Find all files in the source trees.
  $1_ALL_SRCS += $$(filter-out $(OVR_SRCS),$$(call CacheFind,$$($1_SRC)))
  # Extract the java files.
  ifneq ($$($1_EXCLUDE_FILES),)
    $1_EXCLUDE_FILES_PATTERN:=$$(addprefix %,$$($1_EXCLUDE_FILES))
  endif
  $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES_PATTERN),$$(filter %.java,$$($1_ALL_SRCS)))
  ifneq ($$($1_INCLUDE_FILES),)
    $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
    $1_SRCS := $$(filter $$($1_INCLUDE_FILES), $$($1_SRCS))
  endif

  # Now we have a list of all java files to compile: $$($1_SRCS)

  # Create the corresponding smart javac wrapper command line.
  $1_SJAVAC_ARGS:=$$(addprefix -x ,$$(addsuffix .*,$$(subst /,.,$$($1_EXCLUDES)))) \
      $$(addprefix -i ,$$(addsuffix .*,$$(subst /,.,$$($1_INCLUDES)))) \
      $$(addprefix -xf *,$$(strip $$($1_EXCLUDE_FILES))) \
      $$(addprefix -if *,$$(strip $$($1_INCLUDE_FILES))) \
      -src "$$(subst $$(SPACE),$$(PATH_SEP),$$(strip $$($1_SRC)))"

  # Prepend the source/bin path to the filter expressions.
  ifneq ($$($1_INCLUDES),)
    $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
    $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
  endif
  ifneq ($$($1_EXCLUDES),)
    $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
    $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
  endif

  # Find all files to be copied from source to bin.
  ifneq (,$$($1_COPY))
    # 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)
    # Copy must also respect filters.
    ifneq (,$$($1_INCLUDES))
      $1_ALL_COPIES := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_COPIES))
    endif
    ifneq (,$$($1_EXCLUDES))
      $1_ALL_COPIES := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_COPIES))
    endif
    ifneq (,$$($1_EXCLUDE_FILES))
      $1_ALL_COPIES := $$(filter-out $$($1_EXCLUDE_FILES_PATTERN),$$($1_ALL_COPIES))
    endif
    # All files below META-INF are always copied.
    $1_ALL_COPIES += $$(filter $$(addsuffix /META-INF%,$$($1_SRC)),$$($1_ALL_SRCS))
    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
  endif

  # Find all property files to be copied and cleaned from source to bin.
  ifneq (,$$($1_CLEAN))
    # Search for all files to be copied.
    $1_ALL_CLEANS := $$(filter $$(addprefix %,$$($1_CLEAN)),$$($1_ALL_SRCS))
    # Copy and clean must also respect filters.
    ifneq (,$$($1_INCLUDES))
      $1_ALL_CLEANS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_CLEANS))
    endif
    ifneq (,$$($1_EXCLUDES))
      $1_ALL_CLEANS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_CLEANS))
    endif
    ifneq (,$$($1_EXCLUDE_FILES))
      $1_ALL_CLEANS := $$(filter-out $$($1_EXCLUDE_FILES_PATTERN),$$($1_ALL_CLEANS))
    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_copy_and_clean,$1,$$i)))
      # Now we can depend on $$($1_ALL_COPY_CLEAN_TARGETS) to copy all files!
    endif
  endif

  # Prep the source paths.
  ifneq ($$($1_JAVAC_SOURCE_PATH_OVERRIDE),)
    $$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_JAVAC_SOURCE_PATH_OVERRIDE)))
  else
    $$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_SRC)))
  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'

  ifeq ($$($1_DISABLE_SJAVAC)x$$(ENABLE_SJAVAC),xyes)
    ifneq (,$$($1_HEADERS))
      $1_HEADERS_ARG := -h $$($1_HEADERS)
    endif

    # Using sjavac to compile.
    $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/javac_state

    # Create SJAVAC variable form JAVAC variable. Expects $1_JAVAC to be
    # "bootclasspathprepend -cp .../javac.jar com.sun.tools.javac.Main"
    # and javac is simply replaced with sjavac.
    $1_SJAVAC:=$$(subst com.sun.tools.javac.Main,com.sun.tools.sjavac.Main,$$($1_JAVAC))

    # Set the $1_REMOTE to spawn a background javac server.
    $1_REMOTE:=--server:portfile=$$($1_SJAVAC_PORTFILE),id=$1,sjavac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_SJAVAC))))

    $$($1_BIN)/javac_state: $$($1_SRCS) $$($1_DEPENDS)
	$(MKDIR) -p $$(@D)
	$$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.$1_batch.tmp)
	$(ECHO) Compiling $1
	($$($1_JVM) $$($1_SJAVAC) \
	    $$($1_REMOTE) \
	    -j $(JOBS) \
	    --permit-unidentified-artifacts \
	    --permit-sources-without-package \
	    --compare-found-sources $$($1_BIN)/_the.$1_batch.tmp \
	    --log=$(LOG_LEVEL) \
	    $$($1_SJAVAC_ARGS) \
	    $$($1_FLAGS) \
	    $$($1_HEADERS_ARG) \
	    -d $$($1_BIN) && \
	$(MV) $$($1_BIN)/_the.$1_batch.tmp $$($1_BIN)/_the.$1_batch)
  else
    # Using plain javac to batch compile everything.
    $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/_the.$1_batch

    # When building in batch, 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_BIN)/_the.$1_batch
		$(MKDIR) -p $$(@D)
		for f in `ls $$($1_HEADERS).$1.tmp`; do \
		  if [ ! -f "$$($1_HEADERS)/$$$$f" ] || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).$1.tmp/$$$$f`" != "" ]; then \
		    $(CP) -f $$($1_HEADERS).$1.tmp/$$$$f $$($1_HEADERS)/$$$$f; \
		  fi; \
		done
		$(RM) -r $$($1_HEADERS).$1.tmp
		$(TOUCH) $$@

      $1 += $$($1_HEADERS)/_the.$1_headers
    endif

    # When not using sjavac, pass along all sources to javac using an @file.
    $$($1_BIN)/_the.$1_batch: $$($1_SRCS) $$($1_DEPENDS)
	$(MKDIR) -p $$(@D)
	$(RM) $$($1_BIN)/_the.$1_batch $$($1_BIN)/_the.$1_batch.tmp
	$$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.$1_batch.tmp)
	$(ECHO) Compiling `$(WC) $$($1_BIN)/_the.$1_batch.tmp | $(TR) -s ' ' | $(CUT) -f 2 -d ' '` files for $1
	($$($1_JVM) $$($1_JAVAC) $$($1_FLAGS) \
	    -implicit:none -sourcepath "$$($1_SRCROOTSC)" \
	    -d $$($1_BIN) $$($1_HEADERS_ARG) @$$($1_BIN)/_the.$1_batch.tmp && \
	$(MV) $$($1_BIN)/_the.$1_batch.tmp $$($1_BIN)/_the.$1_batch)

  endif

  # 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 SetupArchive,ARCHIVE_$1,$$($1), \
        SRCS:=$$($1_BIN), \
        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), \
        SETUP:=$$($1_SETUP)))
  endif

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

endef
