#
# Copyright 2007 Sun Microsystems, Inc.  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.  Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

#
# Common java/javac/jdk variables used by all the Java makefiles.
# This file should not contain rules.
#

# WARNING: This file is shared with other workspaces.
#          So when it includes other files, it must use JDK_TOPDIR.
#

#
# Memory related -J flags that all uses of java tools should use.
#
JAVA_MEM_FLAGS   = -Xmx$(MAX_VM_MEMORY)m
ifeq ($(ARCH), ia64)
  # Special flags for javac on ia64 to work around a VM problem with
  #   bad code generation during inlining (what version had this problem?):
  #   Suspect this may not be needed anymore.
  JAVA_MEM_FLAGS   += -Xms$(MAX_VM_MEMORY)m -XX:-Inline
else
  JAVA_MEM_FLAGS   += -Xms$(MIN_VM_MEMORY)m -XX:PermSize=32m -XX:MaxPermSize=160m
endif

# 
# All java tools (javac, javah, and javadoc) run faster with certain java
#    options, this macro should be used with all these tools.
#    In particular, the client VM makes these tools run faster when
#    it's available.
#
ADD_CLIENT_VM_OPTION = false
ifeq ($(PLATFORM), solaris)
  ADD_CLIENT_VM_OPTION = true
else
  ifeq ($(ARCH_DATA_MODEL), 32)
    ADD_CLIENT_VM_OPTION = true
  endif
endif
JAVA_JVM_FLAGS =
ifeq ($(ADD_CLIENT_VM_OPTION), true)
  JAVA_JVM_FLAGS += -client
endif
ifdef USE_HOTSPOT_INTERPRETER_MODE
  JAVA_JVM_FLAGS += -Xint
endif

# Various VM flags
JAVA_TOOLS_FLAGS  = $(JAVA_JVM_FLAGS) $(JAVA_MEM_FLAGS)

# The VM flags for javac
JAVAC_JVM_FLAGS =

# 64-bit builds require a larger thread stack size.
ifeq ($(ARCH_DATA_MODEL), 32)
  JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=768
else
  JAVAC_JVM_FLAGS    += -J-XX:ThreadStackSize=1536
endif
JAVAC_JVM_FLAGS    += $(JAVA_TOOLS_FLAGS:%=-J%)

# The jar -J options are special, must be added at the end of the command line
JAR_JFLAGS       = $(JAVA_TOOLS_FLAGS:%=-J%)

# JAVA_TOOLS_DIR is the default location to find Java tools to run, if
#    langtools is not available.
#    This should be the latest promoted JDK javac.
ifndef JAVA_TOOLS_DIR
  JAVA_TOOLS_DIR = $(JDK_IMPORT_PATH)/bin
endif

#
# Invoking the Java compiler.   In leaf makefiles, choose as follows:
#  -- Use JAVAC if you want to take full control of what options get
#     passed to javac.
#  -- Use JAVAC_CMD if you want to take the defaults given to you.
#

ifndef DEBUG_CLASSFILES
  ifeq ($(VARIANT), DBG)
    DEBUG_CLASSFILES = true
  endif
endif
JAVACFLAGS =
ifeq ($(DEBUG_CLASSFILES),true)
  JAVACFLAGS += -g
endif
ifeq ($(COMPILER_WARNINGS_FATAL), true)
  JAVACFLAGS  += -Werror
endif

# Add the source level (currently all source is 1.5, should this be 1.6?)
LANGUAGE_VERSION = -source 1.5
JAVACFLAGS  += $(LANGUAGE_VERSION)

# Add the class version we want (currently this is 5, should it be 6 or even 7?)
TARGET_CLASS_VERSION = 5
CLASS_VERSION = -target $(TARGET_CLASS_VERSION)
JAVACFLAGS  += $(CLASS_VERSION)
JAVACFLAGS  += -encoding ascii
JAVACFLAGS  += "-Xbootclasspath:$(CLASSBINDIR)"
JAVACFLAGS  += $(OTHER_JAVACFLAGS)

# Needed for javah
JAVAHFLAGS += -bootclasspath $(CLASSBINDIR)

# Langtools
ifdef LANGTOOLS_DIST
  JAVAC_JAR   = $(LANGTOOLS_DIST)/bootstrap/lib/javac.jar
  JAVAH_JAR   = $(LANGTOOLS_DIST)/bootstrap/lib/javah.jar
  JAVADOC_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/javadoc.jar
  DOCLETS_JAR = $(LANGTOOLS_DIST)/bootstrap/lib/doclets.jar
  JAVAC_CMD   = $(BOOT_JAVA_CMD) \
		"-Xbootclasspath/p:$(JAVAC_JAR)" \
		-jar $(JAVAC_JAR) $(JAVACFLAGS)
  JAVAH_CMD   = $(BOOT_JAVA_CMD) \
		"-Xbootclasspath/p:$(JAVAH_JAR)$(CLASSPATH_SEPARATOR)$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)"  \
		-jar $(JAVAH_JAR) $(JAVAHFLAGS)
  JAVADOC_CMD = $(BOOT_JAVA_CMD) \
		"-Xbootclasspath/p:$(JAVADOC_JAR)$(CLASSPATH_SEPARATOR)$(JAVAC_JAR)$(CLASSPATH_SEPARATOR)$(DOCLETS_JAR)" \
		-jar $(JAVADOC_JAR)
else
  # If no explicit tools, use boot tools (add VM flags in this case)
  JAVAC_CMD     = $(JAVA_TOOLS_DIR)/javac $(JAVAC_JVM_FLAGS) \
		  $(JAVACFLAGS)
  JAVAH_CMD     = $(JAVA_TOOLS_DIR)/javah \
		  $(JAVAHFLAGS)
  JAVADOC_CMD   = $(JAVA_TOOLS_DIR)/javadoc $(JAVA_TOOLS_FLAGS:%=-J%)
endif

# Override of what javac to use (see deploy workspace)
ifdef JAVAC
  JAVAC_CMD     = $(JAVAC)
endif

#
# The bootstrap java compiler (defined as the javac in the ALT_BOOTDIR jdk).
#   Will be used to compile java code used to build the jdk, e.g. class files
#   created by this compiler will NOT become part of this built jdk, but just
#   used to build this jdk, e.g. run with the java in the ALT_BOOTDIR jdk.
#
# The javac supplied with the LANGTOOLS_DIST should be used to build the
#   classes that will be put into the built jdk. But note that this javac
#   will use the ALT_BOOTDIR java runtime. Any classes created by the
#   LANGTOOLS_DIST javac should not be run during this jdk build and indeed
#   may not even run with the ALT_BOOTDIR jdk because they may be a newer
#   class file version that the ALT_BOOTDIR jdk doesn't understand.
#
# The important observation here is that the built jdk is NOT run during
#   the build. If the built jdk needs to be verified that it can build this
#   same jdk, then it should be supplied to the build process as the ALT_BOOTDIR
#   jdk, and this resulting built jdk should be compared to the first one.
#   (They should be the same). Re-using this built jdk as the ALT_BOOTDIR
#   jdk will be the only way and the recommeneded way to verify the built jdk
#   can bootstrap itself.
#

# The javac options supplied to the boot javac is limited. This compiler
#   should only be used to build the 'make/tools' sources, which are not
#   class files that end up in the classes directory.
ifeq ($(COMPILER_WARNINGS_FATAL), true)
  BOOT_JAVACFLAGS  += -Werror
endif
BOOT_JAVACFLAGS  += -encoding ascii

BOOT_JAVA_CMD      = $(BOOTDIR)/bin/java $(JAVA_TOOLS_FLAGS)
BOOT_JAVAC_CMD     = $(BOOTDIR)/bin/javac $(JAVAC_JVM_FLAGS) $(BOOT_JAVACFLAGS)
BOOT_JAR_CMD       = $(BOOTDIR)/bin/jar
BOOT_JARSIGNER_CMD = $(BOOTDIR)/bin/jarsigner

# Various tools we need to run (FIXUP: Are these the right ones?)
NATIVE2ASCII    = $(BOOTDIR)/bin/native2ascii $(JAVA_TOOLS_FLAGS:%=-J%)
RMIC		= $(BOOTDIR)/bin/rmic $(JAVA_TOOLS_FLAGS:%=-J%)
IDLJ		= $(BOOTDIR)/bin/idlj $(JAVA_TOOLS_FLAGS:%=-J%)

# Should not be used
JAVA		= /should/not/be/used

