# $Id: Makefile.mingw,v 1.21 2015/09/18 12:45:16 nanard Exp $
# Miniupnp project.
# http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
# (c) 2005-2020 Thomas Bernard
# This Makefile is made for MinGW
#
# To cross compile on a *nix machine :
# make -f Makefile.mingw DLLWRAP=mingw32-dllwrap CC=mingw32-gcc AR=mingw32-ar WINDRES=mingw32-windres
#
SRCDIR = src
INCDIR = include

CC ?= gcc
SETUP_COMPILER_FLAG?=
DLLWRAP = dllwrap
WINDRES = windres
SH = /bin/sh
ZIP = zip
ifeq ($(OS),Windows_NT)
RM = del
else
RM = rm -f
endif

CFLAGS ?= -Os
CFLAGS += -Wall
CFLAGS += -W -Wstrict-prototypes

CPPFLAGS += -DNDEBUG -D_WIN32_WINNT=0x501
CPPFLAGS += -Iinclude
CPPFLAGS += -I.

# -liphlpapi is needed for GetBestRoute() and GetIpAddrTable()
LDLIBS = -lws2_32 -liphlpapi

PYTHON=\utils\python25\python
OBJS=miniwget.o minixml.o igd_desc_parse.o minisoap.o \
     minissdpc.o \
     miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
     connecthostport.o portlistingparse.o receivedata.o \
     upnpdev.o addr_is_reserved.o
OBJSDLL=$(addprefix dll-, $(OBJS)) winres.o
BINARIES=upnpc-static.exe upnpc-shared.exe \
         listdevices-static.exe listdevices-shared.exe \
         miniupnpc.dll libminiupnpc.a \
         testminixml.exe
ifneq ($(GITHUB_SHA),)
COMMITREF=$(GITHUB_SHA)
else
ifneq ($(CI_COMMIT_SHORT_SHA),)
COMMITREF=$(CI_COMMIT_SHORT_SHA)
else
COMMITREF=$(shell git rev-parse --short HEAD)
endif
endif
DISTFILE:=$(shell echo "miniupnpc-bin-win32-`cat VERSION`-$(COMMITREF).zip")

LIBDIR ?= lib
# install directories
ifeq ($(strip $(PREFIX)),)
INSTALLPREFIX ?= /usr
else
INSTALLPREFIX ?= $(PREFIX)
endif

.PHONY:	all dist clean

all:	$(BINARIES)

dist:	$(DISTFILE)

clean:
	$(RM) miniupnpcstrings.h
	$(RM) *.o
	$(RM) *.exe
	$(RM) miniupnpc.dll miniupnpc.lib miniupnpc.dll.def
	$(RM) libminiupnpc.a
	$(RM) $(DISTFILE)

$(DISTFILE):	$(BINARIES)
	$(ZIP) $@ *.exe *.dll *.lib *.def *.a LICENSE README Changelog.txt

libminiupnpc.a:	$(OBJS)
	$(AR) cr $@ $?

pythonmodule:	libminiupnpc.a
	$(PYTHON) setupmingw32.py build $(SETUP_COMPILER_FLAG)
	$(PYTHON) setupmingw32.py install --skip-build
	$(PYTHON) setupmingw32.py bdist_wheel --skip-build

miniupnpc.dll:	miniupnpc.def $(OBJSDLL)
	$(DLLWRAP) -k --driver-name $(CC) \
	--def miniupnpc.def \
	--output-def miniupnpc.dll.def \
	--implib miniupnpc.lib -o $@ \
	$(OBJSDLL) $(LDLIBS)

miniupnpc.lib:	miniupnpc.dll

%.o:	$(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<

dll-%.o:	$(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -DMINIUPNP_EXPORTS -c -o $@ $<

%-shared.o:	$(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

# --enable-stdcall-fixup
%-static.exe:	%.o libminiupnpc.a
	$(CC) -static -o $@ $^ $(LDLIBS)

%-shared.exe:	%-shared.o miniupnpc.lib
	$(CC) -o $@ $^ $(LDLIBS)

# To make miniupnpcstrings.h from miniupnpcstrings.h.in we either
# use a custom executable (if running make under windows) or use
# sed (if cross compiling from another platform).
ifeq ($(OS),Windows_NT)
wingenminiupnpcstrings.exe:	wingenminiupnpcstrings.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^

miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings.exe VERSION
	.\wingenminiupnpcstrings.exe $< $@ rc_version.h

rc_version.h:	miniupnpcstrings.h
else
miniupnpcstrings.h:	miniupnpcstrings.h.in VERSION
	sed 's|OS_STRING ".*"|OS_STRING "Windows/Mingw32"|' $< | \
	sed 's|MINIUPNPC_VERSION_STRING ".*"|MINIUPNPC_VERSION_STRING "$(shell cat VERSION)"|' > $@

rc_version.h:	VERSION
	echo "#define LIBMINIUPNPC_DOTTED_VERSION \"$(shell cat VERSION)\"" > $@.tmp
	echo "#define LIBMINIUPNPC_MAJOR_VERSION $(shell cat VERSION|cut -d. -f1)" >> $@.tmp
	echo "#define LIBMINIUPNPC_MINOR_VERSION $(shell cat VERSION|cut -d. -f2)" >> $@.tmp
	echo "#define LIBMINIUPNPC_MICRO_VERSION $(shell cat VERSION|cut -d. -f3)" >> $@.tmp
	mv $@.tmp $@
endif

miniupnpc.pc:	VERSION
	$(RM) $@
	echo "prefix=$(INSTALLPREFIX)" >> $@
	echo "exec_prefix=\$${prefix}" >> $@
	echo "libdir=\$${exec_prefix}/$(LIBDIR)" >> $@
	echo "includedir=\$${prefix}/include" >> $@
	echo "" >> $@
	echo "Name: miniUPnPc" >> $@
	echo "Description: UPnP IGD client lightweight library" >> $@
	echo "Version: $(shell cat VERSION)" >> $@
	echo "Libs: -L\$${libdir} -lminiupnpc" >> $@
	echo "Cflags: -I\$${includedir}" >> $@

winres.o:	miniupnpc.rc rc_version.h
	$(WINDRES) -D INTERNAL_NAME=\\\"miniupnpc.dll\\0\\\" -i $< -o $@

testminixml.exe:	testminixml.o minixml.o igd_desc_parse.o
	$(CC) -static -o $@ $^

minixml.o:	$(SRCDIR)/minixml.c $(SRCDIR)/minixml.h

upnpc.o:	include/miniwget.h $(SRCDIR)/minisoap.h include/miniupnpc.h include/igd_desc_parse.h
upnpc.o:	include/upnpreplyparse.h include/upnpcommands.h include/upnperrors.h miniupnpcstrings.h

miniwget.o:	$(SRCDIR)/miniwget.c include/miniwget.h miniupnpcstrings.h $(SRCDIR)/connecthostport.h

minisoap.o:	$(SRCDIR)/minisoap.c $(SRCDIR)/minisoap.h miniupnpcstrings.h

miniupnpc.o:	$(SRCDIR)/miniupnpc.c include/miniupnpc.h $(SRCDIR)/minisoap.h \
	include/miniwget.h $(SRCDIR)/minixml.h $(SRCDIR)/addr_is_reserved.h

igd_desc_parse.o:	$(SRCDIR)/igd_desc_parse.c include/igd_desc_parse.h

upnpreplyparse.o:	$(SRCDIR)/upnpreplyparse.c include/upnpreplyparse.h $(SRCDIR)/minixml.h

upnpcommands.o:	$(SRCDIR)/upnpcommands.c include/upnpcommands.h include/upnpreplyparse.h \
	include/miniupnpc.h include/portlistingparse.h

minissdpc.o:	$(SRCDIR)/minissdpc.c $(SRCDIR)/minissdpc.h $(SRCDIR)/receivedata.h

upnpdev.o:	$(SRCDIR)/upnpdev.c include/upnpdev.h

