#
# Copyright 2005-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.
#

#
# Definitions for Solaris.
#

# Default for COMPILER_WARNINGS_FATAL on Solaris (C & C++ compiler warnings)
ifndef COMPILER_WARNINGS_FATAL
  COMPILER_WARNINGS_FATAL=false
endif

# Solaris should use parallel compilation for best build times
ifndef COMPILE_APPROACH
  COMPILE_APPROACH = parallel
endif

# Indication that we are doing an incremental build.
#    This may trigger the creation of make depend files.
ifndef INCREMENTAL_BUILD
  INCREMENTAL_BUILD = false
endif

# FullPath just makes sure it never ends with a / and no duplicates
define FullPath
$(shell cd $1 2> $(DEV_NULL) && pwd)
endef

# OptFullPath: Absolute path name of a dir that might not initially exist.
define OptFullPath
$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi)
endef

# Location on system where jdk installs might be
USRJDKINSTANCES_PATH =/usr/jdk/instances

# UNIXCOMMAND_PATH: path to where the most common Unix commands are.
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_UNIXCOMMAND_PATH)" "undefined"
  UNIXCOMMAND_PATH :=$(call PrefixPath,$(ALT_UNIXCOMMAND_PATH))
else
  UNIXCOMMAND_PATH  = /usr/bin/
endif

# UNIXCCS_PATH: path to where the less common UNIX commands can be found
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_UNIXCCS_PATH)" "undefined"
  UNIXCCS_PATH :=$(call PrefixPath,$(ALT_UNIXCCS_PATH))
else
  UNIXCCS_PATH = /usr/ccs/bin/
endif

# SLASH_JAVA: location of all network accessable files
ifdef ALT_SLASH_JAVA
  SLASH_JAVA  :=$(ALT_SLASH_JAVA)
else
  SLASH_JAVA  := $(call DirExists,/java,/java,/NOT-SET)
endif

# JDK_DEVTOOLS_DIR: common path for all the java devtools
ifdef ALT_JDK_DEVTOOLS_DIR
  JDK_DEVTOOLS_DIR  =$(ALT_JDK_DEVTOOLS_DIR)
else
  JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools
endif

# COMPILER_PATH: path to where the compiler and tools are installed.
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_COMPILER_PATH)" "undefined"
  COMPILER_PATH :=$(call PrefixPath,$(ALT_COMPILER_PATH))
else
  # Careful here, COMPILER_VERSION may not be defined yet (see Compiler.gmk)
  # If the place where we keep a set of Sun Studio compilers doesn't exist,
  #  try and use /opt/SUNWspro, the default location for the SS compilers.
  #  (DirExists checks for this path twice, an automount double check)
  _SUNSTUDIO_SET_ROOT=$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/SUNWspro
  SUNSTUDIO_SET_ROOT:=$(call DirExists,$(_SUNSTUDIO_SET_ROOT),$(_SUNSTUDIO_SET_ROOT),)
  ifneq ($(SUNSTUDIO_SET_ROOT),)
    COMPILER_PATH =$(SUNSTUDIO_SET_ROOT)/$(COMPILER_VERSION)/bin/
  else
    COMPILER_PATH =/opt/SUNWspro/bin/
  endif
endif

# DEVTOOLS_PATH: for other tools required for building (such as zip, etc.)
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_DEVTOOLS_PATH)" "undefined"
  DEVTOOLS_PATH :=$(call PrefixPath,$(ALT_DEVTOOLS_PATH))
else
  ifdef ALT_JDK_DEVTOOLS_DIR
    DEVTOOLS_PATH =$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/bin/
  else
    ifdef OPENJDK
      DEVTOOLS_PATH = /usr/bin/
    else
      DEVTOOLS_PATH =$(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/bin/
    endif
  endif
endif

# _BOOTDIR1: First choice for a Bootstrap JDK, previous released JDK.
# _BOOTDIR2: Second choice
ifndef ALT_BOOTDIR
  _BOOTDIR1  =$(SLASH_JAVA)/re/jdk/$(PREVIOUS_JDK_VERSION)/archive/fcs/binaries/$(PLATFORM)-$(ARCH)
  _BOOTDIR2  =$(USRJDKINSTANCES_PATH)/jdk$(PREVIOUS_JDK_VERSION)
endif

# GCC_COMPILER_PATH: path to where the gcc/g++ compiler and tools are installed
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifneq "$(origin ALT_GCC_COMPILER_PATH)" "undefined"
  GCC_COMPILER_PATH :=$(call PrefixPath,$(ALT_GCC_COMPILER_PATH))
else
  GCC_COMPILER_PATH = $(JDK_DEVTOOLS_DIR)/$(ARCH_FAMILY)/gnucc/bin/
endif


# Always build headless on Solaris
BUILD_HEADLESS = true

_CUPS_HEADERS_PATH=/opt/sfw/cups/include

# Import JDK images allow for partial builds, components not built are
#    imported (or copied from) these import areas when needed.

# BUILD_JDK_IMPORT_PATH: location of JDK install trees to import for 
#   multiple platforms, e.g. windows-i586, solaris-sparc, linux-586, etc.
ifdef ALT_BUILD_JDK_IMPORT_PATH
  BUILD_JDK_IMPORT_PATH  :=$(call FullPath,$(ALT_BUILD_JDK_IMPORT_PATH))
else
  BUILD_JDK_IMPORT_PATH   = $(PROMOTED_BUILD_BINARIES)
endif
BUILD_JDK_IMPORT_PATH:=$(call AltCheckValue,BUILD_JDK_IMPORT_PATH)

# JDK_IMPORT_PATH: location of previously built JDK (this version) to import
ifdef ALT_JDK_IMPORT_PATH
  JDK_IMPORT_PATH  :=$(call FullPath,$(ALT_JDK_IMPORT_PATH))
else
  JDK_IMPORT_PATH   = $(BUILD_JDK_IMPORT_PATH)/$(PLATFORM)-$(ARCH)$(_JDK_IMPORT_VARIANT)
endif
JDK_IMPORT_PATH:=$(call AltCheckValue,JDK_IMPORT_PATH)

# HOTSPOT_IMPORT_PATH: location of hotspot pre-built files
ifdef ALT_HOTSPOT_IMPORT_PATH
  HOTSPOT_IMPORT_PATH :=$(call FullPath,$(ALT_HOTSPOT_IMPORT_PATH))
else
  HOTSPOT_IMPORT_PATH =$(JDK_IMPORT_PATH)
endif
HOTSPOT_IMPORT_PATH:=$(call AltCheckValue,HOTSPOT_IMPORT_PATH)

# HOTSPOT_CLIENT_PATH: location of client jvm library file.
ifeq ($(ARCH_DATA_MODEL), 32)
  ifdef ALT_HOTSPOT_CLIENT_PATH
    HOTSPOT_CLIENT_PATH :=$(call FullPath,$(ALT_HOTSPOT_CLIENT_PATH))
  else
    HOTSPOT_CLIENT_PATH   =$(HOTSPOT_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/client
  endif
  HOTSPOT_CLIENT_PATH:=$(call AltCheckValue,HOTSPOT_CLIENT_PATH)
endif

# HOTSPOT_SERVER_PATH: location of server jvm library file.
ifdef ALT_HOTSPOT_SERVER_PATH
  HOTSPOT_SERVER_PATH :=$(call FullPath,$(ALT_HOTSPOT_SERVER_PATH))
else
  HOTSPOT_SERVER_PATH   =$(HOTSPOT_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/server
endif
HOTSPOT_SERVER_PATH:=$(call AltCheckValue,HOTSPOT_SERVER_PATH)

