# -*- Makefile -*- # # $Id$ # # common makefile rules shared by all GNUmakefile.* # # 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 $@ $^ ############################################################################## # 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),) %.o: %.cpp $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(call CXX.repo,$<) $< %: %.o $(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 $(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 # # PlumHall specific: # for all "top level" tests that failed to build, find and build all # subtests (the little tests the main test consists of) run runall run_all: $(BINDIR)/exec @(LD_LIBRARY_PATH=$$LD_LIBRARY_PATH:$(LIBDIR); \ PATH=$$PATH:.; \ TOPDIR=$(TOPDIR); \ export LD_LIBRARY_PATH PATH TOPDIR; \ ./run $(RUNFLAGS) $(RUNTARGET); \ exit 0) # 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)),) ifneq ($(DEPENDFLAGS),) # 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" ; \ \ $(CXX) $(DEPENDFLAGS) $(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) # rule to make dependencies for C++ source files $(DEPENDDIR)/%.d: %.cpp $(DEPENDDIR) $(makedep) # rule to make dependencies for assembly files $(DEPENDDIR)/%.d: %$(AS_EXT) $(DEPENDDIR) $(makedep) 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)