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

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

# This file needs these set: CC_VERSION, PLATFORM, ARCH_FAMILY, and ARCH_DATA_MODEL.

##########################################################################
#
# List of JDK official minimum, expected, or required versions:
#
# REQUIRED_ALSA_VERSION
#   Linux only: The ALSA sound library version expected.
#
# REQUIRED_ANT_VER
#   The minimum 'ant' version.
#
# REQUIRED_BOOT_VER
#   The minimum boot jdk version.
#
# REQUIRED_CC_VER
#   The primary C compiler version expected.
#
# REQUIRED_COMPILER_NAME
#   The long descriptive name of the compiler we should use
#
# REQUIRED_COMPILER_VERSION
#   The one word name that identifies the compilers being used.
#
# REQUIRED_CYGWIN_VER
#   Windows only: If CYGWIN is used, the minimum CYGWIN version.
#
# REQUIRED_DXSDK_VER
#   Windows only: The version of DirectX SDK expected.
#
# REQUIRED_FREE_SPACE
#   The minimum disk space needed as determined by running 'du -sk' on a fully
#   built workspace.
#
# REQUIRED_FREETYPE_VERSION
#   If we are using freetype, the freetype version expected.
#
# REQUIRED_GCC_VER
#   Solaris and Linux only. The required version of gcc/g++ for the plugin.
#
# REQUIRED_LINK_VER
#   Windows only: The version of link.exe expected.
#
# REQUIRED_MAKE_VER
#   The minimum version of GNU make.
#
# REQUIRED_MKS_VER
#   Windows only: If MKS used instead of CYGWIN, the minimum version of MKS.
#
# REQUIRED_OS_VARIANT_NAME
#   The OS variation name required.
#     Solaris: Solaris or OpenSolaris
#     Windows: Windows2000, WindowsXP, Windows2003, etc.
#     Linux: Fedora, RedHat, SuSE, Ubuntu, etc.
#
# REQUIRED_OS_VARIANT_VERSION
#   The version number associated with the above OS variant name.
#     Solaris: output of uname -r
#     Windows: 5.0 for Windows2000, 5.1 for WindowsXP, 5.2 for Windows2003, etc.
#     Linux: number for the variant, e.g. 9 for Fedora 9
#
# REQUIRED_OS_VERSION
#   The formal OS version number.
#     Solaris & Windows: same as REQUIRED_OS_VARIANT_VERSION
#     Linux: the kernel version, or output of uname -r
#
# REQUIRED_UNZIP_VER
#   The minimum version of unzip.
#
# REQUIRED_ZIP_VER
#   The minimum version of unzip.
#
###########
#
# Differences in the build platform from these versions may trigger warnings
#   messages during the sanity checking when building the JDK.
#
# When building the OpenJDK most of these required or expected  versions are 
#  ignored or allowed to vary widely to accomodate the many build situations
#  of the OpenJDK.
#
##########################################################################

# Solaris specific
ifeq ($(PLATFORM), solaris)
  REQUIRED_OS_VERSION         = 5.10
  REQUIRED_OS_VARIANT_NAME    = Solaris
  REQUIRED_OS_VARIANT_VERSION = $(REQUIRED_OS_VERSION)
  ifeq ($(ARCH_FAMILY), sparc)
    REQUIRED_FREE_SPACE       = 1300000
  else
    REQUIRED_FREE_SPACE       = 1040000
  endif
  REQUIRED_COMPILER_NAME      = Sun Studio 12
  REQUIRED_COMPILER_VERSION   = SS12
  ifeq ($(CC_VERSION),sun)
    REQUIRED_CC_VER           = 5.9
  endif
  ifeq ($(CC_VERSION),gcc)
    REQUIRED_CC_VER           = 3.4.3
  endif
  REQUIRED_GCC_VER            = 2.95.2
endif

# Linux specific
ifeq ($(PLATFORM), linux)
  REQUIRED_OS_VERSION         = 2.6
  REQUIRED_OS_VARIANT_NAME    = Fedora
  REQUIRED_OS_VARIANT_VERSION = 9
  REQUIRED_FREE_SPACE         = 1460000
  REQUIRED_ALSA_VERSION       = 0.9.1
  REQUIRED_COMPILER_NAME      = GCC4
  REQUIRED_COMPILER_VERSION   = GCC4
  REQUIRED_GCC_VER            = 2.95
  ifeq ($(CC_VERSION),gcc)
    REQUIRED_CC_VER           = 4.3.0
  endif
  ifeq ($(CC_VERSION),sun)
    REQUIRED_CC_VER           = 5.9
  endif
endif

# Windows specific
ifeq ($(PLATFORM), windows)
  ifeq ($(ARCH_DATA_MODEL),64)
    REQUIRED_OS_VERSION       = 5.2
    REQUIRED_OS_VARIANT_NAME  = Windows2003
  else
    REQUIRED_OS_VERSION       = 5.1
    REQUIRED_OS_VARIANT_NAME  = WindowsXP
  endif
  REQUIRED_OS_VARIANT_VERSION = $(REQUIRED_OS_VERSION)
  REQUIRED_CYGWIN_VER         = 4.0
  REQUIRED_MKS_VER            = 6.1
  REQUIRED_FREE_SPACE         = 500000
  REQUIRED_DXSDK_VER          = 0x0900
  ifeq ($(CC_VERSION),msvc)
    ifeq ($(ARCH_DATA_MODEL), 32)
      REQUIRED_COMPILER_NAME    = Visual Studio 10
      REQUIRED_COMPILER_VERSION = VS2010
      REQUIRED_CC_VER           = 16.00.30319.01
      REQUIRED_LINK_VER         = 10.00.30319.01
    else
      ifeq ($(ARCH), ia64)
        REQUIRED_COMPILER_NAME    = Microsoft Platform SDK - November 2001 Edition
        REQUIRED_COMPILER_VERSION = VS2003
        REQUIRED_CC_VER           = 13.00.9337.7
        REQUIRED_LINK_VER         = 7.00.9337.7
      endif
      ifeq ($(ARCH), amd64)
        REQUIRED_COMPILER_NAME    = Visual Studio 10
        REQUIRED_COMPILER_VERSION = VS2010
        REQUIRED_CC_VER           = 16.00.30319.01
        REQUIRED_LINK_VER         = 10.00.30319.01
      endif
    endif
  endif
  ifeq ($(CC_VERSION),gcc)
    REQUIRED_CC_VER           = 3.4.3
  endif
endif

# Generic
REQUIRED_ANT_VER          = 1.6.3
REQUIRED_BOOT_VER         = 1.5
REQUIRED_FREETYPE_VERSION = 2.3.0
REQUIRED_MAKE_VER         = 3.78
REQUIRED_UNZIP_VER        = 5.12
REQUIRED_ZIP_VER          = 2.2

