# -*- Makefile -*-
#
# $Id$
#
# configuration file for HP aCC on HP-UX
#
########################################################################
#
# 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-2008 Rogue Wave Software, Inc.
#
########################################################################

CXX       = aCC

CCVER     := $(shell   $(CXX) -V 2>&1 \
                     | sed "s/.* \(A\.[0-9][0-9]*\.[0-9][0-9]\)[^0-9]*.*/\1/")
aCC_MAJOR := $(shell echo $(CCVER) | sed "s/[^.]*\.\([0-9]*\)\..*/\1/")
aCC_MINOR := $(shell echo $(CCVER) | sed "s/[^.]*\.[^.]*\.\([0-9]*\)/\1/")

WARNFLAGS = +w +W392,655,684,818,819,849

ifeq ($(shell [ $(aCC_MAJOR) -eq 3 -a $(aCC_MINOR) -lt 33 ] && echo 1),1)

# disable bogus aCC warnings (aCC prior to 3.32):
#    229 Ambiguous overloaded function call
#    361 Value-returning function might end without executing a return statement

WARNFLAGS  += +W229,361
endif

ifeq ($(aCC_MAJOR),06)

# disabled warnings:
# 2193 zero used for undefined preprocessing identifier
# 2236 controlling expression is constant
# 2261 access control not specified (%sq by default)
# 2340 value copied to temporary, reference to temporary used
# 2401 destructor for base class %t is not virtual
# 2487 inline %n cannot be explicitly instantiated

# disable aCC 6.x (EDG front end) warnings emitted with +w:
WARNFLAGS  += +W2193,2236,2261,2340,2401,2487

    ifeq ($(shell [ $(aCC_MINOR) -gt 10 ] && echo 1),1)

# disabled remarks:
# 4227 padding struct with N bytes to align member
# 4229 64 bit migration: conversion from "long" to "int" may truncate value
# 4231 64 bit migration: conversion between types of different sizes
# 4235 conversion from "T" to "U" may lose significant bits
# 4237 type cast from "T" to "U" may cause sign extension
# 4249 64 bit migration: value could be truncated before cast
# 4255 padding size of struct with N bytes to alignment boundary
# 4272 conversion from "T" to "unsigned T" may lose sign
# 4284 operator= does not return reference to *this
# 4285 operator= does not have a check for the source and destination
# 4286 return non-const handle to non-public data member

# remarks disabled as useless (even according to HP):
# 4296 arithmetic operation on boolean type
# 4297 boolean value is used as array index

        WARNFLAGS += +W4227,4229,4231,4235,4237,4249 \
                     +W4255,4272,4284,4285,4286,4296,4297

        ifeq ($(shell [ $(aCC_MINOR) -lt 20 ] && echo 1),1)

# disabled due to STDCXX-694 (hopefully fixed by the time 6.20 comes out)
# 3348 declaration hides constant or variable

            WARNFLAGS += +W3348

        endif   # aCC < 6.20


    endif   # aCC > 6.10
endif   # aCC 6.x

ifeq ($(shell [ $(aCC_MAJOR) -ge 6 -o $(aCC_MINOR) -ge 38 ] && echo 1),1)
# starting with aCC x.38, the +Md option is deprecated in favor of +Maked
DEPENDFLAGS     = +Maked -E
else
DEPENDFLAGS     = +Md -E
endif

PICFLAGS        = +Z
LDSOFLAGS       = +Z -b

# the extension of assembly files is .s
AS_EXT = .s

# $(_CPPOPTS), $(_CXXOPTS), and $(_LDOPTS) provided to allow for modification
# of the respective variables w/o underscores on HP-UX where the latter are
# used directly by the compiler and linker, respectively

# use -AA by default, allow -Aa as an option
use_Aa := $(filter -Aa,$(_CXXOPTS))

ifneq ($(use_Aa),-Aa)
CXXFLAGS        = -AA "$$"(_CXXOPTS)
CXXPRELINK      = 
CPPFLAGS        = "$$"(_CPPOPTS)
LDFLAGS         = -AA +nostl -Wl,+s "$$"(_LDOPTS)
else
# -Aa was specified in _CXXOPTS
CXXFLAGS        = -Aa +nostl "$$"(_CXXOPTS)
CXXPRELINK      = 
CPPFLAGS        = -I$(TOPDIR)/include/ansi -I/usr/include "$$"(_CPPOPTS)
# -Wl,+s allows the dynamic loader to consider LD_LIBRARY_PATH (LP64)
# and SHLIB_PATH when loading an executable into memory
LDFLAGS         = -Aa +nostl -Wl,+s -Wl,+vnocompatwarnings "$$"(_LDOPTS)
endif

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

# debug/optimization options
DEBUG_CXXFLAGS  = -g +d
DEBUG_CPPFLAGS  =

OPTMZ_CXXFLAGS  = +O2
OPTMZ_CPPFLAGS  =

# shared/static library options
SHARED_CXXFLAGS =
SHARED_CPPFLAGS =
SHARED_LDFLAGS  =
SHARED_SUFFIX   = .sl

STATIC_CXXFLAGS =
STATIC_CPPFLAGS =
STATIC_LDFLAGS  =

# multi/single thread options; 
# we use the macros defined by the compiler when the -mt option is used
# DCE threads not added since HP-UX versions after 10.20 use POSIX
MULTI_CPPFLAGS_POSIX   = -mt
MULTI_CPPFLAGS_SOLARIS = 
MULTI_CPPFLAGS_DCE     = 

MULTI_LDFLAGS_POSIX    = -mt
MULTI_LDFLAGS_SOLARIS  = 
MULTI_LDFLAGS_DCE      = 

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

SINGL_CPPFLAGS =
SINGL_LDFLAGS  =

# wide (64-bit, LP64) flags -- must be set explicitly
CXXFLAGS.wide    = +DD64
LDFLAGS.wide     = +DD64
LDSOFLAGS.wide   = +DD64
ARFLAGS.wide     =

# narrow (32-bit, ILP32) flags -- implicit in the default invocation
# CXXFLAGS.narrow  = +DD32
# LDFLAGS.narrow   = +DD32
# LDSOFLAGS.narrow = +DD32
# ARFLAGS.narrow   =
