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