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

#
# GCC Compiler settings
#

ifeq ($(PLATFORM), windows)

  # Settings specific to Windows, pretty stale, hasn't been used
  CC           = $(COMPILER_PATH)gcc
  CPP          = $(COMPILER_PATH)gcc -E
  CXX          = $(COMPILER_PATH)g++
  CCC          = $(COMPILER_PATH)g++
  LIBEXE       = $(COMPILER_PATH)lib
  LINK         = $(COMPILER_PATH)link
  RC           = $(MSDEVTOOLS_PATH)link
  LINK32       = $(LINK)
  RSC          = $(RC)
  # unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake
  NMAKE          = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo
  ifeq ($(ARCH_DATA_MODEL), 32)
    CC_VER  = UNKNOWN
  else
    CC_VER  = UNKNOWN
  endif
  _LINK_VER :=$(shell $(LINK) 2>&1 | $(HEAD) -n 1)
  LINK_VER  :=$(call GetVersion,"$(_LINK_VER)")

endif

ifeq ($(PLATFORM), linux)

  # Settings specific to Linux
  CC             = $(COMPILER_PATH)gcc
  CPP            = $(COMPILER_PATH)gcc -E
  # statically link libstdc++ before C++ ABI is stablized on Linux
  STATIC_CXX     = true
  ifeq ($(STATIC_CXX),true)
    # g++ always dynamically links libstdc++, even we use "-Wl,-Bstatic -lstdc++"
    # We need to use gcc to statically link the C++ runtime. gcc and g++ use
    # the same subprocess to compile C++ files, so it is OK to build using gcc.
    CXX            = $(COMPILER_PATH)gcc
  else
    CXX            = $(COMPILER_PATH)g++
  endif
  # Option used to create a shared library
  SHARED_LIBRARY_FLAG = -shared -mimpure-text
  SUN_COMP_VER := $(shell $(CC) --verbose 2>&1 )

endif

ifeq ($(PLATFORM), solaris)

  # Settings specific to Solaris
  CC             = $(COMPILER_PATH)gcc
  CPP            = $(COMPILER_PATH)gcc -E
  CXX            = $(COMPILER_PATH)g++

  # Option used to create a shared library
  SHARED_LIBRARY_FLAG = -G
  
endif

# Get gcc version
_CC_VER :=$(shell $(CC) -dumpversion 2>&1 )
CC_VER  :=$(call GetVersion,"$(_CC_VER)")

# Name of compiler
COMPILER_NAME = GCC$(call MajorVersion,$(CC_VER))
COMPILER_VERSION = $(COMPILER_NAME)

