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

#
# MSVC Compiler settings
#

ifeq ($(PLATFORM), windows)
  CC           = $(COMPILER_PATH)cl
  CPP          = $(COMPILER_PATH)cl
  CXX          = $(COMPILER_PATH)cl
  CCC          = $(COMPILER_PATH)cl
  LIBEXE       = $(COMPILER_PATH)lib
  LINK         = $(COMPILER_PATH)link
  RC           = $(MSDEVTOOLS_PATH)rc
  RSC          = $(MSDEVTOOLS_PATH)rc
  LINK32       = $(LINK)
 
  # Fill in unknown values
  COMPILER_NAME=Unknown MSVC Compiler
  COMPILER_VERSION=
  
  # unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake
  NMAKE          = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo

  # Compiler version and type (Always get word after "Version")
  CC_VER  := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}')
  
  # SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure...
  ifeq ($(ARCH_DATA_MODEL), 32)
    LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
    CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
    ifeq ($(CC_MAJORVER), 13)
      # This should be: CC_VER=13.10.3077 LINK_VER=7.10.3077
      COMPILER_NAME=Visual Studio .NET 2003 Professional C++
      COMPILER_VERSION=VS2003
      REBASE     = $(COMPILER_PATH)../../Common7/Tools/Bin/rebase
      MTL        = $(COMPILER_PATH)../../Common7/Tools/Bin/midl
      ifndef COMPILER_PATH
	COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
      endif
    endif
    ifeq ($(CC_MAJORVER), 14)
      COMPILER_NAME=Visual Studio 8
      COMPILER_VERSION=VS2005
      REBASE     = $(COMPILER_PATH)../../Common8/Tools/Bin/rebase
      MTL        = $(COMPILER_PATH)../../Common8/Tools/Bin/midl
      MT         = $(MSDEVTOOLS_PATH)/mt
      ifndef COMPILER_PATH
	COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
      endif
    endif
    ifeq ($(CC_MAJORVER), 15)
      COMPILER_NAME=Visual Studio 9
      COMPILER_VERSION=VS2008
      #rebase and midl moved out of Visual Studio into the SDK:
      REBASE     = $(MSDEVTOOLS_PATH)/rebase
      MTL        = $(MSDEVTOOLS_PATH)/midl.exe
      MT         = $(MSDEVTOOLS_PATH)mt
      ifndef COMPILER_PATH
	COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
      endif
    endif
    ifeq ($(CC_MAJORVER), 16)
      COMPILER_NAME=Visual Studio 10
      COMPILER_VERSION=VS2010
      #rebase and midl moved out of Visual Studio into the SDK:
      REBASE     = $(MSDEVTOOLS_PATH)/rebase
      MTL        = $(MSDEVTOOLS_PATH)/midl.exe
      MT         = $(MSDEVTOOLS_PATH)mt
      ifndef COMPILER_PATH
	COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
      endif
    endif
  else
    # else ARCH_DATA_MODEL is 64
    LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
    CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
    CC_MINORVER :=$(call MinorVersion,$(CC_VER))
    CC_MICROVER :=$(call MicroVersion,$(CC_VER))
    ifeq ($(CC_MAJORVER), 13)
      ifeq ($(ARCH), ia64)
        # This should be: CC_VER=13.00.9337.7 LINK_VER=7.00.9337.7
        COMPILER_NAME=Microsoft Platform SDK - November 2001 Edition
        COMPILER_VERSION=VS2003
      endif
    endif
    ifeq ($(CC_MAJORVER), 14)
      ifeq ($(ARCH), amd64)
        #rebase and midl moved out of Visual Studio into the SDK:
        REBASE     = $(MSDEVTOOLS_PATH)/rebase
        MTL        = $(MSDEVTOOLS_PATH)/midl.exe
        ifeq ($(CC_MICROVER), 30701)
          # This should be: CC_VER=14.00.30701 LINK_VER=8.00.30701
	  # WARNING: it says 14, but it is such an early build it doesn't
	  #          have all the VS2005 compiler option changes, so treat
	  #          this like a VS2003 compiler.
          COMPILER_NAME=Microsoft Platform SDK - February 2003 Edition
          COMPILER_VERSION=VS2003
        else
          # This should be: CC_VER=14.00.40310.41 LINK_VER=8.00.40310.39
	  COMPILER_NAME=Microsoft Platform SDK - April 2005 Edition (3790.1830)
          COMPILER_VERSION=VS2005
        endif
      else
        REBASE         = $(COMPILER_PATH)../rebase
      endif
    endif
    ifeq ($(CC_MAJORVER), 15)
      COMPILER_NAME=Microsoft Windows SDK with Visual Studio 9 (6001.18000.367)
      COMPILER_VERSION=VS2008
      RC = $(MSSDK61)/Bin/X64/rc.exe
      MT = $(MSSDK61)/Bin/X64/mt.exe
      MTL = $(MSSDK61)/Bin/X64/midl.exe
    endif
    ifeq ($(CC_MAJORVER), 16)
      COMPILER_NAME=Microsoft Visual Studio 10 (16.00.30319.01)
      COMPILER_VERSION=VS2010
      RC = $(MSDEVTOOLS_PATH)/Bin/x64/rc.exe
      RSC = $(MSDEVTOOLS_PATH)/Bin/x64/rc.exe
      MT = $(MSDEVTOOLS_PATH)/Bin/x64/mt.exe
      MTL = $(MSDEVTOOLS_PATH)/Bin/X64/midl.exe
    endif
    # This will cause problems if ALT_COMPILER_PATH is defined to ""
    # which is a directive to use the PATH.
    ifndef COMPILER_PATH
      COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
    endif
  endif
  ifndef COMPILER_VERSION
    COMPILER_VERSION := $(error COMPILER_VERSION cannot be empty here)
  endif
  # Shared library generation flag
  SHARED_LIBRARY_FLAG = -LD
endif

