1# $Id: Makefile,v 1.104 2013/05/03 09:05:38 nanard Exp $
2# MiniUPnP Project
3# http://miniupnp.free.fr/
4# http://miniupnp.tuxfamily.org/
5# https://github.com/miniupnp/miniupnp
6# (c) 2005-2013 Thomas Bernard
7# to install use :
8# $ make DESTDIR=/tmp/dummylocation install
9# or
10# $ INSTALLPREFIX=/usr/local make install
11# or
12# $ make install (default INSTALLPREFIX is /usr)
13OS = $(shell uname -s)
14VERSION = $(shell cat VERSION)
15
16ifeq ($(OS), Darwin)
17JARSUFFIX=mac
18endif
19ifeq ($(OS), Linux)
20JARSUFFIX=linux
21endif
22ifneq (,$(findstring NT-5.1,$(OS)))
23JARSUFFIX=win32
24endif
25
26HAVE_IPV6 ?= yes
27export HAVE_IPV6
28
29CC ?= gcc
30#AR = gar
31#CFLAGS = -O -g -DDEBUG
32CFLAGS ?= -O
33CFLAGS += -Wall
34CFLAGS += -W -Wstrict-prototypes
35CFLAGS += -fno-common
36CFLAGS += -DMINIUPNPC_SET_SOCKET_TIMEOUT
37CFLAGS += -DMINIUPNPC_GET_SRC_ADDR
38CFLAGS += -D_BSD_SOURCE -D_POSIX_C_SOURCE=1
39CFLAGS += -ansi
40# -DNO_GETADDRINFO
41INSTALL = install
42SH = /bin/sh
43JAVA = java
44# see http://code.google.com/p/jnaerator/
45#JNAERATOR = jnaerator-0.9.7.jar
46#JNAERATOR = jnaerator-0.9.8-shaded.jar
47#JNAERATORARGS = -library miniupnpc
48#JNAERATOR = jnaerator-0.10-shaded.jar
49JNAERATOR = jnaerator-0.11-shaded.jar
50JNAERATORARGS = -mode StandaloneJar -runtime JNAerator -library miniupnpc
51JNAERATORBASEURL = http://jnaerator.googlecode.com/files/
52
53ifeq (SunOS, $(OS))
54  LDFLAGS=-lsocket -lnsl -lresolv
55endif
56
57# APIVERSION is used to build SONAME
58APIVERSION = 9
59
60SRCS = igd_desc_parse.c miniupnpc.c minixml.c minisoap.c miniwget.c \
61       upnpc.c upnpcommands.c upnpreplyparse.c testminixml.c \
62	   minixmlvalid.c testupnpreplyparse.c minissdpc.c \
63	   upnperrors.c testigddescparse.c testminiwget.c \
64       connecthostport.c portlistingparse.c receivedata.c
65
66LIBOBJS = miniwget.o minixml.o igd_desc_parse.o minisoap.o \
67          miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
68          connecthostport.o portlistingparse.o receivedata.o
69
70ifneq ($(OS), AmigaOS)
71CFLAGS := -fPIC $(CFLAGS)
72LIBOBJS := $(LIBOBJS) minissdpc.o
73endif
74
75OBJS = $(patsubst %.c,%.o,$(SRCS))
76
77# HEADERS to install
78HEADERS = miniupnpc.h miniwget.h upnpcommands.h igd_desc_parse.h \
79          upnpreplyparse.h upnperrors.h miniupnpctypes.h \
80          portlistingparse.h \
81          declspec.h
82
83# library names
84LIBRARY = libminiupnpc.a
85ifeq ($(OS), Darwin)
86  SHAREDLIBRARY = libminiupnpc.dylib
87  SONAME = $(basename $(SHAREDLIBRARY)).$(APIVERSION).dylib
88  CFLAGS := -DMACOSX -D_DARWIN_C_SOURCE $(CFLAGS)
89else
90ifeq ($(JARSUFFIX), win32)
91  SHAREDLIBRARY = miniupnpc.dll
92else
93  # Linux/BSD/etc.
94  SHAREDLIBRARY = libminiupnpc.so
95  SONAME = $(SHAREDLIBRARY).$(APIVERSION)
96endif
97endif
98
99EXECUTABLES = upnpc-static
100EXECUTABLES_ADDTESTS = testminixml minixmlvalid testupnpreplyparse \
101			  testigddescparse testminiwget
102
103TESTMINIXMLOBJS = minixml.o igd_desc_parse.o testminixml.o
104
105TESTMINIWGETOBJS = miniwget.o testminiwget.o connecthostport.o receivedata.o
106
107TESTUPNPREPLYPARSE = testupnpreplyparse.o minixml.o upnpreplyparse.o
108
109TESTIGDDESCPARSE = testigddescparse.o igd_desc_parse.o minixml.o \
110                   miniupnpc.o miniwget.o upnpcommands.o upnpreplyparse.o \
111                   minisoap.o connecthostport.o receivedata.o \
112                   portlistingparse.o
113
114ifneq ($(OS), AmigaOS)
115EXECUTABLES := $(EXECUTABLES) upnpc-shared
116TESTMINIWGETOBJS := $(TESTMINIWGETOBJS) minissdpc.o
117TESTIGDDESCPARSE := $(TESTIGDDESCPARSE) minissdpc.o
118endif
119
120LIBDIR ?= lib
121# install directories
122INSTALLPREFIX ?= $(PREFIX)/usr
123INSTALLDIRINC = $(INSTALLPREFIX)/include/miniupnpc
124INSTALLDIRLIB = $(INSTALLPREFIX)/$(LIBDIR)
125INSTALLDIRBIN = $(INSTALLPREFIX)/bin
126INSTALLDIRMAN = $(INSTALLPREFIX)/share/man
127
128FILESTOINSTALL = $(LIBRARY) $(EXECUTABLES)
129ifneq ($(OS), AmigaOS)
130FILESTOINSTALL := $(FILESTOINSTALL) $(SHAREDLIBRARY)
131endif
132
133
134.PHONY:	install clean depend all check test everything \
135	installpythonmodule updateversion
136#	validateminixml validateminiwget
137
138all:	$(LIBRARY) $(EXECUTABLES)
139
140test:	check
141
142check:	validateminixml validateminiwget
143
144everything:	all $(EXECUTABLES_ADDTESTS)
145
146pythonmodule:	$(LIBRARY) miniupnpcmodule.c setup.py
147	python setup.py build
148	touch $@
149
150installpythonmodule:	pythonmodule
151	python setup.py install
152
153pythonmodule3:	$(LIBRARY) miniupnpcmodule.c setup.py
154	python3 setup.py build
155	touch $@
156
157installpythonmodule3:	pythonmodule3
158	python3 setup.py install
159
160validateminixml:	minixmlvalid
161	@echo "minixml validation test"
162	./minixmlvalid
163	touch $@
164
165validateminiwget:	testminiwget minihttptestserver testminiwget.sh
166	@echo "miniwget validation test"
167	./testminiwget.sh
168	touch $@
169
170clean:
171	$(RM) $(LIBRARY) $(SHAREDLIBRARY) $(EXECUTABLES) $(OBJS) miniupnpcstrings.h
172	# clean python stuff
173	$(RM) pythonmodule pythonmodule3 validateminixml validateminiwget
174	$(RM) -r build/ dist/
175	#python setup.py clean
176	# clean jnaerator stuff
177	$(RM) _jnaerator.* java/miniupnpc_$(OS).jar
178
179distclean: clean
180	$(RM) $(JNAERATOR) java/*.jar java/*.class out.errors.txt
181
182updateversion:	miniupnpc.h
183	cp miniupnpc.h miniupnpc.h.bak
184	sed 's/\(.*MINIUPNPC_API_VERSION\s\+\)[0-9]\+/\1$(APIVERSION)/' < miniupnpc.h.bak > miniupnpc.h
185
186install:	updateversion $(FILESTOINSTALL)
187	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRINC)
188	$(INSTALL) -m 644 $(HEADERS) $(DESTDIR)$(INSTALLDIRINC)
189	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRLIB)
190	$(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(INSTALLDIRLIB)
191ifneq ($(OS), AmigaOS)
192	$(INSTALL) -m 644 $(SHAREDLIBRARY) $(DESTDIR)$(INSTALLDIRLIB)/$(SONAME)
193	ln -fs $(SONAME) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
194endif
195	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRBIN)
196ifeq ($(OS), AmigaOS)
197	$(INSTALL) -m 755 upnpc-static $(DESTDIR)$(INSTALLDIRBIN)/upnpc
198else
199	$(INSTALL) -m 755 upnpc-shared $(DESTDIR)$(INSTALLDIRBIN)/upnpc
200endif
201	$(INSTALL) -m 755 external-ip.sh $(DESTDIR)$(INSTALLDIRBIN)/external-ip
202ifneq ($(OS), AmigaOS)
203	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRMAN)/man3
204	$(INSTALL) man3/miniupnpc.3 $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
205ifeq ($(OS), Linux)
206	gzip $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
207endif
208endif
209
210
211cleaninstall:
212	$(RM) -r $(DESTDIR)$(INSTALLDIRINC)
213	$(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(LIBRARY)
214	$(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
215
216depend:
217	makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null
218
219$(LIBRARY):	$(LIBOBJS)
220	$(AR) crs $@ $?
221
222$(SHAREDLIBRARY):	$(LIBOBJS)
223ifeq ($(OS), Darwin)
224#	$(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(SONAME) -o $@ $^
225	$(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(INSTALLDIRLIB)/$(SONAME) -o $@ $^
226else
227	$(CC) -shared $(LDFLAGS) -Wl,-soname,$(SONAME) -o $@ $^
228endif
229
230upnpc-static:	upnpc.o $(LIBRARY)
231	$(CC) $(LDFLAGS) -o $@ $^
232
233upnpc-shared:	upnpc.o $(SHAREDLIBRARY)
234	$(CC) $(LDFLAGS) -o $@ $^
235
236testminixml:	$(TESTMINIXMLOBJS)
237
238testminiwget:	$(TESTMINIWGETOBJS)
239
240minixmlvalid:	minixml.o minixmlvalid.o
241
242testupnpreplyparse:	$(TESTUPNPREPLYPARSE)
243
244testigddescparse:	$(TESTIGDDESCPARSE)
245
246miniupnpcstrings.h:	miniupnpcstrings.h.in updateminiupnpcstrings.sh VERSION
247	$(SH) updateminiupnpcstrings.sh
248
249# ftp tool supplied with OpenBSD can download files from http.
250jnaerator-%.jar:
251	wget $(JNAERATORBASEURL)/$@ || \
252	curl -o $@ $(JNAERATORBASEURL)/$@ || \
253	ftp $(JNAERATORBASEURL)/$@
254
255jar: $(SHAREDLIBRARY)  $(JNAERATOR)
256	$(JAVA) -jar $(JNAERATOR) $(JNAERATORARGS) \
257	miniupnpc.h declspec.h upnpcommands.h upnpreplyparse.h \
258	igd_desc_parse.h miniwget.h upnperrors.h $(SHAREDLIBRARY) \
259	-package fr.free.miniupnp -o . -jar java/miniupnpc_$(JARSUFFIX).jar -v
260
261mvn_install:
262	mvn install:install-file -Dfile=java/miniupnpc_$(JARSUFFIX).jar \
263	 -DgroupId=com.github \
264	 -DartifactId=miniupnp \
265	 -Dversion=$(VERSION) \
266	 -Dpackaging=jar \
267	 -Dclassifier=$(JARSUFFIX) \
268	 -DgeneratePom=true \
269	 -DcreateChecksum=true
270
271# make .deb packages
272deb: /usr/share/pyshared/stdeb all
273	(python setup.py --command-packages=stdeb.command bdist_deb)
274
275# install .deb packages
276ideb:
277	(sudo dpkg -i deb_dist/*.deb)
278
279/usr/share/pyshared/stdeb: /usr/share/doc/python-all-dev
280	(sudo apt-get install python-stdeb)
281
282/usr/share/doc/python-all-dev:
283	(sudo apt-get install python-all-dev)
284
285minihttptestserver:	minihttptestserver.o
286
287# DO NOT DELETE THIS LINE -- make depend depends on it.
288
289igd_desc_parse.o: igd_desc_parse.h
290miniupnpc.o: miniupnpc.h declspec.h igd_desc_parse.h minissdpc.h miniwget.h
291miniupnpc.o: minisoap.h minixml.h upnpcommands.h upnpreplyparse.h
292miniupnpc.o: portlistingparse.h miniupnpctypes.h connecthostport.h
293miniupnpc.o: receivedata.h
294minixml.o: minixml.h
295minisoap.o: minisoap.h miniupnpcstrings.h
296miniwget.o: miniupnpcstrings.h miniwget.h declspec.h connecthostport.h
297miniwget.o: receivedata.h
298upnpc.o: miniwget.h declspec.h miniupnpc.h igd_desc_parse.h upnpcommands.h
299upnpc.o: upnpreplyparse.h portlistingparse.h miniupnpctypes.h upnperrors.h
300upnpcommands.o: upnpcommands.h upnpreplyparse.h portlistingparse.h declspec.h
301upnpcommands.o: miniupnpctypes.h miniupnpc.h igd_desc_parse.h
302upnpreplyparse.o: upnpreplyparse.h minixml.h
303testminixml.o: minixml.h igd_desc_parse.h
304minixmlvalid.o: minixml.h
305testupnpreplyparse.o: upnpreplyparse.h
306minissdpc.o: minissdpc.h miniupnpc.h declspec.h igd_desc_parse.h codelength.h
307upnperrors.o: upnperrors.h declspec.h upnpcommands.h upnpreplyparse.h
308upnperrors.o: portlistingparse.h miniupnpctypes.h miniupnpc.h
309upnperrors.o: igd_desc_parse.h
310testigddescparse.o: igd_desc_parse.h minixml.h miniupnpc.h declspec.h
311testminiwget.o: miniwget.h declspec.h
312connecthostport.o: connecthostport.h
313receivedata.o: receivedata.h
314