blob: 1d5775d4e7a13f91f2d0052709e3cfc56fa18a8a [file] [log] [blame]
# -*- Makefile -*-
#
# $Id$
#
# common makefile definitions shared by all GNUmakefile.*
#
##############################################################################
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)