1prefix=${PREFIX}
2BINDIR=${prefix}/bin
3MANDIR=${prefix}/man
4man1dir=$(MANDIR)/man1
5
6TARGETS=gatling dl cgi
7TARGETS2=
8ifdef BENCHMARKS
9TARGETS+=httpbench bindbench ioerr bench pthreadbench
10TARGETS2+=mktestdata mmapbench manymapbench forkbench forksbench
11endif
12ifdef TLSGATLING
13TARGETS+=tlsgatling
14endif
15ALLTARGETS=$(TARGETS) acc hcat referrer hitprofile matchiprange getlinks \
16rellink $(TARGETS2)
17
18all: $(ALLTARGETS)
19
20#CFLAGS+=-DSTATE_DEBUG -DMOREDEBUG -DDEBUG_EVENTS -DSMDEBUG
21
22path = $(subst :, ,$(PATH))
23diet_path = $(foreach dir,$(path),$(wildcard $(dir)/diet))
24ifeq ($(strip $(diet_path)),)
25ifneq ($(wildcard /opt/diet/bin/diet),)
26DIET=/opt/diet/bin/diet
27else
28DIET=
29endif
30else
31DIET:=$(strip $(diet_path))
32endif
33
34# to build without diet libc support, use $ make DIET=
35# see http://www.fefe.de/dietlibc/ for details about the diet libc
36
37DIET=
38
39ifneq ($(DEBUG),)
40CFLAGS+=-g -Og
41LDFLAGS+=-g
42endif
43
44LDLIBS=-lowfat
45
46ifeq ($(ZLIB),1)
47CFLAGS+=-DUSE_ZLIB
48LDLIBS+=-lz
49endif
50
51libowfat_path = $(strip $(foreach dir,../libowfat*,$(wildcard $(dir)/textcode.h)))
52ifneq ($(libowfat_path),)
53CFLAGS+=$(foreach fnord,$(libowfat_path),-I$(dir $(fnord)))
54LDFLAGS+=$(foreach fnord,$(libowfat_path),-L$(dir $(fnord)))
55endif
56
57ifneq ($(REDIRECT),)
58CFLAGS+="-DREDIRECT=\"$(REDIRECT)\""
59endif
60
61acc: acc.c
62	$(CC) -o $@ $< $(CFLAGS) $(LDFLAGS) -lowfat
63
64CC:=$(DIET) $(CC)
65
66pthreadbench: pthreadbench.o
67	$(CC) $< -o $@ -I. $(CFLAGS) $(LDFLAGS) $(LDLIBS) -lpthread
68
69forksbench: forkbench.o
70	$(CC) -static -o $@ forkbench.o $(LDFLAGS) $(LDLIBS)
71
72gatling.o tlsgatling ptlsgatling: havesetresuid.h
73
74OBJS=mime.o ftp.o http.o smb.o common.o connstat.o httpstream.o dirfd.o
75HTTPS_OBJS=mime.o ftp.c http.c smb.c common.c connstat.o httpstream.o dirfd.o
76PHTTPS_OBJS=mime.o ftp.o http.c smb.c common.c connstat.o httpstream.o dirfd.o
77
78$(OBJS) https.o gatling.o: gatling.h version.h gatling_features.h dirfd.h
79
80tlsgatling: gatling.c ssl.o $(HTTPS_OBJS) libsocket libiconv libcrypt libsslpthread
81	$(CC) -o $@ gatling.c ssl.o $(HTTPS_OBJS) $(CFLAGS) -DSUPPORT_HTTPS $(LDFLAGS) -lssl -lcrypto $(LDLIBS) `cat libsslpthread`
82
83tlsgatling_nofail: gatling.c ssl.o $(HTTPS_OBJS) libsocket libiconv libcrypt libsslpthread
84	-$(CC) -o tlsgatling gatling.c ssl.o $(HTTPS_OBJS) $(CFLAGS) -DSUPPORT_HTTPS $(LDFLAGS) -lssl -lcrypto $(LDLIBS) `cat libsslpthread`
85
86ptlsgatling: gatling.c pssl.o $(PHTTPS_OBJS) libsocket libiconv libcrypt
87	$(CC) -o $@ gatling.c pssl.c $(PHTTPS_OBJS) $(CFLAGS) -DSUPPORT_HTTPS -DUSE_POLARSSL $(LDFLAGS) -lmbedtls $(LDLIBS)
88
89ptlsgatling_nofail: gatling.c pssl.o $(PHTTPS_OBJS) libsocket libiconv libcrypt
90	-$(CC) -o ptlsgatling gatling.c pssl.c $(PHTTPS_OBJS) $(CFLAGS) -DSUPPORT_HTTPS -DUSE_POLARSSL $(LDFLAGS) -lmbedtls $(LDLIBS)
91
92gatling: gatling.o $(OBJS) md5lib
93	$(CC) $(LDFLAGS) $@.o $(OBJS) -o $@ $(LDLIBS) `cat md5lib`
94
95httpbench: httpbench.o
96bindbench: bindbench.o
97dl: dl.o
98ioerr: ioerr.o
99bench: bench.o
100getlinks: getlinks.o
101rellink: rellink.o
102matchiprange: matchiprange.o
103
104cgi: cgi.o
105
106version.h: CHANGES
107	(head -n 1 CHANGES | sed 's/\([^:]*\):/#define VERSION "\1"/') > version.h
108
109%.o: %.c
110	$(CC) -c $< -o $@ -I. $(CFLAGS)
111
112https.o: http.c
113	$(CC) -c $< -o $@ -I. $(CFLAGS) -DSUPPORT_HTTPS
114
115phttps.o: http.c
116	$(CC) -c $< -o $@ -I. $(CFLAGS) -DSUPPORT_HTTPS -DUSE_POLARSSL
117
118%: %.o
119	$(CC) $(LDFLAGS) $@.o -o $@ $(LDLIBS)
120
121hitprofile.o: referrer.c
122	$(CC) -c $< -o $@ -I. $(CFLAGS) -DALL
123
124libsocket: trysocket.c
125	if $(CC) $(CFLAGS) -o trysocket trysocket.c >/dev/null 2>&1; then echo ""; else \
126	if $(CC) $(CFLAGS) -o trysocket trysocket.c -lsocket >/dev/null 2>&1; then echo "-lsocket"; else \
127	if $(CC) $(CFLAGS) -o trysocket trysocket.c -lsocket -lnsl >/dev/null 2>&1; then echo "-lsocket -lnsl"; else \
128	if $(CC) $(CFLAGS) -o trysocket trysocket.c -lwsock32 >/dev/null 2>&1; then echo "-lwsock32"; \
129	fi; fi; fi; fi > libsocket
130	rm -f trysocket
131
132libiconv: tryiconv.c
133ifdef ICONV
134	if $(CC) $(CFLAGS) $(LDFLAGS) -o tryiconv tryiconv.c -liconv >/dev/null 2>&1; then echo "-L$(LDFLAGS) -liconv"; else \
135	echo ""; \
136	fi > libiconv
137else
138	echo "" > libiconv
139endif
140	rm -f tryiconv
141
142libcrypt: trycrypt.c
143	if $(CC) $(CFLAGS) -o trycrypt trycrypt.c >/dev/null 2>&1; then echo ""; else \
144	if $(CC) $(CFLAGS) -o trycrypt trycrypt.c -lcrypt >/dev/null 2>&1; then echo "-lcrypt"; \
145	fi; fi > libcrypt
146	rm -f trycrypt
147
148md5lib: trymd5.c
149	if $(CC) $(CFLAGS) -o trymd5 trymd5.c >/dev/null 2>&1; then echo ""; else \
150	if $(CC) $(CFLAGS) -o trymd5 trymd5.c -lmd >/dev/null 2>&1; then echo "-lmd"; else \
151	if $(CC) $(CFLAGS) -o trymd5 trymd5.c $(LDFLAGS) -lcrypto >/dev/null 2>&1; then echo "-lcrypto"; \
152	fi; fi; fi > md5lib
153	rm -f trymd5
154
155
156libsslpthread: ssl.c
157	if $(CC) $(CFLAGS) -o tryssl ssl.c -DMAIN -lowfat -lssl -lcrypto >/dev/null 2>&1 ; then echo ""; else \
158	if $(CC) $(CFLAGS) -o tryssl ssl.c -DMAIN -lowfat -lssl -lcrypto -lpthread >/dev/null 2>&1 ; then echo "-lpthread"; \
159	fi; fi > $@
160	rm -f tryssl
161
162havesetresuid.h: trysetresuid.c
163	-rm -f $@
164	if $(CC) $(CFLAGS) -o tryresuid $^ >/dev/null 2>&1; then echo "#define LIBC_HAS_SETRESUID"; fi > $@
165	-rm -f tryresuid
166
167dummy.c:
168	touch $@
169
170libsocketkludge.a: libsocket libiconv dummy.o
171	ar q $@ dummy.o
172	-ranlib $@
173
174LDLIBS+=`cat libsocket libiconv libcrypt`
175
176$(TARGETS): libsocketkludge.a libsocket libiconv libcrypt md5lib
177
178install: gatling dl getlinks
179	install -d $(DESTDIR)$(BINDIR) $(man1dir)
180	install $^ $(DESTDIR)$(BINDIR)
181	if test -f tlsgatling; then install tlsgatling $(DESTDIR)$(BINDIR); fi
182	install -m 644 gatling.1 bench.1 $(DESTDIR)$(man1dir)
183
184uninstall:
185	rm -f $(DESTDIR)$(BINDIR)/gatling $(DESTDIR)$(BINDIR)/tlsgatling $(DESTDIR)$(man1dir)/gatling.1 $(DESTDIR)$(man1dir)/bench.1
186
187clean:
188	rm -f $(ALLTARGETS) *.o version.h core *.core libsocket libsocketkludge.a dummy.c libiconv libcrypt havesetresuid.h md5lib havealloca.h tlsgatling ptlsgatling libsslpthread
189
190VERSION=gatling-$(shell head -n 1 CHANGES|sed 's/://')
191CURNAME=$(notdir $(shell pwd))
192
193rename:
194	if test $(CURNAME) != $(VERSION); then cd .. && mv $(CURNAME) $(VERSION); fi
195
196tar: clean rename
197	rm -f dep libdep
198	cd ..; tar cvvf $(VERSION).tar.bz2 --use=bzip2 --exclude CVS --exclude default $(VERSION)
199
200cert: server.pem
201
202rand.dat:
203	-dd if=/dev/random of=rand.dat bs=1024 count=1
204
205cakey.key: rand.dat
206	openssl genrsa -out cakey.key -rand rand.dat 2048
207
208cakey.csr: cakey.key
209	openssl req -new -key cakey.key -out cakey.csr
210
211cakey.pem: cakey.key cakey.csr
212	openssl x509 -req -days 1780 -set_serial 1 -in cakey.csr \
213	  -signkey cakey.key -out $@
214
215server.pem: cakey.key cakey.pem
216	cat cakey.key cakey.pem > server.pem
217
218windoze:
219	$(MAKE) DIET= CROSS=i686-mingw32-
220
221havealloca.h: tryalloca.c
222	-rm -f $@
223	echo "#include <stdlib.h>" > $@
224	if $(DIET) $(CC) $(CFLAGS) -c tryalloca.c -DA >/dev/null 2>&1; then echo "#include <alloca.h>"; fi >> $@
225	if $(DIET) $(CC) $(CFLAGS) -c tryalloca.c -DB >/dev/null 2>&1; then echo "#include <malloc.h>"; fi >> $@
226	-rm -f tryalloca.o
227
228bench.o bindbench.o common.o dl.o ftp.o gatling.o getlinks.o http.o \
229httpbench.o ioerr.o rellink.o smb.o torrent.o: havealloca.h
230