# -*- Makefile -*-
#
# $Id$
#
# configuration file for SunPro CC on SunOS
#
########################################################################
#
# Licensed to the Apache Software  Foundation (ASF) under one or more
# contributor  license agreements.  See  the NOTICE  file distributed
# with  this  work  for  additional information  regarding  copyright
# ownership.   The ASF  licenses this  file to  you under  the Apache
# License, Version  2.0 (the  "License"); you may  not use  this file
# except in  compliance with the License.   You may obtain  a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the  License is distributed on an  "AS IS" BASIS,
# WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
# implied.   See  the License  for  the  specific language  governing
# permissions and limitations under the License.
#
# Copyright 1999-2007 Rogue Wave Software, Inc.
#
########################################################################

CXX             = CC

# extract the "C++ m.n" substring from version string (whcih changes
# from one release of the compiler to another)
CCVER          := $(shell   $(CXX) -V 2>&1 | head -n1 \
                          | sed 's/.*C++ *\([^ ]*\).*/\1/')
CCMAJOR        := $(shell echo $(CCVER) | cut -f1 -d'.')
CCMINOR        := $(shell echo $(CCVER) | cut -f2 -d'.')

ifeq ($(shell expr $(CCMAJOR) = 5 \& $(CCMINOR) = 9),1)	
  # in Sun C++ 5.9 -xM can only be used with C and C++ files
  # and it produces the wrong results with .{S,s} files
  DEPENDFLAGS.cpp = -xM

  # deliberately undefined:
  # DEPENDFLAGS.S =
  # DEPENDFLAGS   =
else
  DEPENDFLAGS     = -xM
endif

WARNFLAGS       = +w

ifeq ($(shell expr    \( $(CCMAJOR) = 5 \& $(CCMINOR) \> 6 \) \
                   \| $(CCMAJOR) \> 5),1)
  # for Sun C++ 5.7 and beyond, enable diagnostic "tags" in compiler output
  # and use -erroff to silence Warning: std::stringstream::rdbuf hides the
  # function std::ios::rdbuf(std::streambuf*) (see STDCXX-344)
  WARNFLAGS += -errtags -erroff=hidef
endif

PICFLAGS        = -KPIC
LDSOFLAGS       = 
CXXFLAGS        = -library=%none
CXXPRELINK      = 
CPPFLAGS        =
LDFLAGS         = -library=%none
LDSOFLAGS       = -G

# use CC to invoke the compiler (needed to pick up template
# instantiations from SunWS_cache)
AR              = CC
ARFLAGS         = -xar -o

# The flag(s) to use to embed a library search path into generated executables.
RPATH = -R

# debug/optimization options
DEBUG_CXXFLAGS  = -g
DEBUG_CPPFLAGS  =

OPTMZ_CXXFLAGS  = -O
OPTMZ_CPPFLAGS  =

# shared/static library options
SHARED_CXXFLAGS =
SHARED_CPPFLAGS =
SHARED_LDFLAGS  = 

STATIC_CXXFLAGS =
STATIC_CPPFLAGS =
STATIC_LDFLAGS  =

# multi/single thread options; -mt defines _REENTRANT
MULTI_CPPFLAGS_POSIX   = -mt
MULTI_CPPFLAGS_SOLARIS = -mt -D_RWSTD_SOLARIS_THREADS
MULTI_CPPFLAGS_DCE     = 

# avoid linking with the redundant libpthread and libthread
# on Solaris 10 and beyond to prevent error 543
ifeq ($(OSNAME),SunOS)
    OSVER   = $(shell uname -r)
    OSMAJOR = $(shell echo $(OSVER) | sed "s/\([0-9][0-9]*\)\..*/\1/")
    OSMINOR = $(shell echo $(OSVER) | sed "s/[^.]*\.\([0-9][0-9]*\)/\1/")

    ifneq ($(shell expr $(OSMAJOR) \> 5 \| $(OSMINOR) = 10),1)
        LIBPTHREAD = -lpthread
        LIBTHREAD  = -lthread
    endif
else
    LIBPTHREAD = -lpthread
    LIBTHREAD  = -lthread
endif

MULTI_LDFLAGS_POSIX    = -mt $(LIBPTHREAD)
MULTI_LDFLAGS_SOLARIS  = -mt $(LIBTHREAD)
MULTI_LDFLAGS_DCE      =

# POSIX
MULTI_CPPFLAGS = $(MULTI_CPPFLAGS_POSIX)
MULTI_LDFLAGS  = $(MULTI_LDFLAGS_POSIX)

SINGL_CPPFLAGS =
SINGL_LDFLAGS  =

ifeq ($(shell expr $(CCMAJOR) \>= 5 \& $(CCMINOR) \>= 9),1)

    # starting with Sun C++ 5.9, the compiler prefers the generic
    # -m32 and -m64 options to the architecture specific -xarch
    # options some of which have been deprecated
    wide_flags   = -m64
    narrow_flags = -m32
else
    # (try to) determine the architecture via the (non-standard)
    # -p option recognized on (at least) Linux and Solaris
    arch := $(shell uname -p 2>/dev/null)

    ifeq ($(arch),sparc)
        # wide (64-bit) flags -- must be set explicitly
        # narrow (32-bit) flags are implicit on SPARC
        wide_flags   = -xarch=v9
        narrow_flags = -xarch=v8
    else
        # wide (64-bit) flags -- must be set explicitly
        # narrow (32-bit) flags are implicit on AMD64
        ifeq ($(OSNAME),SunOS)
            # Solaris uname -p prints i386 on AMD64, use the optisa
            # command to deterrmine "the best" architecture
            arch := $(shell optisa amd64)
        endif
        ifeq ($(arch),amd64)
            wide_flags   = -xarch=amd64
            narrow_flags = -xarch=386 # the default (same as generic)
        else
            wide_flags   = -xarch=generic64
            narrow_flags = -xarch=generic # the default (same as 386)
        endif
    endif
endif

CXXFLAGS.wide    = $(wide_flags)
LDFLAGS.wide     = $(wide_flags)
LDSOFLAGS.wide   = $(wide_flags)
ARFLAGS.wide     =

CXXFLAGS.narrow  = $(narrow_flags)
LDFLAGS.narrow   = $(narrow_flags)
LDSOFLAGS.narrow = $(narrow_flags)
ARFLAGS.narrow   =
