1# $Id: Makefile.linux,v 1.86 2014/04/09 07:22:28 nanard Exp $
2# MiniUPnP project
3# (c) 2006-2015 Thomas Bernard
4# http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
5# Author : Thomas Bernard
6# for use with GNU Make
7#
8# options can be passed to genconfig.sh through CONFIG_OPTIONS :
9# $ CONFIG_OPTIONS="--ipv6 --igd2" make -f Makefile.linux
10#
11# To install use :
12# $ DESTDIR=/dummyinstalldir make -f Makefile.linux install
13# or :
14# $ INSTALLPREFIX=/usr/local make -f Makefile.linux install
15# or :
16# $ make -f Makefile.linux install
17# (default INSTALLPREFIX is /usr)
18#
19# if your system hasn't iptables libiptc headers and binary correctly
20# installed, you need to get iptables sources from http://netfilter.org/
21# ./configure them and build them then miniupnpd will build using :
22# $ IPTABLESPATH=/path/to/iptables-1.4.1 make -f Makefile.linux
23#
24#CFLAGS = -O -g -DDEBUG
25CFLAGS ?= -Os
26CFLAGS += -fno-strict-aliasing
27CFLAGS += -fno-common
28CPPFLAGS += -D_GNU_SOURCE
29CFLAGS += -Wall
30CFLAGS += $(EXTRACFLAGS)
31#CFLAGS += -Wextra -Wstrict-prototypes -Wdeclaration-after-statement
32#CFLAGS += -Wno-missing-field-initializers
33#CFLAGS += -ansi	# iptables headers does use typeof which is a gcc extension
34CC ?= gcc
35RM = rm -f
36INSTALL = install
37STRIP ?= strip
38PKG_CONFIG ?= pkg-config
39CP = cp
40
41
42INSTALLPREFIX ?= $(PREFIX)/usr
43SBININSTALLDIR = $(INSTALLPREFIX)/sbin
44ETCINSTALLDIR = $(PREFIX)/etc/miniupnpd
45MANINSTALLDIR = $(INSTALLPREFIX)/share/man/man8
46
47BASEOBJS = miniupnpd.o upnphttp.o upnpdescgen.o upnpsoap.o \
48           upnpreplyparse.o minixml.o portinuse.o \
49           upnpredirect.o getifaddr.o daemonize.o upnpglobalvars.o \
50           options.o upnppermissions.o minissdp.o natpmp.o pcpserver.o \
51           upnpevents.o upnputils.o getconnstatus.o \
52           upnppinhole.o pcplearndscp.o asyncsendto.o
53
54LNXOBJS = linux/getifstats.o linux/ifacewatcher.o linux/getroute.o
55NETFILTEROBJS = netfilter/iptcrdr.o netfilter/iptpinhole.o netfilter/nfct_get.o
56
57ALLOBJS = $(BASEOBJS) $(LNXOBJS) $(NETFILTEROBJS)
58
59PCFILE_FOUND := $(shell $(PKG_CONFIG) --exists libiptc; echo $$?)
60
61ifeq (${PCFILE_FOUND},0)
62
63IPTABLESVERSION := $(shell $(PKG_CONFIG) --modversion libiptc)
64IPTABLESVERSION1 := $(shell echo $(IPTABLESVERSION) | cut -d. -f1 )
65IPTABLESVERSION2 := $(shell echo $(IPTABLESVERSION) | cut -d. -f2 )
66IPTABLESVERSION3 := $(shell echo $(IPTABLESVERSION) | cut -d. -f3 )
67# test if iptables version >= 1.4.3
68TEST := $(shell [ \( \( $(IPTABLESVERSION1) -ge 1 \) -a \( $(IPTABLESVERSION2) -ge 4 \) \) -a \( $(IPTABLESVERSION3) -ge 3 \) ] && echo 1 )
69ifeq ($(TEST), 1)
70CPPFLAGS += -DIPTABLES_143
71endif
72
73CFLAGS  += $(shell $(PKG_CONFIG) --cflags libiptc)
74LDLIBS  += $(shell $(PKG_CONFIG) --static --libs-only-l libiptc)
75LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libiptc)
76LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-other libiptc)
77else
78
79#TARGET_GENTOO := $(wildcard /etc/gentoo-release )
80ifeq ($(TARGET_GENTOO),)
81LDLIBS ?= -liptc
82else # gentoo
83# the following is better, at least on gentoo with iptables 1.4.6
84#��see http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1618
85# and http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=2183
86LDLIBS ?= -lip4tc
87CPPFLAGS := -DIPTABLES_143 $(CPPFLAGS)
88endif
89
90ARCH ?= $(shell uname -m | grep -q "x86_64" && echo 64)
91ifdef IPTABLESPATH
92CPPFLAGS := $(CPPFLAGS) -I$(IPTABLESPATH)/include/
93LDFLAGS := $(LDFLAFGS) -L$(IPTABLESPATH)/libiptc/
94# get iptables version and set IPTABLES_143 macro if needed
95ifeq ($(TARGET_OPENWRT),)
96IPTABLESVERSION := $(shell grep "\#define VERSION" $(IPTABLESPATH)/config.h | tr -d \" |cut -d" " -f3 )
97IPTABLESVERSION1 := $(shell echo $(IPTABLESVERSION) | cut -d. -f1 )
98IPTABLESVERSION2 := $(shell echo $(IPTABLESVERSION) | cut -d. -f2 )
99IPTABLESVERSION3 := $(shell echo $(IPTABLESVERSION) | cut -d. -f3 )
100# test if iptables version >= 1.4.3
101TEST := $(shell [ \( \( $(IPTABLESVERSION1) -ge 1 \) -a \( $(IPTABLESVERSION2) -ge 4 \) \) -a \( $(IPTABLESVERSION3) -ge 3 \) ] && echo 1 )
102ifeq ($(TEST), 1)
103CPPFLAGS := $(CPPFLAGS) -DIPTABLES_143
104# the following sucks, but works
105LDLIBS = $(IPTABLESPATH)/libiptc/.libs/libip4tc.o
106#LDLIBS = $(IPTABLESPATH)/libiptc/.libs/libiptc.a
107else # ifeq ($(TEST), 1)
108LDLIBS = $(IPTABLESPATH)/libiptc/libiptc.a
109endif # ifeq ($(TEST), 1)
110else # ($(TARGET_OPENWRT),)
111# openWRT :
112# check for system-wide iptables files. Test if iptables version >= 1.4.3
113# the following test has to be verified :
114TEST := $(shell test -f /usr/include/iptables/internal.h && grep -q "\#define IPTABLES_VERSION" /usr/include/iptables/internal.h && echo 1)
115ifeq ($(TEST), 1)
116CPPFLAGS := $(CPPFLAGS) -DIPTABLES_143
117LDLIBS = -liptc
118endif  # ($(TEST), 1)
119TEST_LIB := $(shell test -f /usr/lib$(ARCH)/libiptc.a && echo 1)
120ifeq ($(TEST_LIB), 1)
121LDLIBS = -liptc /usr/lib$(ARCH)/libiptc.a
122endif # ($(TEST_LIB), 1)
123endif # ($(TARGET_OPENWRT),)
124else # ifdef IPTABLESPATH
125# IPTABLESPATH not defined
126# the following test has to be verified :
127TEST := $(shell test -f /usr/include/xtables.h && grep -q "XTABLES_VERSION_CODE" /usr/include/xtables.h && echo 1)
128ifeq ($(TEST), 1)
129CPPFLAGS := $(CPPFLAGS) -DIPTABLES_143
130LDLIBS = -liptc
131TESTIP4TC := $(shell test -f /lib/libip4tc.so && echo 1)
132ifeq ($(TESTIP4TC), 1)
133LDLIBS := $(LDLIBS) -lip4tc
134endif # ($(TESTIP4TC), 1)
135TESTIP6TC := $(shell test -f /lib/libip6tc.so && echo 1)
136ifeq ($(TESTIP6TC), 1)
137LDLIBS := $(LDLIBS) -lip6tc
138endif # ($(TESTIP6TC), 1)
139endif #��($(TEST), 1)
140endif # ifdef IPTABLESPATH
141endif # ifdef PCFILE_FOUND
142
143#LDLIBS += -lnfnetlink
144
145TEST := $(shell $(PKG_CONFIG) --atleast-version=1.0.2 libnetfilter_conntrack && $(PKG_CONFIG) --atleast-version=1.0.3 libmnl && echo 1)
146ifeq ($(TEST),1)
147CPPFLAGS += -DUSE_NFCT
148LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libmnl)
149LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libnetfilter_conntrack)
150endif # ($(TEST),1)
151
152LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libssl)
153
154TESTUPNPDESCGENOBJS = testupnpdescgen.o upnpdescgen.o
155
156EXECUTABLES = miniupnpd testupnpdescgen testgetifstats \
157              testupnppermissions miniupnpdctl testgetifaddr \
158              testgetroute testasyncsendto testportinuse
159
160.PHONY:	all clean install depend genuuid
161
162all:	$(EXECUTABLES)
163
164clean:
165	$(RM) $(ALLOBJS)
166	$(RM) $(EXECUTABLES)
167	$(RM) testupnpdescgen.o testgetifstats.o
168	$(RM) testupnppermissions.o testgetifaddr.o
169	$(RM) testgetroute.o testasyncsendto.o
170	$(RM) testportinuse.o
171	$(RM) miniupnpdctl.o
172
173install:	miniupnpd miniupnpd.8 miniupnpd.conf genuuid \
174	netfilter/iptables_init.sh netfilter/iptables_removeall.sh \
175	netfilter/ip6tables_init.sh netfilter/ip6tables_removeall.sh \
176	linux/miniupnpd.init.d.script
177	$(STRIP) miniupnpd
178	$(INSTALL) -d $(DESTDIR)$(SBININSTALLDIR)
179	$(INSTALL) miniupnpd $(DESTDIR)$(SBININSTALLDIR)
180	$(INSTALL) -d $(DESTDIR)$(ETCINSTALLDIR)
181	$(INSTALL) netfilter/iptables_init.sh $(DESTDIR)$(ETCINSTALLDIR)
182	$(INSTALL) netfilter/iptables_removeall.sh $(DESTDIR)$(ETCINSTALLDIR)
183	$(INSTALL) netfilter/ip6tables_init.sh $(DESTDIR)$(ETCINSTALLDIR)
184	$(INSTALL) netfilter/ip6tables_removeall.sh $(DESTDIR)$(ETCINSTALLDIR)
185	$(INSTALL) --mode=0644 -b miniupnpd.conf $(DESTDIR)$(ETCINSTALLDIR)
186	$(INSTALL) -d $(DESTDIR)$(PREFIX)/etc/init.d
187	$(INSTALL) linux/miniupnpd.init.d.script $(DESTDIR)$(PREFIX)/etc/init.d/miniupnpd
188	$(INSTALL) -d $(DESTDIR)$(MANINSTALLDIR)
189	$(INSTALL) --mode=0644 miniupnpd.8 $(DESTDIR)$(MANINSTALLDIR)
190	gzip -f $(DESTDIR)$(MANINSTALLDIR)/miniupnpd.8
191
192# genuuid is using the uuidgen CLI tool which is part of libuuid
193# from the e2fsprogs
194# 'cat /proc/sys/kernel/random/uuid' could be also used
195genuuid:
196ifeq ($(TARGET_OPENWRT),)
197	sed -i -e "s/^uuid=[-0-9a-f]*/uuid=`(genuuid||uuidgen||uuid) 2>/dev/null`/" miniupnpd.conf
198else
199	sed -i -e "s/^uuid=[-0-9a-f]*/uuid=`($(STAGING_DIR_HOST)/bin/genuuid||$(STAGING_DIR_HOST)/bin/uuidgen||$(STAGING_DIR_HOST)/bin/uuid) 2>/dev/null`/" miniupnpd.conf
200endif
201
202miniupnpd:	$(BASEOBJS) $(LNXOBJS) $(NETFILTEROBJS)
203
204testupnpdescgen:	$(TESTUPNPDESCGENOBJS)
205
206testgetifstats:	testgetifstats.o linux/getifstats.o
207
208testupnppermissions:	testupnppermissions.o upnppermissions.o
209
210testgetifaddr:	testgetifaddr.o getifaddr.o
211
212testgetroute:	testgetroute.o linux/getroute.o upnputils.o
213
214testasyncsendto:	testasyncsendto.o asyncsendto.o upnputils.o \
215	linux/getroute.o
216
217testportinuse:	testportinuse.o portinuse.o getifaddr.o \
218	netfilter/iptcrdr.o
219
220miniupnpdctl:	miniupnpdctl.o
221
222config.h:	genconfig.sh VERSION
223	./genconfig.sh $(CONFIG_OPTIONS)
224
225depend:	config.h
226	makedepend -f$(MAKEFILE_LIST) -Y \
227	$(ALLOBJS:.o=.c) $(TESTUPNPDESCGENOBJS:.o=.c) \
228	testgetifstats.c testupnppermissions.c testgetifaddr.c \
229	testgetroute.c testasyncsendto.c testportinuse.c \
230	miniupnpdctl.c 2>/dev/null
231
232# DO NOT DELETE
233
234miniupnpd.o: config.h macros.h upnpglobalvars.h upnppermissions.h
235miniupnpd.o: miniupnpdtypes.h upnphttp.h upnpdescgen.h miniupnpdpath.h
236miniupnpd.o: getifaddr.h upnpsoap.h options.h minissdp.h upnpredirect.h
237miniupnpd.o: upnppinhole.h daemonize.h upnpevents.h asyncsendto.h natpmp.h
238miniupnpd.o: pcpserver.h commonrdr.h upnputils.h ifacewatcher.h
239upnphttp.o: config.h upnphttp.h upnpdescgen.h miniupnpdpath.h upnpsoap.h
240upnphttp.o: upnpevents.h upnputils.h
241upnpdescgen.o: config.h getifaddr.h upnpredirect.h upnpdescgen.h
242upnpdescgen.o: miniupnpdpath.h upnpglobalvars.h upnppermissions.h
243upnpdescgen.o: miniupnpdtypes.h upnpdescstrings.h upnpurns.h getconnstatus.h
244upnpsoap.o: macros.h config.h upnpglobalvars.h upnppermissions.h
245upnpsoap.o: miniupnpdtypes.h upnphttp.h upnpsoap.h upnpreplyparse.h
246upnpsoap.o: upnpredirect.h upnppinhole.h getifaddr.h getifstats.h
247upnpsoap.o: getconnstatus.h upnpurns.h
248upnpreplyparse.o: upnpreplyparse.h minixml.h
249minixml.o: minixml.h
250portinuse.o: macros.h config.h upnpglobalvars.h upnppermissions.h
251portinuse.o: miniupnpdtypes.h getifaddr.h portinuse.h netfilter/iptcrdr.h
252portinuse.o: commonrdr.h
253upnpredirect.o: macros.h config.h upnpredirect.h upnpglobalvars.h
254upnpredirect.o: upnppermissions.h miniupnpdtypes.h upnpevents.h portinuse.h
255upnpredirect.o: netfilter/iptcrdr.h commonrdr.h
256getifaddr.o: config.h getifaddr.h
257daemonize.o: daemonize.h config.h
258upnpglobalvars.o: config.h upnpglobalvars.h upnppermissions.h
259upnpglobalvars.o: miniupnpdtypes.h upnpdescstrings.h
260options.o: config.h options.h upnppermissions.h upnpglobalvars.h
261options.o: miniupnpdtypes.h
262upnppermissions.o: config.h upnppermissions.h
263minissdp.o: config.h upnpdescstrings.h miniupnpdpath.h upnphttp.h
264minissdp.o: upnpglobalvars.h upnppermissions.h miniupnpdtypes.h minissdp.h
265minissdp.o: upnputils.h getroute.h asyncsendto.h codelength.h
266natpmp.o: macros.h config.h natpmp.h upnpglobalvars.h upnppermissions.h
267natpmp.o: miniupnpdtypes.h getifaddr.h upnpredirect.h commonrdr.h upnputils.h
268natpmp.o: portinuse.h asyncsendto.h
269pcpserver.o: config.h pcpserver.h macros.h upnpglobalvars.h upnppermissions.h
270pcpserver.o: miniupnpdtypes.h pcplearndscp.h upnpredirect.h commonrdr.h
271pcpserver.o: getifaddr.h asyncsendto.h pcp_msg_struct.h netfilter/iptcrdr.h
272pcpserver.o: commonrdr.h
273upnpevents.o: config.h upnpevents.h miniupnpdpath.h upnpglobalvars.h
274upnpevents.o: upnppermissions.h miniupnpdtypes.h upnpdescgen.h upnputils.h
275upnputils.o: config.h upnputils.h upnpglobalvars.h upnppermissions.h
276upnputils.o: miniupnpdtypes.h getroute.h
277getconnstatus.o: getconnstatus.h getifaddr.h
278upnppinhole.o: macros.h config.h upnpredirect.h upnpglobalvars.h
279upnppinhole.o: upnppermissions.h miniupnpdtypes.h upnpevents.h
280upnppinhole.o: netfilter/iptpinhole.h
281pcplearndscp.o: config.h upnpglobalvars.h upnppermissions.h miniupnpdtypes.h
282pcplearndscp.o: pcplearndscp.h
283asyncsendto.o: asyncsendto.h
284linux/getifstats.o: config.h getifstats.h
285linux/ifacewatcher.o: config.h ifacewatcher.h config.h minissdp.h
286linux/ifacewatcher.o: miniupnpdtypes.h getifaddr.h upnpglobalvars.h
287linux/ifacewatcher.o: upnppermissions.h natpmp.h
288linux/getroute.o: getroute.h upnputils.h
289netfilter/iptcrdr.o: macros.h config.h netfilter/iptcrdr.h commonrdr.h
290netfilter/iptcrdr.o: config.h upnpglobalvars.h upnppermissions.h
291netfilter/iptcrdr.o: miniupnpdtypes.h
292netfilter/iptpinhole.o: config.h netfilter/iptpinhole.h upnpglobalvars.h
293netfilter/iptpinhole.o: upnppermissions.h config.h miniupnpdtypes.h
294testupnpdescgen.o: macros.h config.h upnpdescgen.h upnpdescstrings.h
295testupnpdescgen.o: getifaddr.h
296upnpdescgen.o: config.h getifaddr.h upnpredirect.h upnpdescgen.h
297upnpdescgen.o: miniupnpdpath.h upnpglobalvars.h upnppermissions.h
298upnpdescgen.o: miniupnpdtypes.h upnpdescstrings.h upnpurns.h getconnstatus.h
299testgetifstats.o: getifstats.h
300testupnppermissions.o: upnppermissions.h config.h
301testgetifaddr.o: config.h getifaddr.h
302testgetroute.o: getroute.h upnputils.h upnpglobalvars.h upnppermissions.h
303testgetroute.o: config.h miniupnpdtypes.h
304testasyncsendto.o: miniupnpdtypes.h config.h upnputils.h asyncsendto.h
305testportinuse.o: macros.h config.h portinuse.h
306miniupnpdctl.o: macros.h
307