# This makefile invokes 'Makefile' with various sets of options, to
# explore static versus dynamic linking of mpatrol with a msw program
# split between an .exe and a .dll . It is designed for use with gnu
# make under msw with a *nix shell.

# Set this to where your mpatrol dll import library libmpatrol_dll.a resides.
# Of course, the dll has to be on the PATH to run programs that use it.
MPATROL_DLL_PATH = .

# Set this to where your static library libmpatrol.a resides.
MPATROL_LIB_PATH = .

ECHO     = echo
CP       = cp
CXX      = g++
CXXFLAGS = -ggdb
RM       = rm
SED      = sed

.PHONY: all
all:
	@-$(RM) --force results
	@-$(RM) --force buildlog
  ifeq ($(CXX),g++)
	@$(ECHO) 'g++ version: $(shell $(CXX) -dumpversion)'        >> results
  else
	@$(ECHO) 'compiler: $(CXX)'                                 >> results
  endif
	@$(ECHO) ' '                                                >> results
	@$(ECHO) 'ERROR: [MISMAT] is desirable: it means mpatrol'   >> results
	@$(ECHO) '   found a deliberate error in the user dll'      >> results
	@$(ECHO) 'WARNING: [RNGOVL] is desirable: it means mpatrol' >> results
	@$(ECHO) '   found a deliberate error in the user exe'      >> results
	@$(ECHO) 'Other mpatrol diagnostics are undesirable'        >> results
	@$(ECHO) '"total errors" is desirable; it means mpatrol'    >> results
	@$(ECHO) '   finished writing mpatrol.log'                  >> results
	@$(ECHO) ' '                                                >> results
	@# $(A) is how to link mpatrol to app; $(D) is how to link it to user dll
	$(MAKE) trial A=                     D=LINK_MPATROL_DYNAMIC
	$(MAKE) trial A=                     D=LINK_MPATROL_STATIC
	$(MAKE) trial A=LINK_MPATROL_DYNAMIC D=
	$(MAKE) trial A=LINK_MPATROL_DYNAMIC D=LINK_MPATROL_DYNAMIC
	$(MAKE) trial A=LINK_MPATROL_DYNAMIC D=LINK_MPATROL_STATIC
	$(MAKE) trial A=LINK_MPATROL_STATIC  D=
	$(MAKE) trial A=LINK_MPATROL_STATIC  D=LINK_MPATROL_DYNAMIC
	$(MAKE) trial A=LINK_MPATROL_STATIC  D=LINK_MPATROL_STATIC

.PHONY: trial
trial:
	@$(ECHO) 'OPTIONS:' >> results
	@$(ECHO) '   MPATROL_FOR_APP=$(A)' >> results
	@$(ECHO) '   MPATROL_FOR_DLL=$(D)' >> results
	@$(ECHO) 'OPTIONS:' >> buildlog
	@$(ECHO) '   MPATROL_FOR_APP=$(A)' >> buildlog
	@$(ECHO) '   MPATROL_FOR_DLL=$(D)' >> buildlog
	@$(MAKE) -f Makefile clean
	@$(MAKE) -f Makefile \
	   MPATROL_FOR_APP=$(A) \
	   MPATROL_FOR_DLL=$(D) \
	              ECHO=$(ECHO) \
	               CXX=$(CXX) \
              CXXFLAGS=$(CXXFLAGS) \
	                RM=$(RM) \
	               SED=$(SED) \
	  MPATROL_DLL_PATH=$(MPATROL_DLL_PATH) \
	  MPATROL_LIB_PATH=$(MPATROL_LIB_PATH) \
	  >> buildlog 2>&1
	@./usedll.exe >> results
	@$(SED) <mpatrol.log -e'/\[[A-Z][A-Z]*\]/!d' >> results
	@$(SED) <mpatrol.log -e'/^total errors/!d'   >> results
	@$(ECHO) ' ' >> results
	@$(ECHO) ' ' >> buildlog
	@# Save the logs under distinctive names for later manual analysis.
	@$(CP) mpatrol.log app$(subst LINK_MPATROL_,,$(A))dll$(subst LINK_MPATROL_,,$(D)).log

.PHONY: clean
clean:
	$(MAKE) -f Makefile clean
	-$(RM) --force *log

.PHONY: realclean
realclean: clean
	-$(RM) --force results

# Don't remake this makefile.
GNUmakefile $(CURDIR)/GNUmakefile: ;

