1# $Id: Makefile,v 1.131 2015/10/08 16:15:46 nanard Exp $
2# MiniUPnP Project
3# http://miniupnp.free.fr/
4# http://miniupnp.tuxfamily.org/
5# https://github.com/miniupnp/miniupnp
6# (c) 2005-2015 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
39CFLAGS += -D_DEFAULT_SOURCE
40ifneq ($(OS), FreeBSD)
41ifneq ($(OS), Darwin)
42#CFLAGS += -D_POSIX_C_SOURCE=200112L
43CFLAGS += -D_XOPEN_SOURCE=600
44endif
45endif
46#CFLAGS += -ansi
47# -DNO_GETADDRINFO
48INSTALL = install
49SH = /bin/sh
50JAVA = java
51# see http://code.google.com/p/jnaerator/
52#JNAERATOR = jnaerator-0.9.7.jar
53#JNAERATOR = jnaerator-0.9.8-shaded.jar
54#JNAERATORARGS = -library miniupnpc
55#JNAERATOR = jnaerator-0.10-shaded.jar
56#JNAERATOR = jnaerator-0.11-shaded.jar
57# https://repo1.maven.org/maven2/com/nativelibs4java/jnaerator/0.12/jnaerator-0.12-shaded.jar
58JNAERATOR = jnaerator-0.12-shaded.jar
59JNAERATORARGS = -mode StandaloneJar -runtime JNAerator -library miniupnpc
60#JNAERATORBASEURL = http://jnaerator.googlecode.com/files/
61JNAERATORBASEURL = https://repo1.maven.org/maven2/com/nativelibs4java/jnaerator/0.12
62
63ifeq (SunOS, $(OS))
64  LDFLAGS=-lsocket -lnsl -lresolv
65endif
66
67# APIVERSION is used to build SONAME
68APIVERSION = 15
69
70SRCS = igd_desc_parse.c miniupnpc.c minixml.c minisoap.c miniwget.c \
71       upnpc.c upnpcommands.c upnpreplyparse.c testminixml.c \
72       minixmlvalid.c testupnpreplyparse.c minissdpc.c \
73       upnperrors.c testigddescparse.c testminiwget.c \
74       connecthostport.c portlistingparse.c receivedata.c \
75       upnpdev.c testportlistingparse.c miniupnpcmodule.c \
76       minihttptestserver.c \
77       listdevices.c
78
79LIBOBJS = miniwget.o minixml.o igd_desc_parse.o minisoap.o \
80          miniupnpc.o upnpreplyparse.o upnpcommands.o upnperrors.o \
81          connecthostport.o portlistingparse.o receivedata.o upnpdev.o
82
83ifneq ($(OS), AmigaOS)
84CFLAGS := -fPIC $(CFLAGS)
85LIBOBJS := $(LIBOBJS) minissdpc.o
86endif
87
88OBJS = $(patsubst %.c,%.o,$(SRCS))
89
90# HEADERS to install
91HEADERS = miniupnpc.h miniwget.h upnpcommands.h igd_desc_parse.h \
92          upnpreplyparse.h upnperrors.h miniupnpctypes.h \
93          portlistingparse.h \
94          upnpdev.h \
95          miniupnpc_declspec.h
96
97# library names
98LIBRARY = libminiupnpc.a
99ifeq ($(OS), Darwin)
100  SHAREDLIBRARY = libminiupnpc.dylib
101  SONAME = $(basename $(SHAREDLIBRARY)).$(APIVERSION).dylib
102  CFLAGS := -D_DARWIN_C_SOURCE $(CFLAGS)
103else
104ifeq ($(JARSUFFIX), win32)
105  SHAREDLIBRARY = miniupnpc.dll
106else
107  # Linux/BSD/etc.
108  SHAREDLIBRARY = libminiupnpc.so
109  SONAME = $(SHAREDLIBRARY).$(APIVERSION)
110endif
111endif
112
113EXECUTABLES = upnpc-static listdevices
114EXECUTABLES_ADDTESTS = testminixml minixmlvalid testupnpreplyparse \
115			  testigddescparse testminiwget testportlistingparse
116
117TESTMINIXMLOBJS = minixml.o igd_desc_parse.o testminixml.o
118
119TESTMINIWGETOBJS = miniwget.o testminiwget.o connecthostport.o receivedata.o
120
121TESTUPNPREPLYPARSE = testupnpreplyparse.o minixml.o upnpreplyparse.o
122
123TESTPORTLISTINGPARSE = testportlistingparse.o minixml.o portlistingparse.o
124
125TESTIGDDESCPARSE = testigddescparse.o igd_desc_parse.o minixml.o \
126                   miniupnpc.o miniwget.o upnpcommands.o upnpreplyparse.o \
127                   minisoap.o connecthostport.o receivedata.o \
128                   portlistingparse.o
129
130ifneq ($(OS), AmigaOS)
131EXECUTABLES := $(EXECUTABLES) upnpc-shared
132TESTMINIWGETOBJS := $(TESTMINIWGETOBJS) minissdpc.o
133TESTIGDDESCPARSE := $(TESTIGDDESCPARSE) minissdpc.o
134endif
135
136LIBDIR ?= lib
137# install directories
138INSTALLPREFIX ?= $(PREFIX)/usr
139INSTALLDIRINC = $(INSTALLPREFIX)/include/miniupnpc
140INSTALLDIRLIB = $(INSTALLPREFIX)/$(LIBDIR)
141INSTALLDIRBIN = $(INSTALLPREFIX)/bin
142INSTALLDIRMAN = $(INSTALLPREFIX)/share/man
143
144FILESTOINSTALL = $(LIBRARY) $(EXECUTABLES)
145ifneq ($(OS), AmigaOS)
146FILESTOINSTALL := $(FILESTOINSTALL) $(SHAREDLIBRARY)
147endif
148
149
150.PHONY:	install clean depend all check test everything \
151	installpythonmodule updateversion
152#	validateminixml validateminiwget
153
154all:	$(LIBRARY) $(EXECUTABLES)
155
156test:	check
157
158check:	validateminixml validateminiwget validateupnpreplyparse \
159	validateportlistingparse validateigddescparse
160
161everything:	all $(EXECUTABLES_ADDTESTS)
162
163pythonmodule:	$(LIBRARY) miniupnpcmodule.c setup.py
164	python setup.py build
165	touch $@
166
167installpythonmodule:	pythonmodule
168	python setup.py install
169
170pythonmodule3:	$(LIBRARY) miniupnpcmodule.c setup.py
171	python3 setup.py build
172	touch $@
173
174installpythonmodule3:	pythonmodule3
175	python3 setup.py install
176
177validateminixml:	minixmlvalid
178	@echo "minixml validation test"
179	./minixmlvalid
180	touch $@
181
182validateminiwget:	testminiwget minihttptestserver testminiwget.sh
183	@echo "miniwget validation test"
184	./testminiwget.sh
185	touch $@
186
187validateupnpreplyparse:	testupnpreplyparse testupnpreplyparse.sh
188	@echo "upnpreplyparse validation test"
189	./testupnpreplyparse.sh
190	touch $@
191
192validateportlistingparse:	testportlistingparse
193	@echo "portlistingparse validation test"
194	./testportlistingparse
195	touch $@
196
197validateigddescparse:	testigddescparse
198	@echo "igd desc parse validation test"
199	./testigddescparse testdesc/new_LiveBox_desc.xml testdesc/new_LiveBox_desc.values
200	./testigddescparse testdesc/linksys_WAG200G_desc.xml testdesc/linksys_WAG200G_desc.values
201	touch $@
202
203clean:
204	$(RM) $(LIBRARY) $(SHAREDLIBRARY) $(EXECUTABLES) $(OBJS) miniupnpcstrings.h
205	$(RM) $(EXECUTABLES_ADDTESTS)
206	# clean python stuff
207	$(RM) pythonmodule pythonmodule3
208	$(RM) validateminixml validateminiwget validateupnpreplyparse
209	$(RM) validateigddescparse
210	$(RM) minihttptestserver
211	$(RM) -r build/ dist/
212	#python setup.py clean
213	# clean jnaerator stuff
214	$(RM) _jnaerator.* java/miniupnpc_$(OS).jar
215
216distclean: clean
217	$(RM) $(JNAERATOR) java/*.jar java/*.class out.errors.txt
218
219updateversion:	miniupnpc.h
220	cp miniupnpc.h miniupnpc.h.bak
221	sed 's/\(.*MINIUPNPC_API_VERSION\s\+\)[0-9]\+/\1$(APIVERSION)/' < miniupnpc.h.bak > miniupnpc.h
222
223install:	updateversion $(FILESTOINSTALL)
224	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRINC)
225	$(INSTALL) -m 644 $(HEADERS) $(DESTDIR)$(INSTALLDIRINC)
226	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRLIB)
227	$(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(INSTALLDIRLIB)
228ifneq ($(OS), AmigaOS)
229	$(INSTALL) -m 644 $(SHAREDLIBRARY) $(DESTDIR)$(INSTALLDIRLIB)/$(SONAME)
230	ln -fs $(SONAME) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
231endif
232	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRBIN)
233ifeq ($(OS), AmigaOS)
234	$(INSTALL) -m 755 upnpc-static $(DESTDIR)$(INSTALLDIRBIN)/upnpc
235else
236	$(INSTALL) -m 755 upnpc-shared $(DESTDIR)$(INSTALLDIRBIN)/upnpc
237endif
238	$(INSTALL) -m 755 external-ip.sh $(DESTDIR)$(INSTALLDIRBIN)/external-ip
239ifneq ($(OS), AmigaOS)
240	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRMAN)/man3
241	$(INSTALL) -m 644 man3/miniupnpc.3 $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
242ifeq ($(OS), Linux)
243	gzip -f $(DESTDIR)$(INSTALLDIRMAN)/man3/miniupnpc.3
244endif
245endif
246
247install-static:	updateversion $(FILESTOINSTALL)
248	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRINC)
249	$(INSTALL) -m 644 $(HEADERS) $(DESTDIR)$(INSTALLDIRINC)
250	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRLIB)
251	$(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(INSTALLDIRLIB)
252	$(INSTALL) -d $(DESTDIR)$(INSTALLDIRBIN)
253	$(INSTALL) -m 755 external-ip.sh $(DESTDIR)$(INSTALLDIRBIN)/external-ip
254
255cleaninstall:
256	$(RM) -r $(DESTDIR)$(INSTALLDIRINC)
257	$(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(LIBRARY)
258	$(RM) $(DESTDIR)$(INSTALLDIRLIB)/$(SHAREDLIBRARY)
259
260depend:
261	makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null
262
263$(LIBRARY):	$(LIBOBJS)
264	$(AR) crs $@ $?
265
266$(SHAREDLIBRARY):	$(LIBOBJS)
267ifeq ($(OS), Darwin)
268#	$(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(SONAME) -o $@ $^
269	$(CC) -dynamiclib $(LDFLAGS) -Wl,-install_name,$(INSTALLDIRLIB)/$(SONAME) -o $@ $^
270else
271	$(CC) -shared $(LDFLAGS) -Wl,-soname,$(SONAME) -o $@ $^
272endif
273
274upnpc-static:	upnpc.o $(LIBRARY)
275	$(CC) $(LDFLAGS) -o $@ $^
276
277upnpc-shared:	upnpc.o $(SHAREDLIBRARY)
278	$(CC) $(LDFLAGS) -o $@ $^
279
280listdevices:	listdevices.o $(LIBRARY) $(LDLIBS)
281	$(CC) $(LDFLAGS) -o $@ $^
282
283testminixml:	$(TESTMINIXMLOBJS)
284
285testminiwget:	$(TESTMINIWGETOBJS)
286
287minixmlvalid:	minixml.o minixmlvalid.o
288
289testupnpreplyparse:	$(TESTUPNPREPLYPARSE)
290
291testigddescparse:	$(TESTIGDDESCPARSE)
292
293testportlistingparse:	$(TESTPORTLISTINGPARSE)
294
295miniupnpcstrings.h:	miniupnpcstrings.h.in updateminiupnpcstrings.sh VERSION
296	$(SH) updateminiupnpcstrings.sh
297
298# ftp tool supplied with OpenBSD can download files from http.
299jnaerator-%.jar:
300	wget $(JNAERATORBASEURL)/$@ || \
301	curl -o $@ $(JNAERATORBASEURL)/$@ || \
302	ftp $(JNAERATORBASEURL)/$@
303
304jar: $(SHAREDLIBRARY)  $(JNAERATOR)
305	$(JAVA) -jar $(JNAERATOR) $(JNAERATORARGS) \
306	miniupnpc.h miniupnpc_declspec.h upnpcommands.h upnpreplyparse.h \
307	igd_desc_parse.h miniwget.h upnperrors.h $(SHAREDLIBRARY) \
308	-package fr.free.miniupnp -o . -jar java/miniupnpc_$(JARSUFFIX).jar -v
309
310mvn_install:
311	mvn install:install-file -Dfile=java/miniupnpc_$(JARSUFFIX).jar \
312	 -DgroupId=com.github \
313	 -DartifactId=miniupnp \
314	 -Dversion=$(VERSION) \
315	 -Dpackaging=jar \
316	 -Dclassifier=$(JARSUFFIX) \
317	 -DgeneratePom=true \
318	 -DcreateChecksum=true
319
320# make .deb packages
321deb: /usr/share/pyshared/stdeb all
322	(python setup.py --command-packages=stdeb.command bdist_deb)
323
324# install .deb packages
325ideb:
326	(sudo dpkg -i deb_dist/*.deb)
327
328/usr/share/pyshared/stdeb: /usr/share/doc/python-all-dev
329	(sudo apt-get install python-stdeb)
330
331/usr/share/doc/python-all-dev:
332	(sudo apt-get install python-all-dev)
333
334minihttptestserver:	minihttptestserver.o
335
336# DO NOT DELETE THIS LINE -- make depend depends on it.
337
338igd_desc_parse.o: igd_desc_parse.h
339miniupnpc.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h upnpdev.h
340miniupnpc.o: minissdpc.h miniwget.h minisoap.h minixml.h upnpcommands.h
341miniupnpc.o: upnpreplyparse.h portlistingparse.h miniupnpctypes.h
342miniupnpc.o: connecthostport.h
343minixml.o: minixml.h
344minisoap.o: minisoap.h miniupnpcstrings.h
345miniwget.o: miniupnpcstrings.h miniwget.h miniupnpc_declspec.h
346miniwget.o: connecthostport.h receivedata.h
347upnpc.o: miniwget.h miniupnpc_declspec.h miniupnpc.h igd_desc_parse.h
348upnpc.o: upnpdev.h upnpcommands.h upnpreplyparse.h portlistingparse.h
349upnpc.o: miniupnpctypes.h upnperrors.h miniupnpcstrings.h
350upnpcommands.o: upnpcommands.h upnpreplyparse.h portlistingparse.h
351upnpcommands.o: miniupnpc_declspec.h miniupnpctypes.h miniupnpc.h
352upnpcommands.o: igd_desc_parse.h upnpdev.h
353upnpreplyparse.o: upnpreplyparse.h minixml.h
354testminixml.o: minixml.h igd_desc_parse.h
355minixmlvalid.o: minixml.h
356testupnpreplyparse.o: upnpreplyparse.h
357minissdpc.o: minissdpc.h miniupnpc_declspec.h upnpdev.h miniupnpc.h
358minissdpc.o: igd_desc_parse.h receivedata.h codelength.h
359upnperrors.o: upnperrors.h miniupnpc_declspec.h upnpcommands.h
360upnperrors.o: upnpreplyparse.h portlistingparse.h miniupnpctypes.h
361upnperrors.o: miniupnpc.h igd_desc_parse.h upnpdev.h
362testigddescparse.o: igd_desc_parse.h minixml.h miniupnpc.h
363testigddescparse.o: miniupnpc_declspec.h upnpdev.h
364testminiwget.o: miniwget.h miniupnpc_declspec.h
365connecthostport.o: connecthostport.h
366portlistingparse.o: portlistingparse.h miniupnpc_declspec.h miniupnpctypes.h
367portlistingparse.o: minixml.h
368receivedata.o: receivedata.h
369upnpdev.o: upnpdev.h miniupnpc_declspec.h
370testportlistingparse.o: portlistingparse.h miniupnpc_declspec.h
371testportlistingparse.o: miniupnpctypes.h
372miniupnpcmodule.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h
373miniupnpcmodule.o: upnpdev.h upnpcommands.h upnpreplyparse.h
374miniupnpcmodule.o: portlistingparse.h miniupnpctypes.h upnperrors.h
375listdevices.o: miniupnpc.h miniupnpc_declspec.h igd_desc_parse.h upnpdev.h
376