1 #
   2 # Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.  Oracle designates this
   8 # particular file as subject to the "Classpath" exception as provided
   9 # by Oracle in the LICENSE file that accompanied this code.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 #
  27 # Definitions for Windows.
  28 #
  29 
  30 # Default for COMPILER_WARNINGS_FATAL on Windows (C++ compiler warnings)
  31 #    Level: Default is 3, 0 means none, 4 is the most but may be unreliable
  32 #    Some makefiles may have set this to 0 to turn off warnings completely,
  33 #    which also effectively creates a COMPILER_WARNINGS_FATAL=false situation.
  34 #    Program.gmk may turn this down to 2 (building .exe's).
  35 #    Windows 64bit platforms are less likely to be warning free.
  36 #    Historically, Windows 32bit builds should be mostly warning free.
  37 #    VS2010 introduced a large number of security warnings that are off by
  38 #    default but will be turned back on with SHOW_ALL_WARNINGS=true.
  39 ifndef COMPILER_WARNING_LEVEL
  40   COMPILER_WARNING_LEVEL=3
  41 endif
  42 ifndef COMPILER_WARNINGS_FATAL
  43   COMPILER_WARNINGS_FATAL=false
  44 endif
  45 ifndef SHOW_ALL_WARNINGS
  46   SHOW_ALL_WARNINGS = false
  47 endif
  48 
  49 # Windows should use parallel compilation for best build times
  50 ifndef COMPILE_APPROACH
  51   COMPILE_APPROACH = normal
  52 endif
  53 
  54 # Indication that we are doing an incremental build.
  55 #    This may trigger the creation of make depend files.
  56 #    (This may not be working on windows yet, always force to false.)
  57 override INCREMENTAL_BUILD = false
  58 
  59 # WARNING: This is extremely touch stuff, between CYGWIN vs. MKS and all
  60 #          variations of MKS and CYGWIN releases, and 32bit vs 64bit,
  61 #          this file can give you nightmares.
  62 #
  63 # Notes:
  64 #   Keep all paths in the windows "mixed" style except CYGWIN UNXIXCOMMAND_PATH.
  65 #   Use of PrefixPath is critical, some variables must end with / (see NOTE).
  66 #   Use of quotes is critical due to possible spaces in paths coming from
  67 #     the environment variables, be careful.
  68 #   First convert \ to / with subst, keep it quoted due to blanks, then
  69 #     use cygpath -s or dosname -s to get the short non-blank name.
  70 #   If the MKS is old and doesn't have a dosname -s, you will be forced
  71 #     to set ALT variables with the short non-space directory names.
  72 #     If dosname doesn't appear to work, we won't use it.
  73 #     The dosname utility also wants to accept stdin if it is not supplied
  74 #     any path on the command line, this is really dangerous when using
  75 #     make variables that can easily become empty, so I use:
  76 #        echo $1 | dosname -s     instead of    dosname -s $1
  77 #     to prevent dosname from hanging up the make process when $1 is empty.
  78 #     The cygpath utility does not have this problem.
  79 #   The ALT values should never really have spaces or use \.
  80 #   Suspect these environment variables to have spaces and/or \ characters:
  81 #     SYSTEMROOT, SystemRoot, WINDIR, windir, PROGRAMFILES, ProgramFiles,
  82 #     DXSDK_DIR, MSTOOLS, Mstools, MSSDK, MSSdk, VCnnCOMNTOOLS, 
  83 #     MSVCDIR, MSVCDir.
  84 #     So use $(subst \,/,) on them first adding quotes and placing them in
  85 #         their own variable assigned with :=, then use FullPath.
  86 #
  87 
  88 ifdef USING_CYGWIN
  89 # Macro to effectively do a toupper without an exec
  90 define ToUpper
  91 $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,\
  92 $(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,\
  93 $(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,\
  94 $(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,\
  95 $(subst y,Y,$(subst z,Z,$1))))))))))))))))))))))))))
  96 endef
  97 # All possible drive letters
  98 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
  99 # Convert /cygdrive/ paths to the mixed style without an exec of cygpath
 100 #   Must be a path with no spaces. /cygdrive/letter is always lowercase
 101 #   and letter:/ is always uppercase coming from cygpath.
 102 define MixedPath
 103 $(patsubst /%,$(CYGWIN_HOME)/%,$(sort $(filter-out /cygdrive/%,$(foreach drive,$(drives),$(patsubst /cygdrive/$(drive)/%,$(call ToUpper,$(drive)):/%,$1)))))
 104 endef
 105 # Use FullPath to get C:/ style non-spaces path. Never ends with a /!
 106 # We assume cygpath is available in the search path
 107 #    NOTE: Use of 'pwd' with CYGWIN will not get you a mixed style path!
 108 define FullPath
 109 $(if $(word 2,$1),$(shell $(CYGPATH_CMD) $1 2> $(DEV_NULL)),$(call MixedPath,$(realpath $(subst ",,$1))))
 110 endef
 111 define OptFullPath
 112 $(shell if [ "$1" != "" -a -d "$1" ]; then $(CYGPATH_CMD) "$1" 2> $(DEV_NULL); else echo "$1"; fi)
 113 endef
 114 else
 115 ifdef USING_MSYS
 116 DOSPATH_CMD:=$(shell cd $(JDK_TOPDIR) 2> $(DEV_NULL) && pwd)/make/tools/msys_build_scripts/dospath.sh
 117 define FullPath
 118 $(subst \,/,$(shell $(DOSPATH_CMD) $1))
 119 endef
 120 define OptFullPath
 121 $(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi)
 122 endef
 123 else
 124 # Temporary until we upgrade to MKS 8.7, MKS pwd returns mixed mode path
 125 define FullPath
 126 $(shell cd $1 2> $(DEV_NULL) && pwd)
 127 endef
 128 define OptFullPath
 129 $(shell if [ "$1" != "" -a -d "$1" ]; then (cd $1 && pwd); else echo "$1"; fi)
 130 endef
 131 endif
 132 endif
 133 
 134 # System drive
 135 ifdef SYSTEMDRIVE
 136   _system_drive =$(SYSTEMDRIVE)
 137 else
 138   ifdef SystemDrive
 139     _system_drive =$(SystemDrive)
 140   endif
 141 endif
 142 _system_drive:=$(call CheckValue,_system_drive,C:)
 143 
 144 # UNIXCOMMAND_PATH: path to where the most common Unix commands are.
 145 #  NOTE: Must end with / so that it could be empty, allowing PATH usage.
 146 #        With cygwin, just use this as is don't use FullPath on it.
 147 ifdef ALT_UNIXCOMMAND_PATH
 148   ifdef USING_CYGWIN
 149     UNIXCOMMAND_PATH       :=$(call PrefixPath,$(ALT_UNIXCOMMAND_PATH))
 150   else
 151     xALT_UNIXCOMMAND_PATH  :="$(subst \,/,$(ALT_UNIXCOMMAND_PATH))"
 152     fxALT_UNIXCOMMAND_PATH :=$(call FullPath,$(xALT_UNIXCOMMAND_PATH))
 153     UNIXCOMMAND_PATH       :=$(call PrefixPath,$(fxALT_UNIXCOMMAND_PATH))
 154   endif
 155 else
 156   ifdef USING_CYGWIN
 157     UNIXCOMMAND_PATH :=$(call PrefixPath,/usr/bin)
 158   else
 159     ifdef USING_MSYS
 160       UNIXCOMMAND_PATH :=$(call PrefixPath,/bin)
 161     else
 162       ifdef ROOTDIR
 163         xROOTDIR :="$(subst \,/,$(ROOTDIR))"
 164         _rootdir :=$(call FullPath,$(xROOTDIR))
 165       else
 166         xROOTDIR :="$(_system_drive)/mksnt"
 167         _rootdir :=$(call FullPath,$(xROOTDIR))
 168       endif
 169       ifneq ($(_rootdir),)
 170         UNIXCOMMAND_PATH :=$(call PrefixPath,$(_rootdir)/mksnt)
 171       endif
 172     endif # USING_MSYS
 173   endif # USING_CYGWIN
 174 endif
 175 UNIXCOMMAND_PATH:=$(call AltCheckSpaces,UNIXCOMMAND_PATH)
 176 
 177 # Get version of MKS or CYGWIN
 178 ifdef USING_MKS
 179   _MKS_VER :=$(shell $(MKSINFO) 2>&1 | $(GREP) Release | $(TAIL) -1 | $(SED) -e 's@.*\(Release.*\)@\1@')
 180   MKS_VER  :=$(call GetVersion,$(_MKS_VER))
 181   # At this point, we can re-define FullPath to use DOSNAME_CMD
 182   CHECK_MKS87:=$(call CheckVersions,$(MKS_VER),8.7)
 183   TRY_DOSNAME:=false
 184   ifeq ($(CHECK_MKS87),same)
 185     TRY_DOSNAME:=true
 186   endif
 187   # Newer should be ok
 188   ifeq ($(CHECK_MKS87),newer)
 189     TRY_DOSNAME:=true
 190   endif
 191   ifeq ($(TRY_DOSNAME),true)
 192     ifeq ($(shell $(UNIXCOMMAND_PATH)dosname -s $(_system_drive)/ 2> $(DEV_NULL)),$(_system_drive)/)
 193       _DOSNAME=$(UNIXCOMMAND_PATH)dosname
 194       DOSNAME_CMD:=$(_DOSNAME) -s
 195 define FullPath
 196 $(subst //,/,$(shell echo $1 | $(DOSNAME_CMD) 2> $(DEV_NULL)))
 197 endef
 198     endif # test dosname -s
 199   endif # TRY_DOSNAME
 200 endif # MKS
 201 
 202 # We try to get references to what we need via the default component
 203 #    environment variables, or what was used historically.
 204 
 205 # Process Windows values into FullPath values, these paths may have \ chars
 206 
 207 # System root
 208 ifdef SYSTEMROOT
 209   xSYSTEMROOT  :="$(subst \,/,$(SYSTEMROOT))"
 210   _system_root :=$(call FullPath,$(xSYSTEMROOT))
 211 else
 212   ifdef SystemRoot
 213      xSYSTEMROOT :="$(subst \,/,$(SystemRoot))"
 214     _system_root :=$(call FullPath,$(xSYSTEMROOT))
 215   else
 216     ifdef WINDIR
 217       xWINDIR      :="$(subst \,/,$(WINDIR))"
 218       _system_root :=$(call FullPath,$(xWINDIR))
 219     else
 220       ifdef windir
 221         xWINDIR      :="$(subst \,/,$(windir))"
 222         _system_root :=$(call FullPath,$(xWINDIR))
 223       endif
 224     endif
 225   endif
 226 endif
 227 _system_root:=$(call CheckValue,_system_root,$(_system_drive)/WINNT)
 228 
 229 # Program Files directory
 230 ifdef PROGRAMFILES
 231   xPROGRAMFILES      :="$(subst \,/,$(PROGRAMFILES))"
 232 else
 233   ifeq ($(ARCH_DATA_MODEL), 32)
 234     xPROGRAMFILES    :="$(_system_drive)/Program Files"
 235   else
 236     xPROGRAMFILES    :="$(_system_drive)/Program Files (x86)"
 237   endif
 238 endif
 239 ifeq ($(ARCH_DATA_MODEL), 32)
 240   _program_files     :=$(call FullPath,$(xPROGRAMFILES))
 241   _program_files32   :=$(_program_files)
 242 else
 243   ifdef PROGRAMW6432
 244     xPROGRAMW6432    :="$(subst \,/,$(PROGRAMW6432))"
 245   else
 246     xPROGRAMW6432    :="$(_system_drive)/Program Files"
 247   endif
 248   _program_files     :=$(call FullPath,$(xPROGRAMW6432))
 249   _program_files32   :=$(call FullPath,$(xPROGRAMFILES))
 250   ifneq ($(word 1,$(_program_files32)),$(_program_files32))
 251     _program_files32:=
 252   endif
 253 endif
 254 ifneq ($(word 1,$(_program_files)),$(_program_files))
 255   _program_files:=
 256 endif
 257 
 258 # DirectX SDK
 259 ifdef ALT_DXSDK_DRIVE
 260   _dx_sdk_dir  =$(ALT_DXSDK_DRIVE):/DXSDK
 261 else
 262   ifdef DXSDK_DIR
 263     xDXSDK_DIR  :="$(subst \,/,$(DXSDK_DIR))"
 264   else
 265     xDXSDK_DIR  :="$(_system_drive)/DXSDK"
 266   endif
 267   _dx_sdk_dir :=$(call FullPath,$(xDXSDK_DIR))
 268 endif
 269 
 270 # Use of the Visual Studio compilers requires certain env variables be set:
 271 #   PATH should include the path to cl.exe
 272 #   INCLUDE should be defined
 273 #   LIB     should be defined
 274 #   LIBPATH should be defined
 275 #   VS100COMNTOOLS should be defined
 276 #   WINDOWSSDKDIR should be defined
 277 #     The 7.0a path is from VS2010 Pro, the 7.1 path is the standalone SDK.
 278 #     For 64bit either will work for us.
 279 #     If a developer chooses to install the standalone SDK in some other
 280 #     location, then they need to set WINDOWSSDKDIR.
 281 #
 282 # Compilers for 64bit may be from the free SDK, or Visual Studio Professional.
 283 #   The free Express compilers don't contain 64 bit compilers, which is why
 284 #   you instead need the SDK.
 285 #   Release enginering will use VS2010 Pro, so the frequency of testing of
 286 #     SDK based builds will depend entirely on individual usage.
 287 
 288 # We only need to do this once
 289 ifndef VS2010_EXISTS
 290   # The 2 key paths we need are WINDOWSSDKDIR and VS100COMNTOOLS.
 291   #   If not defined try to see if default location exists.
 292   #   If defined make sure that the path has no spaces.
 293   #   Finally, export path with no spaces so logic minimizes FullPath calls.
 294   ifndef WINDOWSSDKDIR
 295     # The 7.0a SDK is the second choice.
 296     xWINDOWSSDKDIR :="$(_program_files32)/Microsoft SDKs/Windows/v7.0a/"
 297     fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
 298     # The 7.1 SDK is the second choice.
 299     ifeq ($(fWINDOWSSDKDIR),)
 300       xWINDOWSSDKDIR :="$(_program_files32)/Microsoft SDKs/Windows/v7.1/"
 301       fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
 302     endif
 303   else
 304     ifneq ($(word 2,$(WINDOWSSDKDIR)),)
 305       xWINDOWSSDKDIR :="$(subst \,/,$(WINDOWSSDKDIR))"
 306       fWINDOWSSDKDIR :=$(call FullPath,$(xWINDOWSSDKDIR))
 307     else
 308       fWINDOWSSDKDIR :=$(WINDOWSSDKDIR)
 309     endif
 310   endif
 311   ifneq ($(fWINDOWSSDKDIR),)
 312     WINDOWSSDKDIR  :=$(fWINDOWSSDKDIR)/
 313   endif
 314   ifndef VS100COMNTOOLS
 315     xVS100COMNTOOLS :="$(_program_files32)/Microsoft Visual Studio 10.0/Common7/Tools/"
 316     fVS100COMNTOOLS :=$(call FullPath,$(xVS100COMNTOOLS))
 317   else
 318     xVS100COMNTOOLS :="$(subst \,/,$(VS100COMNTOOLS))"
 319     ifneq ($(word 2,$(VS100COMNTOOLS)),)
 320       fVS100COMNTOOLS :=$(call FullPath,$(xVS100COMNTOOLS))
 321     else
 322       fVS100COMNTOOLS :=$(xVS100COMNTOOLS)
 323     endif
 324   endif
 325   ifneq ($(fVS100COMNTOOLS),)
 326     VS100COMNTOOLS :=$(fVS100COMNTOOLS)/
 327   endif
 328   # Check to see that both exist
 329   ifeq ($(WINDOWSSDKDIR),)
 330     _vs2010_message := No WINDOWSSDKDIR found on system. $(_vs2010_message)
 331     VS2010_EXISTS   := false
 332   endif
 333   ifeq ($(VS100COMNTOOLS),)
 334     _vs2010_message := No VS100COMNTOOLS found on system. $(_vs2010_message)
 335     VS2010_EXISTS   := false
 336   endif
 337   ifeq ($(VS2010_EXISTS),false)
 338     x:=$(warning WARNING: No VS2010 available. $(_vs2010_message))
 339     VS100COMNTOOLS :=
 340     WINDOWSSDKDIR  :=
 341   else
 342     VS2010_EXISTS := true
 343     _msvc_dir     :=$(VS100COMNTOOLS)/../../Vc
 344   endif
 345   export VS2010_EXISTS
 346   export VS100COMNTOOLS
 347   export WINDOWSSDKDIR
 348 endif
 349 
 350 ifneq ($(VS2010_EXISTS),true)
 351   x:=$(error ERROR: No VS2010 found on system.)
 352 endif 
 353 
 354 # VS2010 Compiler root directory
 355 _msvc_dir :=$(VS100COMNTOOLS)/../../Vc
 356 # SDK root directory
 357 _ms_sdk   :=$(WINDOWSSDKDIR)
 358 # Compiler bin directory and redist directory
 359 ifeq ($(ARCH_DATA_MODEL), 32)
 360   _compiler_bin :=$(_msvc_dir)/Bin
 361   _redist_sdk   :=$(call FullPath,$(_msvc_dir)/redist/x86/Microsoft.VC100.CRT)
 362 endif
 363 ifeq ($(ARCH_DATA_MODEL), 64)
 364   _compiler_bin :=$(_msvc_dir)/bin/amd64
 365   _redist_sdk   :=$(call FullPath,$(_msvc_dir)/redist/x64/Microsoft.VC100.CRT)
 366 endif
 367 ifeq ($(_redist_sdk),)
 368   _redist_sdk   :=$(_system_root)/system32
 369 endif
 370 
 371 # Location on system where jdk installs might be
 372 ifneq ($(_program_files),)
 373   USRJDKINSTANCES_PATH =$(_program_files)/Java
 374 else
 375   USRJDKINSTANCES_PATH =$(_system_drive)/
 376 endif
 377 
 378 # SLASH_JAVA: location of all network accessable files
 379 # NOTE: Do not use FullPath on this because it's often a drive letter and
 380 #       plain drive letters are ambiguous, so just use this 'as is'.
 381 ifdef ALT_SLASH_JAVA
 382   xALT_SLASH_JAVA :="$(subst \,/,$(ALT_SLASH_JAVA))"
 383   SLASH_JAVA      :=$(xALT_SLASH_JAVA)
 384 else
 385   ifdef ALT_JDK_JAVA_DRIVE
 386     SLASH_JAVA  =$(JDK_JAVA_DRIVE)
 387   else
 388     SLASH_JAVA  =J:
 389   endif
 390 endif
 391 SLASH_JAVA:=$(call AltCheckSpaces,SLASH_JAVA)
 392 SLASH_JAVA:=$(call AltCheckValue,SLASH_JAVA)
 393 
 394 # JDK_DEVTOOLS_DIR: common path for all the java devtools
 395 ifdef ALT_JDK_DEVTOOLS_DIR
 396   xALT_JDK_DEVTOOLS_DIR :="$(subst \,/,$(ALT_JDK_DEVTOOLS_DIR))"
 397   JDK_DEVTOOLS_DIR      :=$(call FullPath,$(xALT_JDK_DEVTOOLS_DIR))
 398 else
 399   JDK_DEVTOOLS_DIR =$(SLASH_JAVA)/devtools
 400 endif
 401 JDK_DEVTOOLS_DIR:=$(call AltCheckSpaces,JDK_DEVTOOLS_DIR)
 402 JDK_DEVTOOLS_DIR:=$(call AltCheckValue,JDK_DEVTOOLS_DIR)
 403 
 404 # COMPILER_PATH: path to where the compiler and tools are installed.
 405 #  NOTE: Must end with / so that it could be empty, allowing PATH usage.
 406 ifdef ALT_COMPILER_PATH
 407   xALT_COMPILER_PATH  :="$(subst \,/,$(ALT_COMPILER_PATH))"
 408   fxALT_COMPILER_PATH :=$(call FullPath,$(xALT_COMPILER_PATH))
 409   COMPILER_PATH       :=$(call PrefixPath,$(fxALT_COMPILER_PATH))
 410 else
 411   COMPILER_PATH :=$(call PrefixPath,$(_compiler_bin))
 412 endif
 413 COMPILER_PATH :=$(call AltCheckSpaces,COMPILER_PATH)
 414 
 415 # MSDEVTOOLS_PATH: path to where the additional MS Compiler tools are.
 416 #  NOTE: Must end with / so that it could be empty, allowing PATH usage.
 417 ifdef ALT_MSDEVTOOLS_PATH
 418   xALT_MSDEVTOOLS_PATH  :="$(subst \,/,$(ALT_MSDEVTOOLS_PATH))"
 419   fxALT_MSDEVTOOLS_PATH :=$(call FullPath,$(xALT_MSDEVTOOLS_PATH))
 420   MSDEVTOOLS_PATH       :=$(call PrefixPath,$(fxALT_MSDEVTOOLS_PATH))
 421 else
 422   ifeq ($(ARCH_DATA_MODEL), 64)
 423     ifdef MSTOOLS
 424       xMSTOOLS  :="$(subst \,/,$(MSTOOLS))"
 425       _ms_tools :=$(call FullPath,$(xMSTOOLS))
 426     else
 427       ifdef Mstools
 428         xMSTOOLS  :="$(subst \,/,$(Mstools))"
 429         _ms_tools :=$(call FullPath,$(xMSTOOLS))
 430       else
 431         _ms_tools :=
 432       endif
 433     endif
 434     ifneq ($(_ms_tools),)
 435       _ms_tools_bin :=$(_ms_tools)/Bin
 436     else
 437       # Assumes compiler bin is .../Bin/win64/x86/AMD64, rc.exe is 3 levels up
 438       _ms_tools_bin :=$(_compiler_bin)/../../..
 439     endif
 440   else
 441     _ms_tools_bin :=$(_compiler_bin)
 442   endif
 443   MSDEVTOOLS_PATH :=$(call PrefixPath,$(_ms_tools_bin))
 444 endif
 445 MSDEVTOOLS_PATH:=$(call AltCheckSpaces,MSDEVTOOLS_PATH)
 446 
 447 # DEVTOOLS_PATH: for other tools required for building (such as zip, etc.)
 448 #  NOTE: Must end with / so that it could be empty, allowing PATH usage.
 449 ifdef ALT_DEVTOOLS_PATH
 450   xALT_DEVTOOLS_PATH  :="$(subst \,/,$(ALT_DEVTOOLS_PATH))"
 451   fxALT_DEVTOOLS_PATH :=$(call FullPath,$(xALT_DEVTOOLS_PATH))
 452   DEVTOOLS_PATH       :=$(call PrefixPath,$(fxALT_DEVTOOLS_PATH))
 453 else
 454   ifdef USING_CYGWIN
 455     DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH)
 456   else
 457     ifdef USING_MSYS
 458       DEVTOOLS_PATH :=$(UNIXCOMMAND_PATH)
 459     else
 460       xDEVTOOLS_PATH  :="$(_system_drive)/utils"
 461       fxDEVTOOLS_PATH :=$(call FullPath,$(xDEVTOOLS_PATH))
 462       DEVTOOLS_PATH  :=$(call PrefixPath,$(fxDEVTOOLS_PATH))
 463     endif # USING_MSYS
 464   endif # USING_CYGWIN
 465 endif
 466 DEVTOOLS_PATH:=$(call AltCheckSpaces,DEVTOOLS_PATH)
 467 
 468 # _BOOTDIR1: First choice for a Bootstrap JDK, previous released JDK.
 469 # _BOOTDIR2: Second choice
 470 # The _BOOTDIR3 is defind optionally.
 471 ifndef ALT_BOOTDIR
 472   _BOOTDIR1  =$(_system_drive)/jdk$(PREVIOUS_JDK_VERSION)
 473   _BOOTDIR2  =$(USRJDKINSTANCES_PATH)/jdk$(PREVIOUS_JDK_VERSION)
 474   _BOOTDIR3  =$(SLASH_JAVA)/re/jdk/$(PREVIOUS_JDK_VERSION)/archive/fcs/binaries/$(PLATFORM)-$(ARCH)
 475 endif
 476 
 477 # Everybody needs the MSVCRNN runtime starting with VS2010
 478 _NEEDS_MSVCRNN = true
 479 
 480 ifeq ($(_NEEDS_MSVCRNN), true)
 481   # MSVCRNN_DLL_PATH: location of msvcrnn.dll that will be re-distributed
 482   ifdef ALT_MSVCRNN_DLL_PATH
 483     xALT_MSVCRNN_DLL_PATH :="$(subst \,/,$(ALT_MSVCRNN_DLL_PATH))"
 484     MSVCRNN_DLL_PATH      :=$(call FullPath,$(xALT_MSVCRNN_DLL_PATH))
 485   else
 486     MSVCRNN_DLL_PATH :=$(_redist_sdk)
 487   endif
 488   MSVCRNN_DLL_PATH :=$(call AltCheckSpaces,MSVCRNN_DLL_PATH)
 489   MSVCRNN_DLL_PATH:=$(call AltCheckValue,MSVCRNN_DLL_PATH)
 490 endif
 491 
 492 # DXSDK_PATH: path to Microsoft DirectX SDK Include and Lib
 493 ifdef ALT_DXSDK_PATH
 494   xALT_DXSDK_PATH :="$(subst \,/,$(ALT_DXSDK_PATH))"
 495   DXSDK_PATH      :=$(call FullPath,$(xALT_DXSDK_PATH))
 496 else
 497   _DXSDK_PATH1 :=$(_dx_sdk_dir)
 498   _DXSDK_PATH2 :=$(JDK_DEVTOOLS_DIR)/windows/dxsdk
 499   DXSDK_PATH  :=$(call DirExists,$(_DXSDK_PATH1),$(_DXSDK_PATH2),$(_dx_sdk_dir))
 500 endif
 501 DXSDK_PATH :=$(call AltCheckSpaces,DXSDK_PATH)
 502 DXSDK_PATH:=$(call AltCheckValue,DXSDK_PATH)
 503 
 504 # DXSDK_INCLUDE_PATH: path to Microsoft DirectX SDK Include
 505 ifdef ALT_DXSDK_INCLUDE_PATH
 506   xALT_DXSDK_INCLUDE_PATH :="$(subst \,/,$(ALT_DXSDK_INCLUDE_PATH))"
 507   DXSDK_INCLUDE_PATH      :=$(call FullPath,$(xALT_DXSDK_INCLUDE_PATH))
 508 else
 509   DXSDK_INCLUDE_PATH =$(subst //,/,$(DXSDK_PATH)/Include)
 510 endif
 511 
 512 # DXSDK_LIB_PATH: path to Microsoft DirectX SDK Lib
 513 ifdef ALT_DXSDK_LIB_PATH
 514   xALT_DXSDK_LIB_PATH :="$(subst \,/,$(ALT_DXSDK_LIB_PATH))"
 515   DXSDK_LIB_PATH      :=$(call FullPath,$(xALT_DXSDK_LIB_PATH))
 516 else
 517   ifeq ($(ARCH_DATA_MODEL), 64)
 518     # 64bit libs are located in "Lib/x64" subdir
 519     DXSDK_LIB_PATH =$(subst //,/,$(DXSDK_PATH)/Lib/x64)
 520   else
 521     DXSDK_LIB_PATH =$(subst //,/,$(DXSDK_PATH)/Lib)
 522   endif
 523 endif
 524 
 525 # DEPLOY_MSSDK: Microsoft SDK for this platform (for deploy)
 526 ifdef ALT_DEPLOY_MSSDK
 527   xALT_DEPLOY_MSSDK :="$(subst \,/,$(ALT_DEPLOY_MSSDK))"
 528   DEPLOY_MSSDK      :=$(call FullPath,$(xALT_DEPLOY_MSSDK))
 529 else
 530   DEPLOY_MSSDK      :=$(_ms_sdk)
 531 endif
 532 DEPLOY_MSSDK:=$(call AltCheckSpaces,DEPLOY_MSSDK)
 533 
 534 # INSTALL_MSSDK: Microsoft Installer SDK for this platform (for install)
 535 ifdef ALT_INSTALL_MSSDK
 536   xALT_INSTALL_MSSDK :="$(subst \,/,$(ALT_INSTALL_MSSDK))"
 537   INSTALL_MSSDK      :=$(call FullPath,$(xALT_INSTALL_MSSDK))
 538 else
 539   INSTALL_MSSDK      :=$(_ms_sdk)
 540 endif
 541 INSTALL_MSSDK:=$(call AltCheckSpaces,INSTALL_MSSDK)
 542 
 543 # WSCRIPT: path to wscript.exe (used in creating install bundles)
 544 ifdef ALT_WSCRIPT
 545   xALT_WSCRIPT :="$(subst \,/,$(ALT_WSCRIPT))"
 546   WSCRIPT  =$(xALT_WSCRIPT)
 547 else
 548   _WSCRIPT1 :=$(_system_root)/system32/wscript.exe
 549   _WSCRIPT2 :=$(DEVTOOLS_PATH)wscript.exe
 550   WSCRIPT  :=$(call FileExists,$(_WSCRIPT1),$(_WSCRIPT2))
 551 endif
 552 WSCRIPT:=$(call AltCheckSpaces,WSCRIPT)
 553 # batch mode no modal dialogs on errors, please.
 554 WSCRIPT += -B
 555 
 556 # CSCRIPT: path to cscript.exe (used in creating install bundles)
 557 ifdef ALT_CSCRIPT
 558   xALT_CSCRIPT :="$(subst \,/,$(ALT_CSCRIPT))"
 559   CSCRIPT  =$(xALT_CSCRIPT)
 560 else
 561   _CSCRIPT1 :=$(_system_root)/system32/cscript.exe
 562   _CSCRIPT2 :=$(DEVTOOLS_PATH)cscript.exe
 563   CSCRIPT  :=$(call FileExists,$(_CSCRIPT1),$(_CSCRIPT2))
 564 endif
 565 CSCRIPT:=$(call AltCheckSpaces,CSCRIPT)
 566 
 567 # CABARC: path to cabarc.exe (used in creating install bundles)
 568 ifdef ALT_CABARC
 569   xALT_CABARC :="$(subst \,/,$(ALT_CABARC))"
 570   CABARC  =$(xALT_CABARC)
 571 else
 572   _CABARC1 :=$(_system_root)/system32/cabarc.exe
 573   _CABARC2 :=$(DEVTOOLS_PATH)cabarc.exe
 574   CABARC  :=$(call FileExists,$(_CABARC1),$(_CABARC2))
 575 endif
 576 CABARC:=$(call AltCheckSpaces,CABARC)
 577 
 578 # MSICERT: path to msicert.exe (used in creating install bundles)
 579 ifdef ALT_MSICERT
 580   xALT_MSICERT :="$(subst \,/,$(ALT_MSICERT))"
 581   MSICERT  =$(xALT_MSICERT)
 582 else
 583   _MSICERT1 :=$(INSTALL_MSSDK)/Bin/msicert.exe
 584   _MSICERT2 :=$(DEVTOOLS_PATH)msicert.exe
 585   MSICERT   :=$(call FileExists,$(_MSICERT1),$(_MSICERT2))
 586 endif
 587 MSICERT:=$(call AltCheckSpaces,MSICERT)
 588 
 589 # Import JDK images allow for partial builds, components not built are
 590 #    imported (or copied from) these import areas when needed.
 591 
 592 # BUILD_JDK_IMPORT_PATH: location of JDK install trees to import for
 593 #   multiple platforms, e.g. windows-i586, solaris-sparc, linux-586, etc.
 594 ifdef ALT_BUILD_JDK_IMPORT_PATH
 595   BUILD_JDK_IMPORT_PATH  :=$(call FullPath,$(ALT_BUILD_JDK_IMPORT_PATH))
 596 else
 597   BUILD_JDK_IMPORT_PATH   = $(PROMOTED_BUILD_BINARIES)
 598 endif
 599 BUILD_JDK_IMPORT_PATH:=$(call AltCheckSpaces,BUILD_JDK_IMPORT_PATH)
 600 BUILD_JDK_IMPORT_PATH:=$(call AltCheckValue,BUILD_JDK_IMPORT_PATH)
 601 
 602 # JDK_IMPORT_PATH: location of previously built JDK (this version) to import
 603 ifdef ALT_JDK_IMPORT_PATH
 604   JDK_IMPORT_PATH  :=$(call FullPath,$(ALT_JDK_IMPORT_PATH))
 605 else
 606   JDK_IMPORT_PATH   = $(BUILD_JDK_IMPORT_PATH)/$(PLATFORM)-$(ARCH)$(_JDK_IMPORT_VARIANT)
 607 endif
 608 JDK_IMPORT_PATH:=$(call AltCheckSpaces,JDK_IMPORT_PATH)
 609 JDK_IMPORT_PATH:=$(call AltCheckValue,JDK_IMPORT_PATH)
 610 
 611 # HOTSPOT_IMPORT_PATH: location of hotspot pre-built files
 612 ifdef ALT_HOTSPOT_IMPORT_PATH
 613   HOTSPOT_IMPORT_PATH :=$(call FullPath,$(ALT_HOTSPOT_IMPORT_PATH))
 614 else
 615   # Default locations include the current $OUTPUTDIR, RE Promotions,
 616   # and a JDK.  Please be aware the JDK does not include a Kernel VM.
 617   _HOTSPOT_IMPORT_PATH1 = $(OUTPUTDIR)/hotspot/import
 618   _HOTSPOT_IMPORT_PATH2 = $(PROMOTED_BUILD_DISTDIR)/hotspot/import
 619   _HOTSPOT_IMPORT_PATH3 = $(JDK_IMPORT_PATH)
 620    HOTSPOT_IMPORT_PATH := $(call DirExists,$(_HOTSPOT_IMPORT_PATH1),$(_HOTSPOT_IMPORT_PATH2),$(_HOTSPOT_IMPORT_PATH3))
 621 endif
 622 HOTSPOT_IMPORT_PATH:=$(call AltCheckSpaces,HOTSPOT_IMPORT_PATH)
 623 HOTSPOT_IMPORT_PATH:=$(call AltCheckValue,HOTSPOT_IMPORT_PATH)
 624 
 625 # HOTSPOT_CLIENT_PATH: location of client jvm library file.
 626 ifeq ($(ARCH_DATA_MODEL), 32)
 627   ifdef ALT_HOTSPOT_CLIENT_PATH
 628     HOTSPOT_CLIENT_PATH :=$(call FullPath,$(ALT_HOTSPOT_CLIENT_PATH))
 629   else
 630     HOTSPOT_CLIENT_PATH   =$(HOTSPOT_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/client
 631   endif
 632   HOTSPOT_CLIENT_PATH:=$(call AltCheckSpaces,HOTSPOT_CLIENT_PATH)
 633   HOTSPOT_CLIENT_PATH:=$(call AltCheckValue,HOTSPOT_CLIENT_PATH)
 634 endif
 635 
 636 # HOTSPOT_SERVER_PATH: location of server jvm library file.
 637 ifdef ALT_HOTSPOT_SERVER_PATH
 638   HOTSPOT_SERVER_PATH :=$(call FullPath,$(ALT_HOTSPOT_SERVER_PATH))
 639 else
 640   HOTSPOT_SERVER_PATH   =$(HOTSPOT_IMPORT_PATH)/$(ARCH_VM_SUBDIR)/server
 641 endif
 642 HOTSPOT_SERVER_PATH:=$(call AltCheckSpaces,HOTSPOT_SERVER_PATH)
 643 HOTSPOT_SERVER_PATH:=$(call AltCheckValue,HOTSPOT_SERVER_PATH)
 644 
 645 # HOTSPOT_LIB_PATH: location of jvm.lib file.
 646 ifdef ALT_HOTSPOT_LIB_PATH
 647   xALT_HOTSPOT_LIB_PATH :="$(subst \,/,$(ALT_HOTSPOT_LIB_PATH))"
 648   HOTSPOT_LIB_PATH      :=$(call FullPath,$(xALT_HOTSPOT_LIB_PATH))
 649 else
 650   HOTSPOT_LIB_PATH  =$(HOTSPOT_IMPORT_PATH)/lib
 651 endif
 652 HOTSPOT_LIB_PATH:=$(call AltCheckSpaces,HOTSPOT_LIB_PATH)
 653 HOTSPOT_LIB_PATH:=$(call AltCheckValue,HOTSPOT_LIB_PATH)
 654 
 655 # Special define for checking the binaries
 656 
 657 # All windows dll and exe files should have been built with -NXCOMPAT
 658 #   and be setup for dynamic base addresses.
 659 #   In addition, we should not be dependent on certain dll files that
 660 #   we do not or cannot redistribute.
 661 
 662 # List of filenames we should NOT be dependent on
 663 ifeq ($(MFC_DEBUG),true)
 664   BANNED_DLLS=msvcp100[.]dll
 665 else
 666   BANNED_DLLS=msvcp100[.]dll|msvcr100d[.]dll|msvcrtd[.]dll
 667 endif
 668 
 669 # Check for -safeseh (only used on 32bit)
 670 define binary_file_safeseh_verification # binary_file
 671 ( \
 672   $(ECHO) "Checking for -SAFESEH usage in: $1" && \
 673   if [ "`$(DUMPBIN) -loadconfig $1 | $(EGREP) -i 'Safe Exception Handler Table'`" = "" ] ; then \
 674     $(ECHO) "ERROR: Did not find 'Safe Exception Handler Table' in loadconfig: $1" ; \
 675     $(DUMPBIN) -loadconfig $1 ; \
 676     exit 6 ; \
 677   fi ; \
 678 )
 679 endef
 680 
 681 # Check for -NXCOMPAT usage
 682 define binary_file_nxcompat_verification # binary_file
 683 ( \
 684   $(ECHO) "Checking for -NXCOMPAT usage in: $1" && \
 685   if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'NX compatible'`" = "" ] ; then \
 686     $(ECHO) "ERROR: Did not find 'NX compatible' in headers: $1" ; \
 687     $(DUMPBIN) -headers $1 ; \
 688     exit 7 ; \
 689   fi ; \
 690 )
 691 endef
 692 
 693 # Check for -DYNAMICBASE usage
 694 define binary_file_dynamicbase_verification # binary_file
 695 ( \
 696   $(ECHO) "Checking for -DYNAMICBASE usage in: $1" && \
 697   if [ "`$(DUMPBIN) -headers $1 | $(EGREP) -i 'Dynamic base'`" = "" ] ; then \
 698     $(ECHO) "ERROR: Did not find 'Dynamic base' in headers: $1" ; \
 699     $(DUMPBIN) -headers $1 ; \
 700     exit 8 ; \
 701   fi ; \
 702 )
 703 endef
 704 
 705 # Check for banned dll usage
 706 define binary_file_dll_verification # binary_file
 707 ( \
 708   $(ECHO) "Checking for banned dependencies in: $1" && \
 709   if [ "`$(DUMPBIN) -dependents $1 | $(EGREP) -i '$(BANNED_DLLS)'`" != "" ] ; then \
 710     $(ECHO) "ERROR: Found use of $(BANNED_DLLS)"; \
 711     $(DUMPBIN) -dependents $1 ; \
 712     exit 9 ; \
 713   fi ; \
 714 )
 715 endef
 716 
 717 # Macro to check it's input file for properly built executables.
 718 #   Relies on process exit code. Different for 32bit vs 64bit.
 719 ifeq ($(ARCH_DATA_MODEL),32)
 720 define binary_file_verification # binary_file
 721 ( \
 722   $(call binary_file_safeseh_verification,$1); \
 723   $(call binary_file_nxcompat_verification,$1); \
 724   $(call binary_file_dynamicbase_verification,$1); \
 725   $(call binary_file_dll_verification,$1); \
 726 )
 727 endef
 728 else
 729 define binary_file_verification # binary_file
 730 ( \
 731   $(call binary_file_nxcompat_verification,$1); \
 732   $(call binary_file_dynamicbase_verification,$1); \
 733   $(call binary_file_dll_verification,$1); \
 734 )
 735 endef
 736 endif
 737