1# $Id: Makefile.mingw,v 1.21 2015/09/18 12:45:16 nanard Exp $
2# Miniupnp project.
3# http://miniupnp.free.fr/ or https://miniupnp.tuxfamily.org/
4# (c) 2005-2020 Thomas Bernard
5# This Makefile is made for MinGW
6#
7# To cross compile on a *nix machine :
8# make -f Makefile.mingw DLLWRAP=mingw32-dllwrap CC=mingw32-gcc AR=mingw32-ar
9#
10CC ?= gcc
11SETUP_COMPILER_FLAG?=
12DLLWRAP = dllwrap
13WINDRES = windres
14SH = /bin/sh
15ZIP = zip
16ifeq ($(OS),Windows_NT)
17RM = del
18else
19RM = rm -f
20endif
21#CFLAGS = -Wall -g -DDEBUG -D_WIN32_WINNT=0X501
22CFLAGS = -Wall -W -Wstrict-prototypes -Os -DNDEBUG -D_WIN32_WINNT=0X501
23LDLIBS = -lws2_32 -liphlpapi
24# -lwsock32
25# -liphlpapi is needed for GetBestRoute() and GetIpAddrTable()
26PYTHON=\utils\python25\python
27OBJS=miniwget.o minixml.o igd_desc_parse.o minisoap.o \
28     minissdpc.o \
29     miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
30     connecthostport.o portlistingparse.o receivedata.o \
31     upnpdev.o addr_is_reserved.o
32OBJSDLL=$(addprefix dll-, $(OBJS)) winres.o
33BINARIES=upnpc-static.exe upnpc-shared.exe \
34         listdevices-static.exe listdevices-shared.exe \
35         miniupnpc.dll libminiupnpc.a \
36         testminixml.exe
37ifneq ($(GITHUB_SHA),)
38COMMITREF=$(GITHUB_SHA)
39else
40COMMITREF=$(shell git rev-parse --short HEAD)
41endif
42DISTFILE:=$(shell echo "miniupnpc-bin-win32-`cat VERSION`-$(COMMITREF).zip")
43
44.PHONY:	all dist clean
45
46all:	$(BINARIES)
47
48dist:	$(DISTFILE)
49
50clean:
51	$(RM) miniupnpcstrings.h
52	$(RM) *.o
53	$(RM) *.exe
54	$(RM) miniupnpc.dll miniupnpc.lib miniupnpc.dll.def
55	$(RM) libminiupnpc.a
56
57$(DISTFILE):	$(BINARIES)
58	$(ZIP) $@ *.exe *.dll *.lib *.def *.a LICENSE README Changelog.txt
59
60libminiupnpc.a:	$(OBJS)
61	$(AR) cr $@ $?
62
63pythonmodule:	libminiupnpc.a
64	$(PYTHON) setupmingw32.py build $(SETUP_COMPILER_FLAG)
65	$(PYTHON) setupmingw32.py install --skip-build
66	$(PYTHON) setupmingw32.py bdist_wheel --skip-build
67
68miniupnpc.dll:	miniupnpc.def $(OBJSDLL)
69	$(DLLWRAP) -k --driver-name $(CC) \
70	--def miniupnpc.def \
71	--output-def miniupnpc.dll.def \
72	--implib miniupnpc.lib -o $@ \
73	$(OBJSDLL) $(LDLIBS)
74
75miniupnpc.lib:	miniupnpc.dll
76
77%.o:	%.c
78	$(CC) $(CFLAGS) -DMINIUPNP_STATICLIB -c -o $@ $<
79
80dll-%.o:	%.c
81	$(CC) $(CFLAGS) -DMINIUPNP_EXPORTS -c -o $@ $<
82
83%-shared.o:	%.c
84	$(CC) $(CFLAGS) -c -o $@ $<
85
86# --enable-stdcall-fixup
87%-static.exe:	%.o libminiupnpc.a
88	$(CC) -static -o $@ $^ $(LDLIBS)
89
90%-shared.exe:	%-shared.o miniupnpc.lib
91	$(CC) -o $@ $^ $(LDLIBS)
92
93# To make miniupnpcstrings.h from miniupnpcstrings.h.in we either
94# use a custom executable (if running make under windows) or use
95# sed (if cross compiling from another platform).
96ifeq ($(OS),Windows_NT)
97wingenminiupnpcstrings.exe:	wingenminiupnpcstrings.c
98	$(CC) $(CFLAGS) -o $@ $^
99
100miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings.exe VERSION
101	wingenminiupnpcstrings.exe $< $@ rc_version.h
102
103rc_version.h:	miniupnpcstrings.h
104else
105miniupnpcstrings.h:	miniupnpcstrings.h.in VERSION
106	sed 's|OS_STRING ".*"|OS_STRING "Windows/Mingw32"|' $< | \
107	sed 's|MINIUPNPC_VERSION_STRING ".*"|MINIUPNPC_VERSION_STRING "$(shell cat VERSION)"|' > $@
108
109rc_version.h:	VERSION
110	echo "#define LIBMINIUPNPC_DOTTED_VERSION \"$(shell cat VERSION)\"" > $@.tmp
111	echo "#define LIBMINIUPNPC_MAJOR_VERSION $(shell cat VERSION|cut -d. -f1)" >> $@.tmp
112	echo "#define LIBMINIUPNPC_MINOR_VERSION $(shell cat VERSION|cut -d. -f2)" >> $@.tmp
113	echo "#define LIBMINIUPNPC_MICRO_VERSION $(shell cat VERSION|cut -d. -f3)" >> $@.tmp
114	mv $@.tmp $@
115endif
116
117winres.o:	miniupnpc.rc rc_version.h
118	$(WINDRES) -D INTERNAL_NAME=\\\"miniupnpc.dll\\0\\\" -i $< -o $@
119
120testminixml.exe:	testminixml.o minixml.o igd_desc_parse.o
121	$(CC) -static -o $@ $^
122
123minixml.o:	minixml.c minixml.h
124
125upnpc.o:	miniwget.h minisoap.h miniupnpc.h igd_desc_parse.h
126upnpc.o:	upnpreplyparse.h upnpcommands.h upnperrors.h miniupnpcstrings.h
127
128miniwget.o:	miniwget.c miniwget.h miniupnpcstrings.h connecthostport.h
129
130minisoap.o:	minisoap.c minisoap.h miniupnpcstrings.h
131
132miniupnpc.o:	miniupnpc.c miniupnpc.h minisoap.h miniwget.h minixml.h \
133	addr_is_reserved.h
134
135igd_desc_parse.o:	igd_desc_parse.c igd_desc_parse.h
136
137upnpreplyparse.o:	upnpreplyparse.c upnpreplyparse.h minixml.h
138
139upnpcommands.o:	upnpcommands.c upnpcommands.h upnpreplyparse.h miniupnpc.h portlistingparse.h
140
141minissdpc.o:	minissdpc.c minissdpc.h receivedata.h
142
143upnpdev.o:	upnpdev.c upnpdev.h
144
145