# This makefile is designed to be called by the accompanying GNUmakefile
# and used with gnu make under msw with a *nix shell.

LINK_MPATROL_DYNAMIC = -L$(MPATROL_DLL_PATH) -lmpatrol_dll
LINK_MPATROL_STATIC  = -L$(MPATROL_LIB_PATH) -lmpatrol -lbfd -liberty -limagehlp

# This causes printf to be used instead of ostreams. There is a reported
# problem using printf with mpatrol, because mpatrol uses printf to print
# its log. But using ostreams instead engenders spurious NOTALL errors
# in many scenarios.
#CPPFLAGS=-DUSE_PRINTF

# Defining 'USE_INLINE_FREE' causes memory to be allocated in an exe and
# freed in a dll. Normally you should leave it defined, because that's
# a major purpose of this demonstration.
ALL_CPPFLAGS = $(CPPFLAGS) -I. -DUSE_INLINE_FREE

DLL_NAME = cxxdll.dll
DLL_EXP_LIB = libcxxdll.a

TESTPROGS = usedll.exe nodll.exe

.PHONY: all
all: $(DLL_NAME) $(TESTPROGS)

SRCS  = $(wildcard *.cpp *.c)
OBJS  = $(SRCS:.cpp=.o)
OBJS := $(OBJS:.c=.o)

# Must define BUILDING_DLL when building the DLL. Otherwise import/exports
# will not work correctly. See dllclass.hpp for more info.
DLL_CPPFLAGS = -DBUILDING_DLL=1

DLL_SRCS  = dllclass.cpp
DLL_OBJS  = $(DLL_SRCS:.cpp=.o)
DLL_OBJS := $(DLL_OBJS:.c=.o)

$(DLL_NAME) $(DLL_EXP_LIB): $(DLL_OBJS)
	g++ -shared -Wl,--out-implib=$(DLL_EXP_LIB) $(LDFLAGS) \
	-o $(DLL_NAME) $(DLL_OBJS) \
    $($(MPATROL_FOR_DLL)) \

# The mpatrol library should be linked before the user dll.

usedll.exe: usedll.o $(DLL_EXP_LIB)
	$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) usedll.o \
    $($(MPATROL_FOR_APP)) \
    -L. -lcxxdll \

nodll.exe: nodll.o
	$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) nodll.o \
    $($(MPATROL_FOR_APP)) \

# Use $(DLL_CPPFLAGS) for dll objects.

dllclass.o: dllclass.cpp dllclass.hpp
dllclass.o: %o: %cpp
	$(CXX) -c $(DLL_CPPFLAGS) $(ALL_CPPFLAGS) $(CXXFLAGS) -o $@ $<

# Do not use $(DLL_CPPFLAGS) for client programs.

usedll.o: usedll.cpp dllclass.hpp
usedll.o: %o: %cpp
	$(CXX) -c $(ALL_CPPFLAGS) $(CXXFLAGS) -o $@ $<

nodll.o: nodll.cpp dllclass.hpp
nodll.o: %o: %cpp
	$(CXX) -c $(ALL_CPPFLAGS) $(CXXFLAGS) -o $@ $<

clean:
	-$(RM) -f $(OBJS) $(DLL_NAME) $(DLL_EXP_LIB) $(TESTPROGS)
	-$(RM) -f mpatrol.log

# Don't remake this makefile.
Makefile: ;

