# -*- Makefile -*-
#
# $Id: vacpp.config 604045 2007-12-13 21:56:09Z sebor $
#
# configuration file for IBM VisualAge and XLC++
#
##############################################################################
#
# 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.
#
##############################################################################

# see if the xlCcore command exists and use it in preference to xlC
# xlCcore, available in VAC++ 6.0 patches released since 4/2004, and
# later, avoids linking with the native C++ Standard Library
ifneq ($(shell xlCcore /dev/null >/dev/null 2>&1; echo $$?),127)
    CXX := xlCcore

    # enable Run-Time Linking for true shared libraries
    # (i.e., .so's but not AIX shared archives)
    ifneq (,$(findstring shared,$(BUILDMODE)))
        ifeq (,$(findstring archive,$(BUILDMODE)))
            rtl_enabled = 1
        endif
    endif
else
    ifeq ($(OSNAME),AIX)
        CXX := xlC
        # Run-Time Linking not enabled as its known to cause conflicts
        # with the native VAC++ C++ Standard Library on AIX, libC.a
    else   # assume Linux
        # use xlc on Linux to prevent linking in the native
        # C++ Standard Library (gcc's libstdc++)
        CXX := xlc
    endif
endif

# _r suffix links with reentrant versions of system libraries
ifeq ($(findstring pthread,$(BUILDMODE)),pthread)
    CXX := $(CXX)_r
endif

# invoke a script to determine the exact version
CCVER := $(shell etc/config/xlC_version.sh)

# determine the major and minor version of the compiler
CXX_MAJOR    := $(shell echo "$(CCVER)" | sed "s/^\([1-9][0-9]*\).*/\1/")
CXX_MINOR    := $(shell echo "$(CCVER)" | sed "s/[1-9]*\.\([0-9]*\).*/\1/")

# determine the major and minor version of the OS on AIX
ifeq ($(OSNAME),AIX)
    OS_MAJOR := $(shell uname -v)
    OS_MINOR := $(shell uname -r)
endif

# suppress bogus warnings:
# 1540-0152: A template dependent name that is a type must be qualified
#            with "typename".
# 1540-0183: The explicit instantiation should either be explictly
#            qualified or be declared in the namespace containing
#            the template. (See VAC++ 7.0 bug #449.)

ifeq ($(shell expr $(CXX_MAJOR) \< 6),1)
WARNFLAGS       = -qsuppress=1540-0152
endif   # version < 6.0

ifeq ($(CCVER),7.0)
WARNFLAGS     += -qsuppress=1540-0183
endif   # version == 7.0


DEPENDFLAGS     = -MP
CXXFLAGS        = 

# enable C++ C library headers (the <cname> kind)
CPPFLAGS        = -I$(TOPDIR)/include/ansi


# use -qmkshrobj with VAC++ 6.0 and prior or when building
# a shared library (either a shared archive or a .so)
ifneq (,$(findstring shared,$(BUILDMODE)))
  shared = 1
else
  ifneq (,$(findstring |$(BUILDTYPE)|,|8d|8D|11d|11D|12d|12D|15d|15D|))
    shared = 1
  endif
endif

ifneq ($(shared),)
  PRELINKFLAGS = -qmkshrobj
else
  ifeq ($(shell expr $(CXX_MAJOR) \< 7),1)
    PRELINKFLAGS = -qmkshrobj
  endif
endif


LDFLAGS         = $(CPPFLAGS)

ifeq ($(OSNAME),AIX)
  # link with libiconv only on AIX (and not on Linux)
  LDFLAGS      += -liconv

  ifneq ($(rtl_enabled),1)
    # bump up the maximum AIX binder error level from the default of 4
    # to silence ld warning 0711-224 (Duplicate symbol) when the tempinc
    # template instantiation model is active (-qtempinc)
    ifneq ($(PRELINKFLAGS),)
      # append to PRELINKFLAGS only if the variable is not empty
      # to avoid trying to prelink with the wrong options (i.e.,
      # without -qmkshrobj)
      PRELINKFLAGS += -Wl,-bh:5
    endif
    LDFLAGS      += -Wl,-bh:5
  else
    ifeq ($(CXX_MAJOR),6)
      # also silence ld warning 0711-224 (Duplicate symbol) for shared
      # library linking with VisualAge C++ 6.0 (see STDCXX-439)
      LDFLAGS += -Wl,-bh:5
    endif
  endif

  # disable assembly files on AIX but leave them enabled (at the default
  # setting) elsewhere (e.g., Linux)
  AS_EXT = .

else   # not AIX (assume Linux)
  # position-dependent code necessary on Linux only
  PICFLAGS      = -qpic

  # set the assembler file suffix to .s
  AS_EXT = .s

  ifeq ($(findstring xlCcore,$(CXX)),)
    LDLIBS = -lxlopt -lxl -libmc++ -lsupc++ -lgcc -lgcc_eh -lc
  endif
endif

# when Run-Time Linking is enabled create a dynamically loadable
# library and use run-time linking, otherwise make a shared archive
ifeq ($(rtl_enabled),1)
  LDFLAGS      += -brtl
  LDSOFLAGS     = -G
endif

# The flag(s) to use to embed a library search path into generated executables.
ifeq ($(OSNAME),AIX)
  ifeq ($(shell [ $(OS_MAJOR) -gt 5 -o $(OS_MAJOR) -eq 5 -a $(OS_MINOR) -ge 3 \
] && echo 1), 1)
    # -bsrv4, -R only available on AIX 5.3 and newer
    RPATH = -Wl,-bsvr4,-R
  endif
else   # assume Linux
   RPATH = -Wl,-R
endif

# debug/optimization options
DEBUG_CXXFLAGS  = -g
DEBUG_CPPFLAGS  =

# -O enables inlining of all functions declared inline
OPTMZ_CXXFLAGS  = -O
OPTMZ_CPPFLAGS  =

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

ifeq ($(rtl_enabled),1)
  # Run-Time Loadable shared library
  SHARED_SUFFIX = .so
else
  # archive or shared archive
  SHARED_SUFFIX = .a
endif

STATIC_CXXFLAGS =
STATIC_CPPFLAGS =
STATIC_LDFLAGS  =
STATIC_SUFFIX   = .a

# multi/single thread options; xlC_r driver defines -qthreaded
# and _THREAD_SAFE and __VACPP_MULTI__ macros
MULTI_CPPFLAGS_POSIX   = 
MULTI_CPPFLAGS_DCE     = 

# no need to explicitly list libpthread since the xlCxxx_r driver
# implicitly passes -lpthread to the linker
MULTI_LDFLAGS_POSIX    =
MULTI_LDFLAGS_DCE      = 

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

SINGL_CPPFLAGS =
SINGL_LDFLAGS  =

# wide (64-bit) flags -- must be set explicitly
CXXFLAGS.wide  = -q64 # do not use the overly chatty -qwarn64
LDFLAGS.wide   = -q64
LDSOFLAGS.wide = -q64

ifeq ($(OSNAME),AIX)
  ARFLAGS.wide = -X64
endif

# narrow (32-bit) flags -- implicit in the default invocation
# CXXFLAGS.narrow  = -q32
# LDFLAGS.narrow   = -q32
# LDSOFLAGS.narrow = -q32
# ARFLAGS.narrow   =


# override default (rv, no leading dash) to make ar -rv -X64 well-formed
ARFLAGS        = -rv

ifeq ($(OSNAME),AIX)
  # default shared object on AIX (not on Linux)
  ifneq ($(shared),)
    DEFAULT_SHROBJ = shr.o
  endif
endif


# check if the -qtemplateregistry option is recognized
use_tempinc=$(shell    echo "int i;" >/tmp/foo.$$$$.c              \
                    && $(CXX) -c -qmaxerr=1:w -qtemplateregistry   \
                              /tmp/foo.$$$$.c >/dev/null 2>&1;     \
                    echo $$?; rm /tmp/foo.$$$$.c)

# template repository/registry name override

ifneq ($(use_tempinc),0)
  CXX_REPOSITORY = -qtempinc=
else
  CXX_REPOSITORY = -qtemplateregistry=
endif
