#
# Makefile for Cygwin.
#
CC ?= gcc
CXX ?= c++

DEBUG = -g -Wall #-O2
CXXFLAGS = $(DEBUG)
CFLAGS = $(DEBUG)
CPPFLAGS = -I.
LDFLAGS = 

exeext = .exe

#
# Various targets to build.
#
DLL_NAME = cygcdll.dll
DLL_EXP_LIB = libcdll.dll.a
DLL_EXP_DEF = libcdll.def

TESTPROGS = usedll$(exeext)

all: $(DLL_NAME) $(TESTPROGS)

#
# sources, objects, etc. 
#
SRCS := $(wildcard *.cc *.c)
OBJS := $(SRCS:.cc=.o)
OBJS := $(OBJS:.c=.o)

#
# DLL related variables. These are used when building the DLL. See later.
#

# The default entry point defined by dllwrap; the default user callback
# is DllMain, and there is stub in dllinit.c. 
DLL_LDFLAGS = -Wl,--export-all-symbols
# any extra libraries that your DLL may depend on.
DLL_LDLIBS = 

DLL_SRCS  = cdll.c 
DLL_OBJS := $(DLL_SRCS:.cc=.o)
DLL_OBJS := $(DLL_OBJS:.c=.o)

###
#
# Making DLL
#
###

$(DLL_NAME) $(DLL_EXP_DEF) $(DLL_EXP_LIB): $(DLL_OBJS)
	gcc -shared -Wl,--out-implib=$(DLL_EXP_LIB) \
	-o $(DLL_NAME) $(DLL_OBJS) $(DLL_LDFLAGS) $(DLL_LDLIBS)

#
# making exec
#
usedll$(exeext): usedll.o $(DLL_EXP_LIB)
	$(CC) -o $@ $(CFLAGS) $(LDFLAGS) usedll.o -L./ -lcdll

#
# dependencies.
#

$(OBJS): cdll.h
cdll.o: cdll.c
usedll.o: usedll.c

#
# default rules for building DLL objects. Note that client programs (ie.,
# the ones that *use* the DLL) have to be compiled without the DLL_CFLAGS
# flags.
#
.cc.o:
	$(CXX) -c $(DLL_CFLAGS) $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
.c.o:
	$(CC) -c $(DLL_CFLAGS) $(CPPFLAGS) $(CFLAGS) -o $@ $<

# Note that we omit the $(DLL_CFLAGS) for client programs.
usedll.o: %o: %c
	$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<

clean:
	-rm -f $(OBJS) $(DLL_NAME) $(DLL_EXP_LIB) $(DLL_EXP_DEF) $(TESTPROGS)

