blob: af07bef7e610491333addf66ff678106b2455b82 [file] [log] [blame]
# -*- Makefile -*-
#
# $Id$
#
# common makefile rules 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.
#
########################################################################
#
# Running tests:
# --------------
# $ make [run | runall | run_all] [target] [target]... ;
# runs the tests specified on the command line
# OR
# $ make [run | runall | run_all] ;
# runs all the tests producing a complete report
#
#
########################################################################
clean: cleantarget
rm -rf a.out core *.o *.i *.ii *.ti *.sh *.sta *.out \
*$(LIBSUFFIX) $(CATFILE) \
tempinc cxx_repository SunWS_cache 2>/dev/null
cleantarget:
rm -f $(TARGET)
listtarget:
@echo $(TARGET)
listsrc:
@echo $(SRCS)
listobj:
@echo $(OBJS)
listfiles:
@echo $(SRCDIRS)
@echo $(ALL_FILES)
listvpath:
@echo $(VPATH)
listruntarget:
@echo $(RUNTARGET)
# create a catalog from text message files - see gencat(1)
$(CATFILE): $(MSGFILES)
-gencat $@ $^
ifeq ($(WITH_PURIFY),true)
ifeq ($(PURIFYFLAGS),)
PURIFYFLAGS = -windows=no
PURIFYFLAGS += -log-file=stderr -view-file=$@.purify-view
endif
ifneq ($(OSNAME),AIX)
PURIFY = purify $(PURIFYFLAGS)
endif
endif
ifeq ($(WITH_CADVISE),true)
ifeq ($(CADVISEFLAGS),)
CADVISEFLAGS = +w
endif
CADVISE = cadvise $(CADVISEFLAGS)
endif
########################################################################
# COMMON RULES
########################################################################
ifeq ($(NO_DOT_O),)
# compile and link in two separate steps
ifneq ($(AS_EXT),)
ifneq ($(AS_EXT),".")
%.o: %$(AS_EXT)
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<
endif # ifneq ($(AS_EXT),".")
endif # ifneq ($(AS_EXT),)
# make the rule match for sources matching *.out.cpp
%.out.o: %.out.cpp
$(CADVISE) $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(call CXX.repo,$<) $<
%.o: %.cpp
$(CADVISE) $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(call CXX.repo,$<) $<
# make the rule match for objects matching *.out.o
%.out: %.out.o
$(PURIFY) $(LD) $< -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<)
%: %.o
$(PURIFY) $(LD) $< -o $@ $(LDFLAGS) $(LDLIBS) $(call CXX.repo,$<)
# disable compilation and linking in the same step
# %: %.cpp
else
# compile and link in one step to eliminate the space overhead of .o files
%: %.cpp
$(CADVISE) $(PURIFY) $(CXX) $< -o $@ $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) \
$(LDLIBS) $(call CXX.repo,$<)
endif # eq ($(NO_DOT_O),)
# produce a .out file by running the executable
%.out: %
LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(LIBDIR) ./$< >$@ 2>&1
# create a script that when run first builds the executable and then runs it
# done to save even more space than `NO_DOT_O' on constrained systems
%.sh: %.cpp
@(echo "generating $@..." ; \
echo "#!$(SHELL)" > $@ ; \
a_dot_out="$(PWD)/$(basename $@)."'$$''$$' ; \
tmp="$(CXX) $< -o $$a_dot_out $(CPPFLAGS) $(CXXFLAGS) " \
"$(LDFLAGS) $(LDLIBS)" ; \
tmp="$$tmp && $$a_dot_out "'$$''*'" && rm $$a_dot_out" ; \
echo >> $@ ; echo "$$tmp" >> $@ ; \
chmod +x $@)
# run all tests, collect exit status and report statistics; the variable
# RUN can be set to contain a list of executables to run without generating
# a report (set to ALL to run all executables)
# hung or runaway processes are killed after a customizable timeout period
#
# to avoid filling up disk space with files left behind by bad programs
# creates and sets the POSIX TMPDIR environment variable to a temporary
# directory before running the programs which is then removed when done
#
# The variable TZ is used in examples and initialized in GNUmakefile.exm
# (see rev.561060)
#
# PlumHall specific:
# for all "top level" tests that failed to build, find and build all
# subtests (the little tests the main test consists of)
ifeq (,$(findstring cygwin,$(PLATFORM)))
run runall run_all: $(BINDIR)/exec
@(LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(LIBDIR); \
PATH=$$PATH:.; \
TOPDIR=$(TOPDIR); \
TMPDIR=$${TMPDIR:-/tmp}/stdcxx-run-$$$$; \
TZ=$(TZ); \
export LD_LIBRARY_PATH PATH TMPDIR TOPDIR TZ; \
trap "rm -rf $$TMPDIR" HUP INT QUIT TERM EXIT; \
mkdir -p $$TMPDIR; \
./run $(RUNFLAGS) $(RUNTARGET); \
exit 0)
else
# on Cygwin add $(LIBDIR) and $(BINDIR) to PATH
run runall run_all: $(BINDIR)/exec
@(LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(LIBDIR); \
PATH=$$PATH:$(LIBDIR):$(BINDIR):.; \
TOPDIR=$(TOPDIR); \
TMPDIR=$${TMPDIR:-/tmp}/stdcxx-run-$$$$; \
TZ=$(TZ); \
export LD_LIBRARY_PATH PATH TMPDIR TOPDIR TZ; \
trap "rm -rf $$TMPDIR" HUP INT QUIT TERM EXIT; \
mkdir -p $$TMPDIR; \
./run $(RUNFLAGS) $(RUNTARGET); \
exit 0)
endif
# include the automatically generated dependencies unless "clean"
# or similar is one of the targets
ifeq ($(findstring clean,$(MAKECMDGOALS)),)
ifeq ($(MAKECMDGOALS),)
# include all dependencies (can be slow when there are a lot of them)
DEPS += $(patsubst %.cpp,$(DEPENDDIR)/%.d,$(filter %.cpp,$(SRCS)))
DEPS += $(patsubst %$(AS_EXT),$(DEPENDDIR)/%.d,$(filter %$(AS_EXT),$(SRCS)))
else
# as a (potentially significant) optimization, include
# only the dependencies for the explicitly specified goals
DEPS += $(addprefix $(DEPENDDIR)/,$(basename $(MAKECMDGOALS)))
DEPS += $(addsuffix .d,$(DEPS))
endif
# (try to) include the dependency file(s), failing gracefully
# if they don't exist (e.g., in the case of a .PHONY goal)
-include $(DEPS)
endif # eq ($(findstring clean,$(MAKECMDGOALS)),)
# generate dependencies only if they don't yet exist, removing anything
# not under $(TOPDIR) or $(BUILDDIR) (e.g., system headers) from the list
# this is done by splitting up dependencies using tr so that there is just
# one per line and then replacing the values of $(TOPDIR) and $(BUILDDIR)
# with the actual make variable names themselves
# move IBM xlC generated .u files to the respective .d files
define makedep
-@(if [ ! -f $@ ] ; then \
echo "generating dependencies for" \
`echo $< | sed "s:$(TOPDIR):$$""(TOPDIR):"` ; \
\
stripexp="s:/$$::;s:[^/]*$$::"; \
RWTSRCDIR=`echo $(TOPDIR) | sed "$$stripexp"`rwtest; \
\
sedexp1="s:\([^ :]\)\( */\):\1 \\\@\2:" ; \
sedexp2="/:[^/]*$$/p; \
s:$$RWTSRCDIR:$$""(TOPDIR)/\.\./rwtest:gp; \
s:$(TOPDIR):$$""(TOPDIR):gp; \
s:$(BUILDDIR):$$""(BUILDDIR):gp" ; \
depflags="$(value DEPENDFLAGS$(depsuffix))"; \
[ "$$depflags" = "" ] && depflags=$(DEPENDFLAGS); \
echo "$(CXX) $$depflags $(CPPFLAGS) $(CXXFLAGS) $<"; \
$(CXX) $$depflags $(CPPFLAGS) $(CXXFLAGS) $< \
| sed "$$sedexp1" | tr "@" "\n" | sed -n "$$sedexp2" >$@ ; \
if [ ! -s $@ ]; then \
depfile=$*.u; \
[ ! -s $$depfile ] && depfile=`basename $*.d`; \
if [ -s $$depfile ] ; then \
sed "$$sedexp1" $$depfile | tr "@" "\n" \
| sed -n "$$sedexp2" > $@ ; \
fi; \
rm -f $$depfile ; \
fi ; \
rm -f $*.i ; \
fi)
endef
$(DEPENDDIR):
@[ ! -d $(DEPENDDIR) ] && mkdir -p $(DEPENDDIR)
ifeq ($(DEPENDFLAGS),)
# if DEPENDFLAGS is empty or not defined, set it to the concatenation
# of the variables specific to each type of a source file
DEPENDFLAGS = $(DEPENDFLAGS.cpp) $(value DEPENDFLAGS$(AS_EXT))
else
DEPENDFLAGS.cpp := $(DEPENDFLAGS)
DEPENDFLAGS.S := $(DEPENDFLAGS)
DEPENDFLAGS.s := $(DEPENDFLAGS)
endif
ifneq ($(DEPENDFLAGS),)
# set depsuffix to the suffix of the first prerequisite
$(DEPENDDIR)/%.d: depsuffix = $(suffix $<)
ifneq ($(DEPENDFLAGS.cpp),)
# rule to make dependencies for C++ source files
$(DEPENDDIR)/%.d: %.cpp $(DEPENDDIR)
$(makedep)
endif # DEPENDFLAGS.cpp
ifneq ($(value DEPENDFLAGS$(AS_EXT)),)
# rule to make dependencies for assembly files
$(DEPENDDIR)/%.d: %$(AS_EXT) $(DEPENDDIR)
$(makedep)
endif # DEPENDFLAGS.as
else # ifeq ($(DEPENDFLAGS),)
$(DEPENDDIR)/%.d:
endif # neq ($(DEPENDFLAGS),)
# disable implicit rules from trying to compile .c and .cc files
# under the include/ directory (e.g., istream.c to istream) due
# to being listed as dependencies of .cpp files
%: %.c
%.o: %.c
%: %.cc
%.o: %.cc
%: %.h
# force the regeneration of all dependencies by removing them
dependclean:
rm -f $(DEPENDDIR)/*.d;
@echo "dependencies will be regenerated at the next invocation of make"
# print ordinary make variables and their values (requires GNU make 3.80)
printvars:
@$(foreach V,$(sort $(.VARIABLES)), \
$(if $(filter-out environment% default automatic, $(origin $V)), \
$(warning $V=$($V) ($(value $V)))))
# define a set of phony targets that make should make unconditionally
# regardless of whether files with the same name exist and their
# timestamps
.PHONY: all c_headers clean dependclean realclean config configure listtarget \
listruntarget listsrc listobj listvpath listsubtests printvars \
run run_all runall
# override the default set of suffixes with our own
.SUFFIXES: .a .c .cc .cpp .d .h .o .$(AS_EXT)