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

#
# Definitions for Windows.
#

# Default for COMPILER_WARNINGS_FATAL on Windows (C++ compiler warnings)
#    Level: Default is 3, 0 means none, 4 is the most but may be unreliable
#    Some makefiles may have set this to 0 to turn off warnings completely,
#    which also effectively creates a COMPILER_WARNINGS_FATAL=false situation.
#    Program.gmk may turn this down to 2 (building .exe's).
#    Windows 64bit platforms are less likely to be warning free.
#    Historically, Windows 32bit builds should be mostly warning free.
#    VS2010 introduced a large number of security warnings that are off by
#    default but will be turned back on with SHOW_ALL_WARNINGS=true.
ifndef COMPILER_WARNING_LEVEL
  COMPILER_WARNING_LEVEL=3
endif
ifndef COMPILER_WARNINGS_FATAL
  COMPILER_WARNINGS_FATAL=false
endif
ifndef SHOW_ALL_WARNINGS
  SHOW_ALL_WARNINGS = false
endif

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

# Indication that we are doing an incremental build.
#    This may trigger the creation of make depend files.
#    (This may not be working on windows yet, always force to false.)
override INCREMENTAL_BUILD = false

# WARNING: This is extremely touch stuff, between CYGWIN vs. MKS and all
#          variations of MKS and CYGWIN releases, and 32bit vs 64bit,
#          this file can give you nightmares.
#
# Notes:
#   Keep all paths in the windows "mixed" style except CYGWIN UNXIXCOMMAND_PATH.
#   Use of PrefixPath is critical, some variables must end with / (see NOTE).
#   Use of quotes is critical due to possible spaces in paths coming from
#     the environment variables, be careful.
#   First convert \ to / with subst, keep it quoted due to blanks, then
#     use cygpath -s or dosname -s to get the short non-blank name.
#   If the MKS is old and doesn't have a dosname -s, you will be forced
#     to set ALT variables with the short non-space directory names.
#     If dosname doesn't appear to work, we won't use it.
#     The dosname utility also wants to accept stdin if it is not supplied
#     any path on the command line, this is really dangerous when using
#     make variables that can easily become empty, so I use:
#        echo $1 | dosname -s     instead of    dosname -s $1
#     to prevent dosname from hanging up the make process when $1 is empty.
#     The cygpath utility does not have this problem.
#   The ALT values should never really have spaces or use \.
#   Suspect these environment variables to have spaces and/or \ characters:
#     SYSTEMROOT, SystemRoot, WINDIR, windir, PROGRAMFILES, ProgramFiles,
#     DXSDK_DIR, MSTOOLS, Mstools, MSSDK, MSSdk, VCnnCOMNTOOLS, 
#     MSVCDIR, MSVCDir.
#     So use $(subst \,/,) on them first adding quotes and placing them in
#         their own variable assigned with :=, then use FullPath.
#

ifdef USING_CYGWIN
# Macro to effectively do a toupper without an exec
define ToUpper
$(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,\
$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,\
$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,\
$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,\
$(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
endef
# All possible drive letters
drives=a b c d e f g h i j k l m n o p q r s t v u w x y z
# Convert /cygdrive/ paths to the mixed style without an exec of cygpath
#   Must be a path with no spaces. /cygdrive/letter is always lowercase
#   and letter:/ is always uppercase coming from cygpath.
define MixedPath
$(patsubst /%,$(CYGWIN_HOME)/%,$(sort $(filter-out /cygdrive/%,$(foreach drive,$(drives),$(patsubst /cygdrive/$(drive)/%,$(call ToUpper,$(drive)):/%,$1)))))
endef
# Use FullPath to get C:/ style non-spaces path. Never ends with a /!
# We assume cygpath is available in the search path
#    NOTE: Use of 'pwd' with CYGWIN will not get you a mixed style path!
define FullPath
$(if $(word 2,$1),$(shell $(CYGPATH_CMD) $1 2> $(DEV_NULL)),$(call MixedPath,$(realpath $(subst ",,$1))))
endef
define OptFullPath
$(shell if [ "$1" != "" -a -d "$1" ]; then $(CYGPATH_CMD) "$1" 2> $(DEV_NULL); else echo "$1"; fi)
endef
else
ifdef USING_MSYS
DOSPATH_CMD:=$(shell cd $(JDK_TOPDIR) 2> $(DEV_NULL) && pwd)/make/tools/msys_build_scripts/dospath.sh
define FullPath
$(subst \,/,$(shell $(DOSPATH_CMD) $1))
endef
define OptFullPath
$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi)
endef
else
# Temporary until we upgrade to MKS 8.7, MKS pwd returns mixed mode path
define FullPath
$(shell cd $1 2> $(DEV_NULL) && pwd)
endef
define OptFullPath
$(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi)
endef
endif
endif

# System drive
ifdef SYSTEMDRIVE
  _system_drive =$(SYSTEMDRIVE)
else
  ifdef SystemDrive
    _system_drive =$(SystemDrive)
  endif
endif
_system_drive:=$(call CheckValue,_system_drive,C:)

# UNIXCOMMAND_PATH: path to where the most common Unix commands are.
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
#        With cygwin, just use this as is don't use FullPath on it.
ifdef ALT_UNIXCOMMAND_PATH
  ifdef USING_CYGWIN
    UNIXCOMMAND_PATH       :=$(call PrefixPath,$(ALT_UNIXCOMMAND_PATH))
  else
    xALT_UNIXCOMMAND_PATH  :="$(subst \,/,$(ALT_UNIXCOMMAND_PATH))"
    fxALT_UNIXCOMMAND_PATH :=$(call FullPath,$(xALT_UNIXCOMMAND_PATH))
    UNIXCOMMAND_PATH       :=$(call PrefixPath,$(fxALT_UNIXCOMMAND_PATH))
  endif
else
  ifdef USING_CYGWIN
    UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin)
  else
    ifdef USING_MSYS
      UNIXCOMMAND_PATH :=$(call PrefixPath,/bin)
    else
      ifdef ROOTDIR
        xROOTDIR :="$(subst \,/,$(ROOTDIR))"
        _rootdir :=$(call FullPath,$(xROOTDIR))
      else
        xROOTDIR :="$(_system_drive)/mksnt"
        _rootdir :=$(call FullPath,$(xROOTDIR))
      endif
      ifneq ($(_rootdir),)
        UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt)
      endif
    endif # USING_MSYS
  endif # USING_CYGWIN
endif
UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH)

# Get version of MKS or CYGWIN
ifdef USING_MKS
  _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@')
  MKS_VER  :=$(call GetVersion,$(_MKS_VER))
  # At this point, we can re-define FullPath to use DOSNAME_CMD
  CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7)
  TRY_DOSNAME:=false
  ifeq ($(CHECK_MKS87),same)
    TRY_DOSNAME:=true
  endif
  # Newer should be ok
  ifeq ($(CHECK_MKS87),newer)
    TRY_DOSNAME:=true
  endif
  ifeq ($(TRY_DOSNAME),true)
    ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/)
      _DOSNAME=$(UNIXCOMMAND_PATH)dosname
      DOSNAME_CMD:=$(_DOSNAME) -s
define FullPath
$(subst //,/,$(shell echo $1 | $(DOSNAME_CMD) 2> $(DEV_NULL)))
endef
    endif # test dosname -s
  endif # TRY_DOSNAME
endif # MKS

# We try to get references to what we need via the default component
#    environment variables, or what was used historically.

# Process Windows values into FullPath values, these paths may have \ chars

# System root
ifdef SYSTEMROOT
  xSYSTEMROOT  :="$(subst \,/,$(SYSTEMROOT))"
  _system_root :=$(call FullPath,$(xSYSTEMROOT))
else
  ifdef SystemRoot
     xSYSTEMROOT :="$(subst \,/,$(SystemRoot))"
    _system_root :=$(call FullPath,$(xSYSTEMROOT))
  else
    ifdef WINDIR
      xWINDIR      :="$(subst \,/,$(WINDIR))"
      _system_root :=$(call FullPath,$(xWINDIR))
    else
      ifdef windir
        xWINDIR      :="$(subst \,/,$(windir))"
        _system_root :=$(call FullPath,$(xWINDIR))
      endif
    endif
  endif
endif
_system_root:=$(call CheckValue,_system_root,$(_system_drive)/WINNT)

# Program Files directory
ifdef PROGRAMFILES
  xPROGRAMFILES      :="$(subst \,/,$(PROGRAMFILES))"
else
  ifeq ($(ARCH_DATA_MODEL), 32)
    xPROGRAMFILES    :="$(_system_drive)/Program Files"
  else
    xPROGRAMFILES    :="$(_system_drive)/Program Files (x86)"
  endif
endif
ifeq ($(ARCH_DATA_MODEL), 32)
  _program_files     :=$(call FullPath,$(xPROGRAMFILES))
  _program_files32   :=$(_program_files)
else
  ifdef PROGRAMW6432
    xPROGRAMW6432    :="$(subst \,/,$(PROGRAMW6432))"
  else
    xPROGRAMW6432    :="$(_system_drive)/Program Files"
  endif
  _program_files     :=$(call FullPath,$(xPROGRAMW6432))
  _program_files32   :=$(call FullPath,$(xPROGRAMFILES))
  ifneq ($(word 1,$(_program_files32)),$(_program_files32))
    _program_files32:=
  endif
endif
ifneq ($(word 1,$(_program_files)),$(_program_files))
  _program_files:=
endif

# DirectX SDK
ifdef ALT_DXSDK_DRIVE
  _dx_sdk_dir  =$(ALT_DXSDK_DRIVE):/DXSDK
else
  ifdef DXSDK_DIR
    xDXSDK_DIR  :="$(subst \,/,$(DXSDK_DIR))"
  else
    xDXSDK_DIR  :="$(_system_drive)/DXSDK"
  endif
  _dx_sdk_dir :=$(call FullPath,$(xDXSDK_DIR))
endif

# Use of the Visual Studio compilers requires certain env variables be set:
#   PATH should include the path to cl.exe
#   INCLUDE should be defined
#   LIB     should be defined
#   LIBPATH should be defined
#   VS100COMNTOOLS should be defined
#   WINDOWSSDKDIR should be defined
#     The 7.0a path is from VS2010 Pro, the 7.1 path is the standalone SDK.
#     For 64bit either will work for us.
#     If a developer chooses to install the standalone SDK in some other
#     location, then they need to set WINDOWSSDKDIR.
#
# Compilers for 64bit may be from the free SDK, or Visual Studio Professional.
#   The free Express compilers don't contain 64 bit compilers, which is why
#   you instead need the SDK.
#   Release enginering will use VS2010 Pro, so the frequency of testing of
#     SDK based builds will depend entirely on individual usage.

# We only need to do this once
ifndef VS2010_EXISTS
  # The 2 key paths we need are WINDOWSSDKDIR and VS100COMNTOOLS.
  #   If not defined try to see if default location exists.
  #   If defined make sure that the path has no spaces.
  #   Finally, export path with no spaces so logic minimizes FullPath calls.
  ifndef WINDOWSSDKDIR
    # The 7.0a SDK is the second choice.
    xWINDOWSSDKDIR :="$(_program_files32)/Microsoft SDKs/Windows/v7.0a/"
    fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
    # The 7.1 SDK is the second choice.
    ifeq ($(fWINDOWSSDKDIR),)
      xWINDOWSSDKDIR :="$(_program_files32)/Microsoft SDKs/Windows/v7.1/"
      fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
    endif
  else
    ifneq ($(word 2,$(WINDOWSSDKDIR)),)
      xWINDOWSSDKDIR :="$(subst \,/,$(WINDOWSSDKDIR))"
      fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
    else
      fWINDOWSSDKDIR :=$(WINDOWSSDKDIR)
    endif
  endif
  ifneq ($(fWINDOWSSDKDIR),)
    WINDOWSSDKDIR  :=$(fWINDOWSSDKDIR)/
  endif
  ifndef VS100COMNTOOLS
    xVS100COMNTOOLS :="$(_program_files32)/Microsoft Visual Studio 10.0/Common7/Tools/"
    fVS100COMNTOOLS :=$(call FullPath,$(xVS100COMNTOOLS))
  else
    xVS100COMNTOOLS :="$(subst \,/,$(VS100COMNTOOLS))"
    ifneq ($(word 2,$(VS100COMNTOOLS)),)
      fVS100COMNTOOLS :=$(call FullPath,$(xVS100COMNTOOLS))
    else
      fVS100COMNTOOLS :=$(xVS100COMNTOOLS)
    endif
  endif
  ifneq ($(fVS100COMNTOOLS),)
    VS100COMNTOOLS :=$(fVS100COMNTOOLS)/
  endif
  # Check to see that both exist
  ifeq ($(WINDOWSSDKDIR),)
    _vs2010_message := No WINDOWSSDKDIR found on system. $(_vs2010_message)
    VS2010_EXISTS   := false
  endif
  ifeq ($(VS100COMNTOOLS),)
    _vs2010_message := No VS100COMNTOOLS found on system. $(_vs2010_message)
    VS2010_EXISTS   := false
  endif
  ifeq ($(VS2010_EXISTS),false)
    x:=$(warning WARNING: No VS2010 available. $(_vs2010_message))
    VS100COMNTOOLS :=
    WINDOWSSDKDIR  :=
  else
    VS2010_EXISTS := true
    _msvc_dir     :=$(VS100COMNTOOLS)/../../Vc
  endif
  export VS2010_EXISTS
  export VS100COMNTOOLS
  export WINDOWSSDKDIR
endif

ifneq ($(VS2010_EXISTS),true)
  x:=$(error ERROR: No VS2010 found on system.)
endif 

# VS2010 Compiler root directory
_msvc_dir :=$(VS100COMNTOOLS)/../../Vc
# SDK root directory
_ms_sdk   :=$(WINDOWSSDKDIR)
# Compiler bin directory and redist directory
ifeq ($(ARCH_DATA_MODEL), 32)
  _compiler_bin :=$(_msvc_dir)/Bin
  _redist_sdk   :=$(call FullPath,$(_msvc_dir)/redist/x86/Microsoft.VC100.CRT)
endif
ifeq ($(ARCH_DATA_MODEL), 64)
  _compiler_bin :=$(_msvc_dir)/bin/amd64
  _redist_sdk   :=$(call FullPath,$(_msvc_dir)/redist/x64/Microsoft.VC100.CRT)
endif
ifeq ($(_redist_sdk),)
  _redist_sdk   :=$(_system_root)/system32
endif

# Location on system where jdk installs might be
ifneq ($(_program_files),)
  USRJDKINSTANCES_PATH =$(_program_files)/Java
else
  USRJDKINSTANCES_PATH =$(_system_drive)/
endif

# SLASH_JAVA: location of all network accessable files
# NOTE: Do not use FullPath on this because it's often a drive letter and
#       plain drive letters are ambiguous, so just use this 'as is'.
ifdef ALT_SLASH_JAVA
  xALT_SLASH_JAVA :="$(subst \,/,$(ALT_SLASH_JAVA))"
  SLASH_JAVA      :=$(xALT_SLASH_JAVA)
else
  ifdef ALT_JDK_JAVA_DRIVE
    SLASH_JAVA  =$(JDK_JAVA_DRIVE)
  else
    SLASH_JAVA  =J:
  endif
endif
SLASH_JAVA:=$(call AltCheckSpaces,SLASH_JAVA)
SLASH_JAVA:=$(call AltCheckValue,SLASH_JAVA)

# JDK_DEVTOOLS_DIR: common path for all the java devtools
ifdef ALT_JDK_DEVTOOLS_DIR
  xALT_JDK_DEVTOOLS_DIR :="$(subst \,/,$(ALT_JDK_DEVTOOLS_DIR))"
  JDK_DEVTOOLS_DIR      :=$(call FullPath,$(xALT_JDK_DEVTOOLS_DIR))
else
  JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools
endif
JDK_DEVTOOLS_DIR:=$(call AltCheckSpaces,JDK_DEVTOOLS_DIR)
JDK_DEVTOOLS_DIR:=$(call AltCheckValue,JDK_DEVTOOLS_DIR)

# COMPILER_PATH: path to where the compiler and tools are installed.
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifdef ALT_COMPILER_PATH
  xALT_COMPILER_PATH  :="$(subst \,/,$(ALT_COMPILER_PATH))"
  fxALT_COMPILER_PATH :=$(call FullPath,$(xALT_COMPILER_PATH))
  COMPILER_PATH       :=$(call PrefixPath,$(fxALT_COMPILER_PATH))
else
  COMPILER_PATH :=$(call PrefixPath,$(_compiler_bin))
endif
COMPILER_PATH :=$(call AltCheckSpaces,COMPILER_PATH)

# MSDEVTOOLS_PATH: path to where the additional MS Compiler tools are.
#  NOTE: Must end with / so that it could be empty, allowing PATH usage.
ifdef ALT_MSDEVTOOLS_PATH
  xALT_MSDEVTOOLS_PATH  :="$(subst \,/,$(ALT_MSDEVTOOLS_PATH))"
  fxALT_MSDEVTOOLS_PATH :=$(call FullPath,$(xALT_MSDEVTOOLS_PATH))
  MSDEVTOOLS_PATH       :=$(call PrefixPath,$(fxALT_MSDEVTOOLS_PATH))
else
  ifeq ($(ARCH_DATA_MODEL), 64)
    ifdef MSTOOLS
      xMSTOOLS  :="$(subst \,/,$(MSTOOLS))"
      _ms_tools :=$(call FullPath,$(xMSTOOLS))
    else
      ifdef Mstools
        xMSTOOLS  :="$(subst \,/,$(Mstools))"
        _ms_tools :=$(call FullPath,$(xMSTOOLS))
      else
        _ms_tools :=
      endif
    endif
    ifneq ($(_ms_tools),)
      _ms_tools_bin :=$(_ms_tools)/Bin
    else
      # Assumes compiler bin is .../Bin/win64/x86/AMD64, rc.exe is 3 levels up
      _ms_tools_bin :=$(_compiler_bin)/../../..
    endif
  else
    _ms_tools_bin :=$(_compiler_bin)
  endif
  MSDEVTOOLS_PATH :=$(call PrefixPath,$(_ms_tools_bin))
endif
MSDEVTOOLS_PATH:=$(call AltCheckSpaces,MSDEVTOOLS_PATH)

# 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.
ifdef ALT_DEVTOOLS_PATH
  xALT_DEVTOOLS_PATH  :="$(subst \,/,$(ALT_DEVTOOLS_PATH))"
  fxALT_DEVTOOLS_PATH :=$(call FullPath,$(xALT_DEVTOOLS_PATH))
  DEVTOOLS_PATH       :=$(call PrefixPath,$(fxALT_DEVTOOLS_PATH))
else
  ifdef USING_CYGWIN
    DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH)
  else
    ifdef USING_MSYS
      DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH)
    else
      xDEVTOOLS_PATH  :="$(_system_drive)/utils"
      fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH))
      DEVTOOLS_PATH  :=$(call PrefixPath,$(fxDEVTOOLS_PATH))
    endif # USING_MSYS
  endif # USING_CYGWIN
endif
DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH)

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

# Everybody needs the MSVCRNN runtime starting with VS2010
_NEEDS_MSVCRNN = true

ifeq ($(_NEEDS_MSVCRNN), true)
  # MSVCRNN_DLL_PATH: location of msvcrnn.dll that will be re-distributed
  ifdef ALT_MSVCRNN_DLL_PATH
    xALT_MSVCRNN_DLL_PATH :="$(subst \,/,$(ALT_MSVCRNN_DLL_PATH))"
    MSVCRNN_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRNN_DLL_PATH))
  else
    MSVCRNN_DLL_PATH :=$(_redist_sdk)
  endif
  MSVCRNN_DLL_PATH :=$(call AltCheckSpaces,MSVCRNN_DLL_PATH)
  MSVCRNN_DLL_PATH:=$(call AltCheckValue,MSVCRNN_DLL_PATH)
endif

# DXSDK_PATH: path to Microsoft DirectX SDK Include and Lib
ifdef ALT_DXSDK_PATH
  xALT_DXSDK_PATH :="$(subst \,/,$(ALT_DXSDK_PATH))"
  DXSDK_PATH      :=$(call FullPath,$(xALT_DXSDK_PATH))
else
  _DXSDK_PATH1 :=$(_dx_sdk_dir)
  _DXSDK_PATH2 :=$(JDK_DEVTOOLS_DIR)/windows/dxsdk
  DXSDK_PATH  :=$(call DirExists,$(_DXSDK_PATH1),$(_DXSDK_PATH2),$(_dx_sdk_dir))
endif
DXSDK_PATH :=$(call AltCheckSpaces,DXSDK_PATH)
DXSDK_PATH:=$(call AltCheckValue,DXSDK_PATH)

# DXSDK_INCLUDE_PATH: path to Microsoft DirectX SDK Include
ifdef ALT_DXSDK_INCLUDE_PATH
  xALT_DXSDK_INCLUDE_PATH :="$(subst \,/,$(ALT_DXSDK_INCLUDE_PATH))"
  DXSDK_INCLUDE_PATH      :=$(call FullPath,$(xALT_DXSDK_INCLUDE_PATH))
else
  DXSDK_INCLUDE_PATH =$(subst //,/,$(DXSDK_PATH)/Include)
endif

# DXSDK_LIB_PATH: path to Microsoft DirectX SDK Lib
ifdef ALT_DXSDK_LIB_PATH
  xALT_DXSDK_LIB_PATH :="$(subst \,/,$(ALT_DXSDK_LIB_PATH))"
  DXSDK_LIB_PATH      :=$(call FullPath,$(xALT_DXSDK_LIB_PATH))
else
  ifeq ($(ARCH_DATA_MODEL), 64)
    # 64bit libs are located in "Lib/x64" subdir
    DXSDK_LIB_PATH =$(subst //,/,$(DXSDK_PATH)/Lib/x64)
  else
    DXSDK_LIB_PATH =$(subst //,/,$(DXSDK_PATH)/Lib)
  endif
endif

# DEPLOY_MSSDK: Microsoft SDK for this platform (for deploy)
ifdef ALT_DEPLOY_MSSDK
  xALT_DEPLOY_MSSDK :="$(subst \,/,$(ALT_DEPLOY_MSSDK))"
  DEPLOY_MSSDK      :=$(call FullPath,$(xALT_DEPLOY_MSSDK))
else
  DEPLOY_MSSDK      :=$(_ms_sdk)
endif
DEPLOY_MSSDK:=$(call AltCheckSpaces,DEPLOY_MSSDK)

# INSTALL_MSSDK: Microsoft Installer SDK for this platform (for install)
ifdef ALT_INSTALL_MSSDK
  xALT_INSTALL_MSSDK :="$(subst \,/,$(ALT_INSTALL_MSSDK))"
  INSTALL_MSSDK      :=$(call FullPath,$(xALT_INSTALL_MSSDK))
else
  INSTALL_MSSDK      :=$(_ms_sdk)
endif
INSTALL_MSSDK:=$(call AltCheckSpaces,INSTALL_MSSDK)

# WSCRIPT: path to wscript.exe (used in creating install bundles)
ifdef ALT_WSCRIPT
  xALT_WSCRIPT :="$(subst \,/,$(ALT_WSCRIPT))"
  WSCRIPT  =$(xALT_WSCRIPT)
else
  _WSCRIPT1 :=$(_system_root)/system32/wscript.exe
  _WSCRIPT2 :=$(DEVTOOLS_PATH)wscript.exe
  WSCRIPT  :=$(call FileExists,$(_WSCRIPT1),$(_WSCRIPT2))
endif
WSCRIPT:=$(call AltCheckSpaces,WSCRIPT)
# batch mode no modal dialogs on errors, please.
WSCRIPT += -B

# CSCRIPT: path to cscript.exe (used in creating install bundles)
ifdef ALT_CSCRIPT
  xALT_CSCRIPT :="$(subst \,/,$(ALT_CSCRIPT))"
  CSCRIPT  =$(xALT_CSCRIPT)
else
  _CSCRIPT1 :=$(_system_root)/system32/cscript.exe
  _CSCRIPT2 :=$(DEVTOOLS_PATH)cscript.exe
  CSCRIPT  :=$(call FileExists,$(_CSCRIPT1),$(_CSCRIPT2))
endif
CSCRIPT:=$(call AltCheckSpaces,CSCRIPT)

# CABARC: path to cabarc.exe (used in creating install bundles)
ifdef ALT_CABARC
  xALT_CABARC :="$(subst \,/,$(ALT_CABARC))"
  CABARC  =$(xALT_CABARC)
else
  _CABARC1 :=$(_system_root)/system32/cabarc.exe
  _CABARC2 :=$(DEVTOOLS_PATH)cabarc.exe
  CABARC  :=$(call FileExists,$(_CABARC1),$(_CABARC2))
endif
CABARC:=$(call AltCheckSpaces,CABARC)

# MSICERT: path to msicert.exe (used in creating install bundles)
ifdef ALT_MSICERT
  xALT_MSICERT :="$(subst \,/,$(ALT_MSICERT))"
  MSICERT  =$(xALT_MSICERT)
else
  _MSICERT1 :=$(INSTALL_MSSDK)/Bin/msicert.exe
  _MSICERT2 :=$(DEVTOOLS_PATH)msicert.exe
  MSICERT   :=$(call FileExists,$(_MSICERT1),$(_MSICERT2))
endif
MSICERT:=$(call AltCheckSpaces,MSICERT)

# 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 AltCheckSpaces,BUILD_JDK_IMPORT_PATH)
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 AltCheckSpaces,JDK_IMPORT_PATH)
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
  # Default locations include the current $OUTPUTDIR, RE Promotions,
  # and a JDK.  Please be aware the JDK does not include a Kernel VM.
  _HOTSPOT_IMPORT_PATH1 = $(OUTPUTDIR)/hotspot/import
  _HOTSPOT_IMPORT_PATH2 = $(PROMOTED_BUILD_DISTDIR)/hotspot/import
  _HOTSPOT_IMPORT_PATH3 = $(JDK_IMPORT_PATH)
   HOTSPOT_IMPORT_PATH := $(call DirExists,$(_HOTSPOT_IMPORT_PATH1),$(_HOTSPOT_IMPORT_PATH2),$(_HOTSPOT_IMPORT_PATH3))
endif
HOTSPOT_IMPORT_PATH:=$(call AltCheckSpaces,HOTSPOT_IMPORT_PATH)
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 AltCheckSpaces,HOTSPOT_CLIENT_PATH)
  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 AltCheckSpaces,HOTSPOT_SERVER_PATH)
HOTSPOT_SERVER_PATH:=$(call AltCheckValue,HOTSPOT_SERVER_PATH)

# HOTSPOT_LIB_PATH: location of jvm.lib file.
ifdef ALT_HOTSPOT_LIB_PATH
  xALT_HOTSPOT_LIB_PATH :="$(subst \,/,$(ALT_HOTSPOT_LIB_PATH))"
  HOTSPOT_LIB_PATH      :=$(call FullPath,$(xALT_HOTSPOT_LIB_PATH))
else
  HOTSPOT_LIB_PATH  =$(HOTSPOT_IMPORT_PATH)/lib
endif
HOTSPOT_LIB_PATH:=$(call AltCheckSpaces,HOTSPOT_LIB_PATH)
HOTSPOT_LIB_PATH:=$(call AltCheckValue,HOTSPOT_LIB_PATH)

# Special define for checking the binaries

# All windows dll and exe files should have been built with -NXCOMPAT
#   and be setup for dynamic base addresses.
#   In addition, we should not be dependent on certain dll files that
#   we do not or cannot redistribute.

# List of filenames we should NOT be dependent on
ifeq ($(MFC_DEBUG),true)
  BANNED_DLLS=msvcp100[.]dll
else
  BANNED_DLLS=msvcp100[.]dll|msvcr100d[.]dll|msvcrtd[.]dll
endif

# Check for -safeseh (only used on 32bit)
define binary_file_safeseh_verification # binary_file
( \
  $(ECHO) "Checking for -SAFESEH usage in: $1" && \
  if [ "`$(DUMPBIN) -loadconfig $1 | $(EGREP) -i 'Safe Exception Handler Table'`" = "" ] ; then \
    $(ECHO) "ERROR: Did not find 'Safe Exception Handler Table' in loadconfig: $1" ; \
    $(DUMPBIN) -loadconfig $1 ; \
    exit 6 ; \
  fi ; \
)
endef

# Check for -NXCOMPAT usage
define binary_file_nxcompat_verification # binary_file
( \
  $(ECHO) "Checking for -NXCOMPAT usage in: $1" && \
  if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \
    $(ECHO) "ERROR: Did not find 'NX compatible' in headers: $1" ; \
    $(DUMPBIN) -headers $1 ; \
    exit 7 ; \
  fi ; \
)
endef

# Check for -DYNAMICBASE usage
define binary_file_dynamicbase_verification # binary_file
( \
  $(ECHO) "Checking for -DYNAMICBASE usage in: $1" && \
  if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \
    $(ECHO) "ERROR: Did not find 'Dynamic base' in headers: $1" ; \
    $(DUMPBIN) -headers $1 ; \
    exit 8 ; \
  fi ; \
)
endef

# Check for banned dll usage
define binary_file_dll_verification # binary_file
( \
  $(ECHO) "Checking for banned dependencies in: $1" && \
  if [ "`$(DUMPBIN) -dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \
    $(ECHO) "ERROR: Found use of $(BANNED_DLLS)"; \
    $(DUMPBIN) -dependents $1 ; \
    exit 9 ; \
  fi ; \
)
endef

# Macro to check it's input file for properly built executables.
#   Relies on process exit code. Different for 32bit vs 64bit.
ifeq ($(ARCH_DATA_MODEL),32)
define binary_file_verification # binary_file
( \
  $(call binary_file_safeseh_verification,$1); \
  $(call binary_file_nxcompat_verification,$1); \
  $(call binary_file_dynamicbase_verification,$1); \
  $(call binary_file_dll_verification,$1); \
)
endef
else
define binary_file_verification # binary_file
( \
  $(call binary_file_nxcompat_verification,$1); \
  $(call binary_file_dynamicbase_verification,$1); \
  $(call binary_file_dll_verification,$1); \
)
endef
endif

