#
# $Id$
#
# configuration file for the Comeau compiler
#
##############################################################################
#
# 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             = como
CCVER          := $(shell $(CXX) -v foo.c 2>&1 | head -1 | awk '{ print $$3'})
CC_MAJOR       := $(shell echo "$(CCVER)" | sed -n "s/^\([^\.]*\).*/\1/p")
CC_MINOR       := $(shell echo "$(CCVER)" | sed -n "s/^.*\.\([0-9]*\).*/\1/p")

ifeq ($(CC_MINOR),2)
CPPFLAGS        = -I$(TOPDIR)/include/ansi --incl_suffixes ::
CXXFLAGS        = -A -B -x
LDFLAGS         =
else
CPPFLAGS        = -I$(TOPDIR)/include/ansi
CXXFLAGS        = -A -x --no_stdarg_builtin --template_directory=$(BUILDDIR)/lib
LDFLAGS         = --template_directory=$(BUILDDIR)/lib
endif   # CC_MAJOR == 2

WARNFLAGS       = --display_error_number --diag_suppress 11,450,518
DEPENDFLAGS     = -M
PICFLAGS        = 
PRELINKFLAGS    = --prelink_objects

# The flag(s) to use to embed a library search path into generated executables.
# Appropriate flag(s) (if available) not determined at this time.
RPATH =

# debug/optimization options
DEBUG_CXXFLAGS  = -g
DEBUG_CPPFLAGS  =

OPTMZ_CXXFLAGS  = -O
OPTMZ_CPPFLAGS  =

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

STATIC_CXXFLAGS =
STATIC_CPPFLAGS =
STATIC_LDFLAGS  =

# Compiler and linker flags for multi-threading
MULTI_CPPFLAGS_POSIX   = -D_REENTRANT 
MULTI_CPPFLAGS_SOLARIS = 
MULTI_CPPFLAGS_DCE     = 

ifeq ($(OSNAME),SunOS)
  MULTI_LDFLAGS_POSIX    = /usr/lib/libpthread.so
else
  MULTI_LDFLAGS_POSIX    = -lpthread
endif
MULTI_LDFLAGS_SOLARIS  = 
MULTI_LDFLAGS_DCE      = 

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

SINGL_CPPFLAGS  =
SINGL_LDFLAGS   =
