1# $Id: Makefile,v 1.83 2014/04/18 08:24:41 nanard Exp $
2# MiniUPnP project
3# http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
4# Author: Thomas Bernard
5#
6# Makefile for miniupnpd (MiniUPnP daemon)
7#
8# This Makefile should work for *BSD and SunOS/Solaris.
9# On Mac OS X, use "bsdmake" to build.
10# This Makefile is NOT compatible with GNU Make.
11# Linux users, please use Makefile.linux :
12#  make -f Makefile.linux
13#
14# options can be passed to genconfig.sh through CONFIG_OPTIONS :
15# $ CONFIG_OPTIONS="--ipv6 --igd2" make
16#
17
18CFLAGS ?= -pipe -Os
19#CFLAGS = -pipe -O -g -DDEBUG
20#CFLAGS += -ansi
21CFLAGS += -Wall
22CFLAGS += -W
23CFLAGS += -Wstrict-prototypes
24#CFLAGS += -Wdeclaration-after-statement
25#CFLAGS += -Wno-missing-field-initializers
26CFLAGS += -fno-common
27CC ?= gcc
28RM = rm -f
29MV = mv
30INSTALL = install
31STRIP = strip
32
33# OSNAME and FWNAME are used for building OS or FW dependent code.
34OSNAME != uname -s
35ARCH != uname -m
36.ifndef FWNAME
37#.if exists(/usr/include/net/pfvar.h)
38#FWNAME = pf
39#.else
40#FWNAME = ipf
41#.endif
42
43.if $(OSNAME) == "OpenBSD"
44FWNAME = pf
45.endif
46
47# better way to find if we are using ipf or pf
48.if $(OSNAME) == "FreeBSD"
49.if exists(/etc/rc.subr) && exists(/etc/rc.conf)
50FWNAME != . /etc/rc.subr; . /etc/rc.conf; \
51          if checkyesno ipfilter_enable; then \
52          echo "ipf"; elif checkyesno pf_enable; then \
53          echo "pf"; elif checkyesno firewall_enable; then \
54          echo "ipfw"; else echo "pf"; fi
55.else
56FWNAME = pf
57.endif
58.endif
59
60.if $(OSNAME) == "NetBSD"
61.if exists(/etc/rc.subr) && exists(/etc/rc.conf)
62FWNAME != . /etc/rc.subr; . /etc/rc.conf; \
63          if checkyesno pf; then \
64          echo "pf"; elif checkyesno ipfilter; then \
65          echo "ipf"; else echo "pf"; fi
66.else
67FWNAME = pf
68.endif
69.endif
70
71.if $(OSNAME) == "DragonFly"
72.if exists(/etc/rc.subr) && exists(/etc/rc.conf)
73FWNAME != . /etc/rc.subr; . /etc/rc.conf; \
74          if checkyesno pf; then \
75          echo "pf"; elif checkyesno ipfilter; then \
76          echo "ipf"; else echo "pf"; fi
77.else
78FWNAME = pf
79.endif
80.endif
81
82.if $(OSNAME) == "Darwin"
83# Firewall is ipfw up to OS X 10.6 Snow Leopard
84#��and pf since OS X 10.7 Lion (Darwin 11.0)
85FWNAME != [ `uname -r | cut -d. -f1` -ge 11  ] && echo "pf" || echo "ipfw"
86.endif
87
88.endif
89
90# Solaris specific CFLAGS
91.if $(OSNAME) == "SunOS"
92CFLAGS += -DSOLARIS2=`uname -r | cut -d. -f2`
93.if $(ARCH) == "amd64"
94CFLAGS += -m64 -mcmodel=kernel -mno-red-zone -ffreestanding
95.elif $(ARCH) == "sparc64"
96CFLAGS += -m64 -mcmodel=medlow
97.endif
98.endif
99
100STDOBJS = miniupnpd.o upnphttp.o upnpdescgen.o upnpsoap.o \
101          upnpredirect.o getifaddr.o daemonize.o upnpglobalvars.o \
102          options.o upnppermissions.o minissdp.o natpmp.o pcpserver.o \
103          upnpevents.o upnputils.o getconnstatus.o \
104          upnppinhole.o asyncsendto.o portinuse.o
105BSDOBJS = bsd/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
106SUNOSOBJS = solaris/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
107MACOBJS = mac/getifstats.o bsd/ifacewatcher.o bsd/getroute.o
108PFOBJS = pf/obsdrdr.o pf/pfpinhole.o
109IPFOBJS = ipf/ipfrdr.o
110IPFWOBJS = ipfw/ipfwrdr.o ipfw/ipfwaux.o
111MISCOBJS = upnpreplyparse.o minixml.o
112
113ALLOBJS = $(STDOBJS) $(MISCOBJS)
114.if $(OSNAME) == "SunOS"
115ALLOBJS += $(SUNOSOBJS)
116TESTGETIFSTATSOBJS = testgetifstats.o solaris/getifstats.o
117TESTGETROUTEOBJS = testgetroute.o upnputils.o bsd/getroute.o
118.elif $(OSNAME) == "Darwin"
119ALLOBJS += $(MACOBJS)
120TESTGETIFSTATSOBJS = testgetifstats.o mac/getifstats.o
121TESTGETROUTEOBJS = testgetroute.o upnputils.o bsd/getroute.o
122.else
123ALLOBJS += $(BSDOBJS)
124TESTGETIFSTATSOBJS = testgetifstats.o bsd/getifstats.o
125TESTGETROUTEOBJS = testgetroute.o upnputils.o bsd/getroute.o
126.endif
127
128.if $(FWNAME) == "pf"
129ALLOBJS += $(PFOBJS)
130.elif $(FWNAME) == "ipfw"
131ALLOBJS += $(IPFWOBJS)
132.else
133ALLOBJS += $(IPFOBJS)
134.endif
135
136TESTUPNPDESCGENOBJS = testupnpdescgen.o upnpdescgen.o
137TESTUPNPPERMISSIONSOBJS = testupnppermissions.o upnppermissions.o
138TESTGETIFADDROBJS = testgetifaddr.o getifaddr.o
139MINIUPNPDCTLOBJS = miniupnpdctl.o
140TESTASYNCSENDTOOBJS = testasyncsendto.o asyncsendto.o upnputils.o bsd/getroute.o
141TESTPORTINUSEOBJS = testportinuse.o portinuse.o getifaddr.o
142
143EXECUTABLES = miniupnpd testupnpdescgen testgetifstats \
144              testupnppermissions miniupnpdctl \
145              testgetifaddr testgetroute testasyncsendto \
146              testportinuse
147
148.if $(OSNAME) == "Darwin"
149LIBS =
150.else
151LIBS = -lkvm
152.endif
153.if $(OSNAME) == "SunOS"
154LIBS += -lsocket -lnsl -lkstat -lresolv
155.endif
156
157LIBS += -lssl -lcrypto
158
159# set PREFIX variable to install in the wanted place
160
161INSTALLBINDIR = $(PREFIX)/sbin
162INSTALLETCDIR = $(PREFIX)/etc
163# INSTALLMANDIR = $(PREFIX)/man
164INSTALLMANDIR = /usr/share/man
165
166all:	$(EXECUTABLES)
167
168clean:
169	$(RM) $(STDOBJS) $(BSDOBJS) $(SUNOSOBJS) $(MACOBJS) $(EXECUTABLES) \
170	testupnpdescgen.o \
171	$(MISCOBJS) config.h testgetifstats.o testupnppermissions.o \
172	miniupnpdctl.o testgetifaddr.o testgetroute.o testasyncsendto.o \
173	testportinuse.o \
174	$(PFOBJS) $(IPFOBJS) $(IPFWOBJS)
175
176install:	miniupnpd genuuid
177	$(STRIP) miniupnpd
178	$(INSTALL) -d $(DESTDIR)$(INSTALLBINDIR)
179	$(INSTALL) -m 755 miniupnpd $(DESTDIR)$(INSTALLBINDIR)
180	$(INSTALL) -d $(DESTDIR)$(INSTALLETCDIR)
181	$(INSTALL) -b miniupnpd.conf $(DESTDIR)$(INSTALLETCDIR)
182	# TODO : install man page correctly
183#	$(INSTALL) -d $(INSTALLMANDIR)
184#	$(INSTALL) miniupnpd.8 $(INSTALLMANDIR)/cat8/miniupnpd.0
185
186# genuuid is using the uuid cli tool available under OpenBSD 4.0 in
187# the uuid-1.5.0 package
188# any other cli tool returning a uuid on stdout should work.
189UUID != if which uuidgen 2>&1 > /dev/null; then \
190        echo `uuidgen` ; \
191        elif which uuid 2>&1 > /dev/null; then \
192        echo `uuid` ; \
193        else echo "00000000-0000-0000-0000-000000000000"; \
194        fi
195
196genuuid:
197	$(MV) miniupnpd.conf miniupnpd.conf.before
198	sed -e "s/^uuid=[-0-9a-fA-F]*/uuid=$(UUID)/" miniupnpd.conf.before > miniupnpd.conf
199	$(RM) miniupnpd.conf.before
200
201depend:	config.h
202	mkdep $(ALLOBJS:.o=.c) testupnpdescgen.c testgetifstats.c \
203    testupnppermissions.c miniupnpdctl.c testgetifaddr.c \
204	testgetroute.c testportinuse.c testasyncsendto.c
205
206miniupnpd: config.h $(ALLOBJS)
207	$(CC) $(CFLAGS) -o $@ $(ALLOBJS) $(LIBS)
208
209# BSDmake :
210#	$(CC) $(CFLAGS) -o $@ $> $(LIBS)
211
212miniupnpdctl:	config.h $(MINIUPNPDCTLOBJS)
213	$(CC) $(CFLAGS) -o $@ $(MINIUPNPDCTLOBJS)
214
215testupnpdescgen:	config.h $(TESTUPNPDESCGENOBJS)
216	$(CC) $(CFLAGS) -o $@ $(TESTUPNPDESCGENOBJS) $(LIBS)
217
218testgetifstats:	config.h $(TESTGETIFSTATSOBJS)
219	$(CC) $(CFLAGS) -o $@ $(TESTGETIFSTATSOBJS) $(LIBS)
220
221testgetifaddr:	config.h $(TESTGETIFADDROBJS)
222	$(CC) $(CFLAGS) -o $@ $(TESTGETIFADDROBJS) $(LIBS)
223
224testupnppermissions:	config.h $(TESTUPNPPERMISSIONSOBJS)
225	$(CC) $(CFLAGS) -o $@ $(TESTUPNPPERMISSIONSOBJS) $(LIBS)
226
227testgetroute:	config.h $(TESTGETROUTEOBJS)
228	$(CC) $(CFLAGS) -o $@ $(TESTGETROUTEOBJS) $(LIBS)
229
230testasyncsendto:	config.h $(TESTASYNCSENDTOOBJS)
231	$(CC) $(CFLAGS) -o $@ $(TESTASYNCSENDTOOBJS)
232
233testportinuse:	config.h $(TESTPORTINUSEOBJS)
234	$(CC) $(CFLAGS) -o $@ $(TESTPORTINUSEOBJS) $(LIBS)
235
236# gmake :
237#	$(CC) $(CFLAGS) -o $@ $^
238# BSDmake :
239#	$(CC) $(CFLAGS) -o $@ $>
240
241config.h:	genconfig.sh VERSION
242	./genconfig.sh $(CONFIG_OPTIONS)
243
244.SUFFIXES:	.o .c
245.c.o:
246	$(CC) $(CFLAGS) -c -o $@ $<
247
248#	$(CC) $(CFLAGS) -c -o $(.TARGET) $(.IMPSRC)
249
250
251