# -*- 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)