# -*- Makefile -*-
#
# $Id$
#
# 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
