#
# Copyright (c) 1995, 2012, 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.
#

#
# Common 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.
#

# Check for strange explicit settings (change to empty or true)
ifdef OPENJDK
  ifneq ($(OPENJDK),true)
    x:=$(error "OPENJDK (if defined) can only be set to true")
  endif
endif

#
# On Solaris, the 'make' utility from Sun will not work with these makefiles.
#    This little rule is only understood by Sun's make, and is harmless
#    when seen by the GNU make tool. If using Sun's make, this causes the
#    make command to fail.
#
SUN_MAKE_TEST:sh = echo "ERROR: PLEASE USE GNU VERSION OF MAKE"; exit 33

ifndef JDK_TOPDIR
  ifdef BUILDDIR
    JDK_TOPDIR=$(BUILDDIR)/..
  else
    JDK_TOPDIR:=$(error "ERROR: Cannot define top of jdk repository")
  endif
endif
ifndef BUILDDIR
  # Hack, due to deploy repository using this file.
  BUILDDIR=$(JDK_TOPDIR)/make
endif
ifndef JDK_MAKE_SHARED_DIR
  JDK_MAKE_SHARED_DIR=$(JDK_TOPDIR)/make/common/shared
endif

include $(JDK_MAKE_SHARED_DIR)/Platform.gmk

TOPDIR=$(BUILDDIR)/..

include $(JDK_TOPDIR)/make/common/CancelImplicits.gmk

# Historically PLATFORM_SRC used to be src/$(PLATFORM), but we switched it to
# src/solaris so if you want to build on Linux you didn't need a src/linux
# directory.  In an ideal world it would be called src/genunix but we are not
# there yet.
#
ifndef SHARE_SRC
  SHARE_SRC    = $(BUILDDIR)/../src/share
endif

# Files that cannot be included in the OpenJDK distribution are
# collected under a parent directory which contains just those files.
ifndef CLOSED_SRC
  CLOSED_SRC  = $(BUILDDIR)/../src/closed
endif

# If CLOSE_SRC_INCLUDED isn't set to true, check if there's any
# closed directory.
ifneq ($(CLOSED_SRC_INCLUDED), true)
  CLOSED_SRC_INCLUDED := $(shell \
    if [ -d $(CLOSED_SRC) ] ; then \
      echo true; \
    else \
      echo false; \
    fi)
endif

# Set OPENJDK based on CLOSED_SRC_INCLUDED
ifeq ($(CLOSED_SRC_INCLUDED), false)
  OPENJDK = true
endif

# Define where closed directories are
ifdef OPENJDK
  CLOSED_SRC =
  CLOSED_SHARE_SRC =
else
  ifndef CLOSED_SHARE_SRC
    CLOSED_SHARE_SRC    = $(CLOSED_SRC)/share
  endif
endif

# We allow for potential specialization of build files. This has to be
# done on a file-by-file, case-by-case basis. Here we define the basic control
# over where custom files are being used. Later we will -include the custom
# Defs.gmk if present. This works best because all Makefiles include defs.gmk.
# In other cases we can either have foo.gmk include custom/foo.gmk, or
# a Makefile can do:
#  include foo.gmk
#  -include $CUSTOM_MAKE_DIR/foo.gmk
#
# For non-OpenJDK builds the default location is the make/closed repository.
# For OpenJDK builds a real value has to be supplied externally.
ifneq ($(OPENJDK),true)
  CUSTOM_MAKE_DIR = $(BUILDDIR)/closed
endif

#
# Get platform definitions
#

include $(JDK_TOPDIR)/make/common/Defs-$(PLATFORM).gmk

#
# Cross-compilation Settings
#
ifdef CROSS_COMPILE_ARCH
  # Can't run the tools we just built
  USE_ONLY_BOOTDIR_TOOLS = true

  # When cross-compiling CC generates code for the target, but
  # some parts of the build generate C code that has to be compiled
  # and executed on the build host - HOST_CC is the 'local' compiler.
  # For linux the default is /usr/bin/gcc; other platforms need to
  # set it explicitly
  ifeq ($(PLATFORM), linux)
    ifndef HOST_CC
      HOST_CC = $(USRBIN_PATH)gcc
    endif
  endif
else
  # Must set HOST_CC if not already set
  ifndef HOST_CC
    HOST_CC = $(CC)
  endif
endif

# Reset the VM name for client-only builds
ifdef BUILD_CLIENT_ONLY
  VM_NAME = client
endif

#
# Freetype logic is applicable to OpenJDK only
#
ifdef OPENJDK

#if we use system lib we do not need to copy it to build tree
USING_SYSTEM_FT_LIB=false

ifeq ($(PLATFORM), windows)
  DEVTOOLS_FT_DIR=$(JDK_DEVTOOLS_DIR)/win32/freetype-$(ARCH)
endif
ifeq ($(PLATFORM), linux)
  DEVTOOLS_FT_DIR=$(JDK_DEVTOOLS_DIR)/$(PLATFORM)/freetype-$(ARCH)
endif
ifeq ($(PLATFORM), solaris)
  # historically for Solaris we have slightly different devtools 
  # naming conventions
  DEVTOOLS_FT_DIR=$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/freetype-$(ARCH)
endif

DEVTOOLS_FT_DIR_EXISTS = $(shell \
  if [ -f $(DEVTOOLS_FT_DIR)/include/ft2build.h ] ; then \
    echo true; \
  else \
    echo false; \
  fi)

  ifdef ALT_FREETYPE_LIB_PATH
    FREETYPE_LIB_PATH = $(ALT_FREETYPE_LIB_PATH)
    ifeq ($(PLATFORM), macosx)
      USING_SYSTEM_FT_LIB=true
    endif
  else
    ifeq ($(DEVTOOLS_FT_DIR_EXISTS), true)
      FREETYPE_LIB_PATH = $(DEVTOOLS_FT_DIR)/lib
    else
      ifeq ($(PLATFORM), macosx)
        FREETYPE_LIB_PATH = /usr/X11R6/lib
      else
        FREETYPE_LIB_PATH = /usr/lib
      endif
      USING_SYSTEM_FT_LIB=true
    endif
  endif 

  ifdef ALT_FREETYPE_HEADERS_PATH
    FREETYPE_HEADERS_PATH = $(ALT_FREETYPE_HEADERS_PATH)
  else
    ifeq ($(DEVTOOLS_FT_DIR_EXISTS), true)
      FREETYPE_HEADERS_PATH = $(DEVTOOLS_FT_DIR)/include
    else
      ifeq ($(PLATFORM), macosx)
        FREETYPE_HEADERS_PATH = /usr/X11R6/include
      else
        FREETYPE_HEADERS_PATH = /usr/include
      endif
    endif
  endif
endif

#
# zlib version
#
ZLIB_VERSION = 1.2.5


#
# Localizations for the different parts of the product beyond English
#

JRE_LOCALES   = de es fr it ja ko pt_BR sv zh_CN zh_TW zh_HK
PLUGIN_LOCALES = de es fr it ja ko pt_BR sv zh_CN zh_TW zh_HK
JDK_LOCALES  = ja zh_CN

#
# A list of locales we support but don't have resource files.
# This is defined to optimize the search of resource bundles.
#
JRE_NONEXIST_LOCALES = en en_US de_DE es_ES fr_FR it_IT ja_JP ko_KR sv_SE zh

#
# For now, most libraries except libjava and libjvm itself link against libjvm
# and libjava, the latter for its exported common utilities. libjava only
# links against libjvm. Programs' makefiles take their own responsibility for
# adding other libs.
#
# The makefiles for these packages do not link against libjvm and libjava.
# This list will eventually go away and each Programs' makefiles
# will have to explicitly declare that they want to link to libjava/libjvm
#
NO_JAVALIB_PKGS = \
		sun.security.mscapi \
		sun.security.krb5 \
		sun.security.pkcs11 \
		sun.security.jgss \
		sun.security.jgss.wrapper \
		sun.security.ec \
		sun.security.smartcardio \
		com.sun.security.auth.module

ifdef PACKAGE
# put JAVALIB first, but do not lose any platform specific values....
  ifeq (,$(findstring $(PACKAGE),$(NO_JAVALIB_PKGS)))
    LDLIBS_COMMON = $(JAVALIB)
  endif
endif # PACKAGE

#
# Libraries that must appear ahead of libc.so on the link command line
#
ifdef PROGRAM

  ifeq ($(PLATFORM), solaris)
    LDLIBS_COMMON = -lthread -ldl
  endif

  ifeq ($(PLATFORM), linux)
    LDLIBS_COMMON = -ldl
  endif

  ifeq ($(PLATFORM), macosx)
    LDLIBS_COMMON = -pthread
  endif

endif # PROGRAM

LDLIBS_COMMON += $(EXTRA_LIBS)

# for generated libraries
LIBDIR              = $(OUTPUTDIR)/lib
ABS_LIBDIR          = $(ABS_OUTPUTDIR)/lib
# Optional place to save the windows .lib files
LIBFILES_DIR        = $(OUTPUTDIR)/libfiles
# for ext jre files
EXTDIR              = $(LIBDIR)/ext
# for generated include files
INCLUDEDIR          = $(OUTPUTDIR)/include
# for generated class files
CLASSBINDIR         = $(OUTPUTDIR)/classes
DEMOCLASSDIR        = $(OUTPUTDIR)/democlasses
# for generated tool class files
BUILDTOOLCLASSDIR   = $(OUTPUTDIR)/btclasses
# for build tool jar files
BUILDTOOLJARDIR     = $(OUTPUTDIR)/btjars
ABS_BUILDTOOLJARDIR = $(ABS_OUTPUTDIR)/btjars
# for generated tool class files
BUILDTOOLBINDIR     = $(OUTPUTDIR)/btbins
ABS_BUILDTOOLBINDIR = $(ABS_OUTPUTDIR)/btbins
# for generated java source files
GENSRCDIR           = $(OUTPUTDIR)/gensrc
# for generated C source files (not javah)
GENNATIVESRCDIR     = $(OUTPUTDIR)/gennativesrc
# for imported source files
IMPORTSRCDIR        = $(OUTPUTDIR)/impsrc
# for imported documents
IMPORTDOCDIR        = $(OUTPUTDIR)/impdoc
# for generated demo
DEMODIR             = $(OUTPUTDIR)/demo
# for sample code
SAMPLEDIR           = $(OUTPUTDIR)/sample
# for generated documentation
DOCSDIR             = $(OUTPUTDIR)/docs$(DOCSDIRSUFFIX)
DOCSDIRSUFFIX       =

# The MESSAGE, WARNING and ERROR files are used to store sanityck and 
# warnings and errors. 
ifndef ERROR_FILE
  ERROR_FILE   = $(OUTPUTDIR)/sanityCheckErrors.txt
endif
ifndef WARNING_FILE
  WARNING_FILE = $(OUTPUTDIR)/sanityCheckWarnings.txt
endif
ifndef MESSAGE_FILE
  MESSAGE_FILE = $(OUTPUTDIR)/sanityCheckMessages.txt
endif

JDK_IMAGE_DIR = $(ABS_OUTPUTDIR)/j2sdk-image
JRE_IMAGE_DIR = $(ABS_OUTPUTDIR)/j2re-image

#where the demo source can be found
DEMOSRCDIR          = $(SHARE_SRC)/demo

#where the sample source can be found
SAMPLESRCDIR          = $(SHARE_SRC)/sample

# An attempt is made to generate unique enough directories for the
# generated files to not have name collisisons. Most build units
# defines PRODUCT (except Release.gmk), but then they may or may 
# not define PACKAGE, PROGRAM, and LIBRARY. This code attempts to
# generate a unique OBJDIR/CLASSHDRDIR for each build unit based
# on which of those values are set within each build unit.

UNIQUE_LOCATION_STRING = tmp

ifneq ($(PRODUCT),)
  UNIQUE_LOCATION_STRING += /$(PRODUCT)
endif

ifneq ($(PACKAGE),)
  UNIQUE_LOCATION_STRING += /$(PACKAGE)
endif

ifneq ($(PROGRAM),)
  UNIQUE_LOCATION_STRING += /$(PROGRAM)
endif

ifneq ($(LIBRARY),)
  ifneq ($(LIBRARY_OUTPUT),)
    UNIQUE_LOCATION_STRING += /$(LIBRARY_OUTPUT)
  else
    UNIQUE_LOCATION_STRING += /$(LIBRARY)
  endif
endif

# the use of += above makes a space separated list which we need to 
# remove for filespecs.
#
NULLSTRING :=
ONESPACE := $(NULLSTRING) # space before this comment is required.
UNIQUE_PATH = $(subst $(ONESPACE),,$(UNIQUE_LOCATION_STRING))

# TEMPDIR is a unique general purpose directory
# need to use 'override' because GNU Make on Linux exports the wrong
# value.
override TEMPDIR      = $(OUTPUTDIR)/$(UNIQUE_PATH)
override ABS_TEMPDIR  = $(ABS_OUTPUTDIR)/$(UNIQUE_PATH)

# This must be created right away for pattern rules in Sanity.gmk to work.
dummy1:=$(shell $(MKDIR) -p $(TEMPDIR))
dummy2:=$(shell $(MKDIR) -p $(TEMP_DISK))

# OBJDIRNAME is the name of the directory where the object code is to
#   be placed. It's name depends on whether the data model architecture 
#   is 32-bit or not.
ifneq ($(ARCH_DATA_MODEL), 32)
  OBJDIRNAME  = obj$(ARCH_DATA_MODEL)$(OBJDIRNAME_SUFFIX)
else
  OBJDIRNAME  = obj$(OBJDIRNAME_SUFFIX)
endif
OBJDIR      = $(TEMPDIR)/$(OBJDIRNAME)

# CLASSHDRDIR is where the generated C Class Header files go.
CLASSHDRDIR = $(TEMPDIR)/CClassHeaders

#
# CLASSDESTDIR can be used to specify the directory where generated classes
# are to be placed. The default is CLASSBINDIR.
#
ifndef CLASSDESTDIR
CLASSDESTDIR = $(CLASSBINDIR)
endif

INCLUDES = -I. -I$(CLASSHDRDIR) \
	$(patsubst %,-I%,$(subst $(CLASSPATH_SEPARATOR), ,$(VPATH.h))) $(OTHER_INCLUDES)
OTHER_CPPFLAGS += $(INCLUDES)

#
# vpaths.  These are the default locations searched for source files.
# GNUmakefiles of individual areas often override the default settings.
# There are no longer default vpath entries for C and assembler files
# so we can ensure that libraries don't get their hands on JVM files.
#
# We define an intermediate variable for Java files because
# we use its value later to help define $SOURCEPATH

ifeq ($(PLATFORM), macosx)
  VPATH0.java = $(subst $(ONESPACE),:,$(GENSRCDIR) $(call JavaSrcDirList,,classes))
else
  VPATH0.java = $(GENSRCDIR)$(CLASSPATH_SEPARATOR)$(PLATFORM_SRC)/classes$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/classes
endif

ifdef OPENJDK
  VPATH.java = $(VPATH0.java)
else
  #
  # If filenames are duplicated between open/closed workspaces, prefer
  # the closed files.
  #
  # Source ordering is important: some targets depend on closed files
  # replacing open ones, and thus the closed file sources must be found
  # before the open ones.
  #
  # Don't reorder without consulting the teams that depend on this behavior.
  #
  VPATH.java = $(CLOSED_PLATFORM_SRC)/classes$(CLASSPATH_SEPARATOR)$(CLOSED_SHARE_SRC)/classes$(CLASSPATH_SEPARATOR)$(VPATH0.java)
endif
vpath %.java $(VPATH.java)
vpath %.class $(CLASSBINDIR)
vpath %.$(OBJECT_SUFFIX) $(OBJDIR)

#
# VPATH.h is used elsewhere to generate include flags.  By default, 
# anyone has access to the include files that the JVM area exports,
# namely jni.h, jvm.h, and jni_utils.h, plus their platform-specific
# relatives.
#
VPATH0.h =   $(PLATFORM_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(SHARE_SRC)/javavm/export
ifdef OPENJDK
  VPATH.h = $(VPATH0.h)
else
  VPATH.h = $(CLOSED_SHARE_SRC)/javavm/export$(CLASSPATH_SEPARATOR)$(VPATH0.h)
endif
vpath %.h   $(VPATH.h)

#
# Used in two ways: helps link against libjava.so. Also if overridden
# determines where your shared library is installed.
#
ifndef LIB_LOCATION
  LIB_LOCATION    =  $(LIBDIR)/$(LIBARCH)
endif

#
# Java header and stub variables
#
CLASSHDRS     = $(patsubst %,$(CLASSHDRDIR)/%.h,$(subst .,_,$(CLASSES.export)))
CLASSSTUBOBJS = classstubs.$(OBJECT_SUFFIX)
STUBPREAMBLE  = $(INCLUDEDIR)/StubPreamble.h

#
# Classpath seen by javac (different from the one seen by the VM
# running javac), and useful variables.
#
SOURCEPATH	= $(VPATH.java)
PKG		= $(shell $(EXPR) $(PACKAGE) : '\([a-z]*\)')
PKGDIR		= $(subst .,/,$(PACKAGE))

#
# The java/javac/jdk variables (JAVAC_CMD, JAVA_CMD, etc.)
#
include $(JDK_MAKE_SHARED_DIR)/Defs-java.gmk

UNIQUE_PATH_PATTERN = $(subst /,.,$(UNIQUE_PATH))

# Run MAKE $@ for a launcher:
#   $(call make-launcher, name, mainclass, java-args, main-args)
define make-launcher
$(CD) $(BUILDDIR)/launchers && \
$(MAKE) -f Makefile.launcher \
        PROGRAM=$(strip $1) \
        MAIN_CLASS=$(strip $2) \
        MAIN_JAVA_ARGS="$(strip $3)" \
        MAIN_ARGS="$(strip $4)"
endef

#
# Convenient macros
#

# Prepare $@ target, remove old one and making sure directory exists
define prep-target
$(MKDIR) -p $(@D)
$(RM) $@
endef

# Simple install of $< file to $@
define install-file
$(prep-target)
$(CP) $< $@
endef

define chmod-file
$(CHMOD) $1 $@
endef

define install-sym-link
$(LN) -s $1 $@
endef

define install-manifest-file
$(install-file)
endef

# Cleanup rule for after debug java run (hotspot.log file is left around)
#   (This could be an old leftover file in a read-only area, use the @- prefix)
HOTSPOT_LOG_NAME = hotspot.log
define java-vm-cleanup
if [ -w $(HOTSPOT_LOG_NAME) ] ; then $(RM) $(HOTSPOT_LOG_NAME); fi
endef

# Current directory
CURRENT_DIRECTORY := $(shell $(PWD))

#
# Create BYFILE OPT and DBG settings, if CFLAGS_OPT/foobar.o is set then it is
#    used for this file, otherwise the default settings are used.
#
CFLAGS_$(VARIANT)/BYFILE    = $(CFLAGS_$(VARIANT)/$(@F)) \
                              $(CFLAGS_$(VARIANT)$(CFLAGS_$(VARIANT)/$(@F)))
CXXFLAGS_$(VARIANT)/BYFILE  = $(CXXFLAGS_$(VARIANT)/$(@F)) \
                              $(CXXFLAGS_$(VARIANT)$(CXXFLAGS_$(VARIANT)/$(@F)))

# Command line define to provide basename of file being compiled to source.
#   The C macro THIS_FILE can replace the use of __FILE__ in the source
#   files for the current filename being compiled.
#   The value of the __FILE__ macro is unpredictable and can be anything
#   from a relative path to a full path, THIS_FILE will be more consistent..
#   The THIS_FILE macro will always be just the basename of the file being
#   compiled.
#   Different string literals in the the object files makes it difficult to
#   compare shared libraries from different builds.
#
#   NOTE: If the THIS_FILE macro is actually expanded while in an included
#         source file, it will not return the name of the included file.
#
CPP_THIS_FILE = -DTHIS_FILE='"$(<F)"'

#
# Tool flags
#
# EXTRA_CFLAGS are used to define cross-compilation options
#
ASFLAGS         = $(ASFLAGS_$(VARIANT)) $(ASFLAGS_COMMON) $(OTHER_ASFLAGS)
CFLAGS          = $(CFLAGS_$(VARIANT)/BYFILE)   $(CFLAGS_COMMON) $(OTHER_CFLAGS) $(EXTRA_CFLAGS)
CXXFLAGS        = $(CXXFLAGS_$(VARIANT)/BYFILE) $(CXXFLAGS_COMMON) $(OTHER_CXXFLAGS) $(EXTRA_CFLAGS)
CPPFLAGS        = $(CPPFLAGS_$(VARIANT)) $(CPPFLAGS_COMMON) $(OTHER_CPPFLAGS) \
		  $(DEFINES) $(OPTIONS:%=-D%) $(CPP_THIS_FILE)
LDFLAGS         = $(LDFLAGS_$(VARIANT)) $(LDFLAGS_COMMON) $(OTHER_LDFLAGS)
LDLIBS          = $(OTHER_LDLIBS) $(LDLIBS_$(VARIANT)) $(LDLIBS_COMMON)
LINTFLAGS       = $(LINTFLAGS_$(VARIANT)) $(LINTFLAGS_COMMON) \
		  $(OTHER_LINTFLAGS)

VERSION_DEFINES = -DRELEASE='"$(RELEASE)"'

ifdef INSANE
  export INSANE
endif

ifdef ALT_COPYRIGHT_YEAR
  COPYRIGHT_YEAR = $(ALT_COPYRIGHT_YEAR)
else
  COPYRIGHT_YEAR := $(shell $(DATE) '+%Y')
endif

ifndef OPENJDK
include $(JDK_TOPDIR)/make/closed/common/Defs.gmk
endif

# Install of imported file (JDK_IMPORT_PATH, or some other external location)
define install-importonly-file
@$(ECHO) "ASSEMBLY_IMPORT: $@"
$(prep-target)
$(CP) $< $@
@if [ "$(PLATFORM)" = "linux" -a "$(@F)" = "libjvm.so" ] ; then     \
  if [ -x /usr/sbin/selinuxenabled ] ; then                         \
    /usr/sbin/selinuxenabled;                                       \
    if [ $$? = 0 ] ; then                                           \
      $(ECHO) "/usr/bin/chcon -t textrel_shlib_t $@";               \
      /usr/bin/chcon -t textrel_shlib_t $@;                         \
      if [ $$? != 0 ]; then                                         \
        echo "ERROR: Cannot chcon $@";                              \
      fi;                                                           \
    fi;                                                             \
  fi;                                                               \
fi
endef

define install-import-file
$(install-importonly-file)
endef

-include $(CUSTOM_MAKE_DIR)/Defs.gmk

.PHONY: all build clean clobber
