#
# Copyright 1995-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 variables used by all the Java makefiles.  This file should
# not contain rules.
#

# WARNING: This file is shared with other components.
#

ifndef JDK_MAKE_SHARED_DIR
  JDK_MAKE_SHARED_DIR = $(JDK_TOPDIR)/make/common/shared
endif

ifndef CONTROL_TOPDIR
  CONTROL_TOPDIR=$(TOPDIR)/control
endif
ifndef HOTSPOT_TOPDIR
  HOTSPOT_TOPDIR=$(TOPDIR)/hotspot
endif
ifndef LANGTOOLS_TOPDIR
  LANGTOOLS_TOPDIR=$(TOPDIR)/langtools
endif
ifndef CORBA_TOPDIR
  CORBA_TOPDIR=$(TOPDIR)/corba
endif
ifndef JAXP_TOPDIR
  JAXP_TOPDIR=$(TOPDIR)/jaxp
endif
ifndef JAXWS_TOPDIR
  JAXWS_TOPDIR=$(TOPDIR)/jaxws
endif
ifndef JDK_TOPDIR
  JDK_TOPDIR=$(TOPDIR)/jdk
endif
ifndef INSTALL_TOPDIR
  INSTALL_TOPDIR=$(TOPDIR)/install
endif
ifndef SPONSORS_TOPDIR
  SPONSORS_TOPDIR=$(TOPDIR)/sponsors
endif
ifndef DEPLOY_TOPDIR
  DEPLOY_TOPDIR=$(TOPDIR)/deploy
endif

# Get shared platform settings
include $(JDK_MAKE_SHARED_DIR)/Platform.gmk

# Default output directory
_OUTPUTDIR=$(CONTROL_TOPDIR)/build/$(PLATFORM)-$(ARCH)

# Get platform specific settings
include $(JDK_MAKE_SHARED_DIR)/Defs.gmk

SRC_BUNDLEDIR       = $(OUTPUTDIR)/source-bundles
ABS_SRC_BUNDLEDIR   = $(ABS_OUTPUTDIR)/source-bundles
BIN_BUNDLEDIR       = $(OUTPUTDIR)/bundles
ABS_BIN_BUNDLEDIR   = $(ABS_OUTPUTDIR)/bundles
JRL_BUNDLEDIR       = $(OUTPUTDIR)/java.net
ABS_JRL_BUNDLEDIR   = $(ABS_OUTPUTDIR)/java.net

dummy := $(shell $(MKDIR) -p $(BIN_BUNDLEDIR))
dummy := $(shell $(MKDIR) -p $(SRC_BUNDLEDIR) )
dummy := $(shell $(MKDIR) -p $(JRL_BUNDLEDIR) )

TEMP_DIR = $(OUTPUTDIR)/tmp
ABS_TEMP_DIR = $(ABS_OUTPUTDIR)/tmp

dummy := $(shell $(MKDIR) -p $(TEMP_DIR))

# The class version we want for this jdk build
TARGET_CLASS_VERSION=5

# The MESSAGE, WARNING and ERROR files are used to store sanity check and 
# source check messages, warnings and errors. 
export ERROR_FILE   := $(ABS_OUTPUTDIR)/sanityCheckErrors.txt
export WARNING_FILE := $(ABS_OUTPUTDIR)/sanityCheckWarnings.txt
export MESSAGE_FILE := $(ABS_OUTPUTDIR)/sanityCheckMessages.txt

# source bundle generation definitions
BUNDLE_DATE := $(shell $(DATE) '+%d_%b_%Y' | $(TR) "[A-Z]" "[a-z]")
ifdef ALT_BUNDLE_DATE
  BUNDLE_DATE := $(ALT_BUNDLE_DATE)
endif

# If the update version contains non-numeric characters, we need
# to massage it into a numeric format.  Unfortunately, the
# Windows VERSIONINFO resource that we stick in jvm.dll cannot
# handle non-numeric characters.  We have to do this here because
# Hotspot (nmake) cannot handle calculations.  So we use the
# following formula:
# COOKED_JDK_UPDATE_VERSION = JDK_UPDATE_VERSION * 10 + EXCEPTION_VERSION
# 
# Here are some examples:
#     1.5.0    b01  ->  5,0,0,1
#     1.5.0_10 b01  ->  5,0,100,1 
#     1.4.2 b01     ->  4,2,0,1
#     1.4.2_02 b01  ->  4,2,20,1
#     1.4.2_02a b01 ->  4,2,21,1
#     1.4.2_02b b01 ->  4,2,22,1
ifdef JDK_UPDATE_VERSION
  VTMP := $(shell $(ECHO) $(JDK_UPDATE_VERSION) | $(TR) "abcde" "12345")
  CHAR1 := $(shell $(ECHO) $(VTMP) | $(NAWK) '{print substr($$1, 1, 1);}')
  CHAR2 := $(shell $(ECHO) $(VTMP) | $(NAWK) '{print substr($$1, 2, 1);}')
  CHAR3 := $(shell $(ECHO) $(VTMP) | $(NAWK) '{print substr($$1, 3, 1);}')
  ifeq ($(CHAR3),)
    CHAR3 := 0
  endif
  ifeq ($(CHAR1), 0)
    COOKED_JDK_UPDATE_VERSION := $(CHAR2)$(CHAR3)
  else
    COOKED_JDK_UPDATE_VERSION := $(CHAR1)$(CHAR2)$(CHAR3)
  endif
endif

ifneq ($(JDK_BUILD_NUMBER),)
 COOKED_BUILD_NUMBER = $(shell $(ECHO) $(JDK_BUILD_NUMBER) \
			       | $(SED) -e 's/^b//' | $(SED) -e 's/^0//')
else
 COOKED_BUILD_NUMBER = 0
endif

