# -*- Makefile -*-
#
# $Id$
#
# common makefile definitions shared by all GNUmakefile.*
#
########################################################################
#
# 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.
#
########################################################################

SHELL        = /bin/sh 

# specify path to find to avoid problems with example named 'find'
FIND         = /usr/bin/find

# set common variables used in makefiles
BINDIR       = $(BUILDDIR)/bin
LIBDIR       = $(BUILDDIR)/lib

# provide a value if it isn't already set by make
ifeq ($(CURDIR),)
  CURDIR := $(shell pwd)
endif

INCLUDES     = -I$(TOPDIR)/include -I$(BUILDDIR)/include

ALL_FILES := "*"

ifneq ($(AS_EXT),"")
  ifneq ($(AS_EXT),".")   # special value -- ignore atomic

    # if the assembly file extension is non-empty and not the dot,
    # add all files with that extension to the list of files to
    # compile
    ALL_FILES := $(foreach dir,$(SRCDIRS),\
                     $(wildcard $(dir)/*.cpp $(dir)/*.msg $(dir)/*$(AS_EXT)))
  endif
endif

ifeq ($(ALL_FILES),"*")
  # traverse all subdirectories and get the names of all source files
  ALL_FILES := $(foreach dir,$(SRCDIRS), $(wildcard $(dir)/*.cpp $(dir)/*.msg))
endif


# SRCDIRS must be defined in GNUmakefile that includes this file
ifeq ($(ONE_REPOSITORY),)

  # using a separate template instantiation repository for each source
  # and object file (i.e., when each source produces one executable)
  ifneq ($(CXX_REPOSITORY),)

    # define a function, CXX.repo, that returns the name of the template
    # instantiation repository from the name of a source or object file
    # and a unique suffix (so that each program has its own and the same
    # names with different definitions do not cause conflicts)
    #
    # e.g., Compaq C++ where this will expand to something like
    #     -ptr foo.ti
    # or IBM VisualAge/XLC++ where it will be along the lines of
    #    --qtempinc=foo.ti
    # or
    #    --qtemplateregistry=foo.ti
    #
    ifeq ($(findstring =,$(CXX_REPOSITORY)),=)
      CXX.repo = $(CXX_REPOSITORY)$(basename $(notdir $(1))).ti
    else
      CXX.repo = $(CXX_REPOSITORY) $(basename $(notdir $(1))).ti
    endif
  else   # ifeq ($(CXX_REPOSITORY),)
    ifeq ($(CXX),CC)
      ifeq ($(findstring SunOS,$(PLATFORM)),SunOS)
        # set SUNWS_CACHE_NAME to the basename of the file being compiled
        # followed by .ti, to override the default template repository,
        # SunWS_cache
        tmp := $(CXX)
        CXX =
        CXX += SUNWS_CACHE_NAME=$(*F).ti
        CXX += $(tmp)

        tmp := $(LD)
        LD   =
        LD  += SUNWS_CACHE_NAME=$(*F).ti
        LD  += $(tmp)
      endif   # SunOS
    endif   # SunPro
  endif # neq ($(CXX_REPOSITORY),)
else   # ifneq ($(ONE_REPOSITORY),)
  ifneq ($(CXX_REPOSITORY),)

    # using a template instantiation repository shared by all sources
    # (i.e., when creating a single executable or library out of all
    # the object files
    ifeq ($(findstring =,$(CXX_REPOSITORY)),=)
      CXX.repo = $(CXX_REPOSITORY)repository.ti
    else
      CXX.repo = $(CXX_REPOSITORY) repository.ti
    endif
  endif
endif

CPPFLAGS    += $(INCLUDES)
CXXFLAGS    += $(WARNFLAGS)

VPATH       := $(SRCDIRS)

SRCS        := $(notdir $(filter %.cpp %$(AS_EXT),$(ALL_FILES)))
SRCS        := $(sort $(filter-out $(OMIT_SRCS),$(SRCS)))

OBJS        := $(patsubst %.cpp,%.o,$(filter %.cpp,$(SRCS)))
OBJS        += $(patsubst %$(AS_EXT),%.o,$(filter %$(AS_EXT),$(SRCS)))
OBJS        := $(sort $(OBJS))

DEPS        :=

# message files - text files used to generate a catalog - see gencat(1)
MSGFILES     = $(filter %.msg,$(ALL_FILES))


ifeq ($(TARGET),)
  # generate binaries or scripts (in constrained environments)
  ifeq ($(NO_A_DOT_OUT),)
    TARGET := $(patsubst %.o,%,$(OBJS))
  else
    TARGET := $(patsubst %.o,%.sh,$(OBJS))
  endif
endif #ifneq ($(TARGET),)

# link with the produced library and the math library
# (take care not to try to link the library with itself)
ifeq ($(findstring $(LIBNAME),$(TARGET)),)
  LDFLAGS += -L$(LIBDIR)
  # set the GNU make variable LDLIBS to the names of the libraries
  # to link with (make puts $(LDLIBS) last on the link line in
  # implicit rules)
  LDLIBS  := -l$(LIBBASE) $(LDLIBS) -lm
endif  # ifneq ($(LIBNAME),$findstring ($(LIBNAME),$(TARGET)))


# file to write log of the build to
LOGFILE = /dev/null

# if LOGFILE is being created, tee command output into it
# IMPORTANT: $(TEEOPTS) must be last on the command line
ifneq ($(LOGFILE),/dev/null)
  TEEOPTS = 2>&1 | tee -a $(LOGFILE)
endif

# set the RUNTARGET variable to command line args if $RUN isn't set
ifeq ($(RUN),)
  RUNTARGET := $(filter-out run_all runall run,$(MAKECMDGOALS))
else
  RUNTARGET := $(RUN)
endif

ifeq ($(RUNTARGET),)
  RUNTARGET := $(shell echo ./$(TARGET) | sed "s/ / .\//g")
endif


# append command line options to standard flags
CPPFLAGS   += $(CPPOPTS)
CXXFLAGS   += $(CXXOPTS)
LDFLAGS    += $(LDOPTS)
ARFLAGS    += $(AROPTS)
RUNFLAGS   += $(RUNOPTS)
