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

#
# 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, REQUIRED_COMPILER_VERSION may not be defined yet (see Defs-versions.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)/$(REQUIRED_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)

