1# volatile information
2VERSION=0.4
3RELEASE=beta
4
5QUAKE2_DIR=/usr/local/games/quake2
6BIN_DIR=/usr/local/bin
7ARCH=i386
8SHLIBEXT=so
9Q2MODULE=game$(ARCH).$(SHLIBEXT)
10define NEWLINE
11
12
13endef
14
15# distribution settings
16DIST_BASE=relay
17DIST_DIR=$(DIST_BASE)-$(VERSION)
18
19# debug is the default build mode
20ifneq ($(MODE),debug)
21  ifneq ($(MODE),release)
22    MODE=debug
23  endif
24endif
25
26# default commands and build options
27CC=gcc
28LD=gcc
29CPPFLAGS=-Icommon
30CFLAGS=-Wall -fPIC
31LDFLAGS=-lm -ldl
32
33# commands
34DO_CC=$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
35DO_LINK=$(LD) $(LDFLAGS) -o $@ $^
36DO_SHLINK=$(LD) $(LDFLAGS) -shared -o $@ $^
37TAR=/bin/tar
38
39# include mode-specific build options (can override the above)
40
41# targets
42DEMOCONV_TARGET=$(OUT_DIR)/democonv/democonv
43DM2SERVER_TARGET=$(OUT_DIR)/dm2server/dm2server
44PROXY_TARGET=$(OUT_DIR)/proxy/$(Q2MODULE)
45RELAY_TARGET=$(OUT_DIR)/relay/$(Q2MODULE)
46REPLAY_TARGET=$(OUT_DIR)/replay/$(Q2MODULE)
47
48TARGETS = \
49	$(DEMOCONV_TARGET) \
50	$(DM2SERVER_TARGET) \
51	$(PROXY_TARGET) \
52	$(RELAY_TARGET) \
53	$(REPLAY_TARGET)
54
55# objects
56DEMOCONV_OBJS = \
57	$(OBJ_DIR)/common/block.o \
58	$(OBJ_DIR)/common/bsp.o \
59	$(OBJ_DIR)/common/cmd.o \
60	$(OBJ_DIR)/common/dm2.o \
61	$(OBJ_DIR)/common/endian.o \
62	$(OBJ_DIR)/common/getopt.o \
63	$(OBJ_DIR)/common/getopt1.o \
64	$(OBJ_DIR)/common/mem.o \
65	$(OBJ_DIR)/common/pak.o \
66	$(OBJ_DIR)/common/q2utils.o \
67	$(OBJ_DIR)/common/utils.o \
68	$(OBJ_DIR)/democonv/dc_dm2.o \
69	$(OBJ_DIR)/democonv/dc_main.o
70
71DM2SERVER_OBJS = \
72	$(OBJ_DIR)/common/block.o \
73	$(OBJ_DIR)/common/bsp.o \
74	$(OBJ_DIR)/common/cmd.o \
75	$(OBJ_DIR)/common/dm2.o \
76	$(OBJ_DIR)/common/endian.o \
77	$(OBJ_DIR)/common/mem.o \
78	$(OBJ_DIR)/common/menu.o \
79	$(OBJ_DIR)/common/net.o \
80	$(OBJ_DIR)/common/pak.o \
81	$(OBJ_DIR)/common/q2utils.o \
82	$(OBJ_DIR)/common/utils.o \
83	$(OBJ_DIR)/dm2server/sv_challenge.o \
84	$(OBJ_DIR)/dm2server/sv_clcmds.o \
85	$(OBJ_DIR)/dm2server/sv_client.o \
86	$(OBJ_DIR)/dm2server/sv_cvar.o \
87	$(OBJ_DIR)/dm2server/sv_dm2.o \
88	$(OBJ_DIR)/dm2server/sv_main.o \
89	$(OBJ_DIR)/dm2server/sv_menus.o \
90	$(OBJ_DIR)/dm2server/sv_net.o \
91	$(OBJ_DIR)/dm2server/sv_pmove.o \
92	$(OBJ_DIR)/dm2server/sv_svcmds.o
93
94PROXY_OBJS = \
95	$(OBJ_DIR)/common/proxy.o \
96	$(OBJ_DIR)/proxy/p_main.o
97
98RELAY_OBJS = \
99	$(OBJ_DIR)/common/block.o \
100	$(OBJ_DIR)/common/cmd.o \
101	$(OBJ_DIR)/common/dm2.o \
102	$(OBJ_DIR)/common/endian.o \
103	$(OBJ_DIR)/common/mem.o \
104	$(OBJ_DIR)/common/pak.o \
105	$(OBJ_DIR)/common/proxy.o \
106	$(OBJ_DIR)/common/q2utils.o \
107	$(OBJ_DIR)/common/utils.o \
108	$(OBJ_DIR)/relay/r_export.o \
109	$(OBJ_DIR)/relay/r_import.o \
110	$(OBJ_DIR)/relay/r_main.o
111
112REPLAY_OBJS = \
113	$(OBJ_DIR)/common/block.o \
114	$(OBJ_DIR)/common/cmd.o \
115	$(OBJ_DIR)/common/dm2.o \
116	$(OBJ_DIR)/common/endian.o \
117	$(OBJ_DIR)/common/mem.o \
118	$(OBJ_DIR)/common/menu.o \
119	$(OBJ_DIR)/common/pak.o \
120	$(OBJ_DIR)/common/q2utils.o \
121	$(OBJ_DIR)/common/utils.o \
122	$(OBJ_DIR)/replay/rp_client.o \
123	$(OBJ_DIR)/replay/rp_cmds.o \
124	$(OBJ_DIR)/replay/rp_dm2.o \
125	$(OBJ_DIR)/replay/rp_main.o \
126	$(OBJ_DIR)/replay/rp_menus.o \
127	$(OBJ_DIR)/replay/rp_q2utils.o \
128	$(OBJ_DIR)/replay/rp_save.o \
129	$(OBJ_DIR)/replay/rp_spawn.o \
130	$(OBJ_DIR)/replay/rp_svcmds.o \
131	$(OBJ_DIR)/replay/rp_utils.o \
132	$(OBJ_DIR)/replay/rp_view.o
133
134SOURCES = \
135	$(wildcard common/*.c) \
136	$(wildcard democonv/*.c) \
137	$(wildcard dm2server/*.c) \
138	$(wildcard proxy/*.c) \
139	$(wildcard relay/*.c) \
140	$(wildcard replay/*.c)
141
142HEADERS = \
143	$(wildcard common/*.h) \
144	$(wildcard democonv/*.h) \
145	$(wildcard dm2server/*.h) \
146	$(wildcard proxy/*.h) \
147	$(wildcard relay/*.h) \
148	$(wildcard replay/*.h)
149
150PROJECTS = \
151	democonv/democonv.dsp \
152	dm2server/dm2server.dsp \
153	proxy/proxy.dsp \
154	relay/relay.dsp \
155	replay/replay.dsp
156
157EXTRA_SOURCES = \
158	COPYING \
159	ChangeLog \
160	FAQ \
161	Makefile \
162	README \
163	proxify \
164
165SOURCE_DISTFILES = $(SOURCES) $(HEADERS) $(PROJECTS) $(EXTRA_SOURCES)
166SOURCE_DIST = $(DIST_DIR).src.tar.gz
167
168# phony targets
169.PHONY: all clean \
170	democonv clean-democonv \
171	relay clean-relay \
172	replay clean-replay \
173	proxy clean-proxy \
174	dist dist-clean \
175	volatile \
176	clean-depend
177
178# default build
179all: democonv dm2server proxy relay replay
180
181# rule to make directories if needed (use sort to remove duplicates)
182COMMON_DIRS=$(OBJ_DIR)/common
183DEMOCONV_DIRS=$(sort $(OUT_DIR)/democonv $(OBJ_DIR)/democonv)
184DM2SERVER_DIRS=$(sort $(OUT_DIR)/dm2server $(OBJ_DIR)/dm2server)
185PROXY_DIRS=$(sort $(OUT_DIR)/proxy $(OBJ_DIR)/proxy)
186RELAY_DIRS=$(sort $(OUT_DIR)/relay $(OBJ_DIR)/relay)
187REPLAY_DIRS=$(sort $(OUT_DIR)/replay $(OBJ_DIR)/replay)
188INSTALL_DIRS=$(QUAKE2_DIR)/release $(QUAKE2_DIR)/proxy $(QUAKE2_DIR)/proxy/relay $(QUAKE2_DIR)/proxy/replay
189
190$(COMMON_DIRS) $(DEMOCONV_DIRS) $(DM2SERVER_DIRS) $(PROXY_DIRS) $(RELAY_DIRS) $(REPLAY_DIRS) $(INSTALL_DIRS):
191	mkdir -p $@
192
193# democonv make
194democonv : $(COMMON_DIRS) $(DEMOCONV_DIRS) $(DEMOCONV_TARGET)
195
196$(DEMOCONV_TARGET) : $(DEMOCONV_OBJS)
197	$(DO_LINK)
198
199# dm2server make
200dm2server : $(COMMON_DIRS) $(DM2SERVER_DIRS) $(DM2SERVER_TARGET)
201
202$(DM2SERVER_TARGET) : $(DM2SERVER_OBJS)
203	$(DO_LINK)
204
205# proxy make
206proxy: $(COMMON_DIRS) $(PROXY_DIRS) $(PROXY_TARGET)
207
208$(PROXY_TARGET): $(PROXY_OBJS)
209	$(DO_SHLINK)
210
211# relay make
212relay : $(COMMON_DIRS) $(RELAY_DIRS) $(RELAY_TARGET)
213
214$(RELAY_TARGET) : $(RELAY_OBJS)
215	$(DO_SHLINK)
216
217# replay make
218replay : $(COMMON_DIRS) $(REPLAY_DIRS) $(REPLAY_TARGET)
219
220$(REPLAY_TARGET): $(REPLAY_OBJS)
221	$(DO_SHLINK)
222
223# volatile make
224volatile:
225	@echo \#define RELAY_VERSION \"$(VERSION)\" > common/volatile.h
226	@echo \#define RELAY_RELEASE \"$(RELEASE)\" >> common/volatile.h
227
228# distribution make
229source-dir:
230	@[ -e $(DIST_DIR) ] && rm -rf $(DIST_DIR) || exit 0
231	@mkdir -m 755 $(DIST_DIR)
232	@mkdir -m 755 $(DIST_DIR)/common
233	@mkdir -m 755 $(DIST_DIR)/democonv
234	@mkdir -m 755 $(DIST_DIR)/dm2server
235	@mkdir -m 755 $(DIST_DIR)/proxy
236	@mkdir -m 755 $(DIST_DIR)/relay
237	@mkdir -m 755 $(DIST_DIR)/replay
238	@for file in $(SOURCE_DISTFILES); do \
239	  install  -s -m 555 $$file $(DIST_DIR)/$$file; \
240	  chmod 644 $(DIST_DIR)/$$file; \
241	done
242	@chmod 755 $(DIST_DIR)/proxify
243
244source-dist: source-dir
245	@[ -e $(SOURCE_DIST) ] && rm -f $(SOURCE_DIST) || exit 0
246	$(TAR) czf $(SOURCE_DIST) $(DIST_DIR)
247	@chmod 644 $(SOURCE_DIST)
248
249# install make
250install: $(INSTALL_DIRS)
251	install  -s -m 555 $(DEMOCONV_TARGET) $(BIN_DIR)
252	install  -s -m 555 $(DM2SERVER_TARGET) $(BIN_DIR)
253	install  -s -m 555 $(PROXY_TARGET) $(QUAKE2_DIR)/release
254	install  -s -m 555 $(RELAY_TARGET) $(QUAKE2_DIR)/proxy/relay
255	install  -s -m 555 $(REPLAY_TARGET) $(QUAKE2_DIR)/proxy/replay
256
257# remove carriage returns
258remove-carriage-returns:
259	dos2unix $(SOURCES) $(HEADERS) $(EXTRA_SOURCES)
260
261lowercase:
262	lcfile $(SOURCES) $(HEADERS)
263
264# clean make
265clean-democonv:
266	rm -f $(DEMOCONV_OBJS)
267	rm -f $(DEMOCONV_TARGET)
268
269clean-dm2server:
270	rm -f $(DM2SERVER_OBJS)
271	rm -f $(DM2SERVER_TARGET)
272
273clean-proxy:
274	rm -f $(PROXY_OBJS)
275	rm -f $(PROXY_TARGET)
276
277clean-relay:
278	rm -f $(RELAY_OBJS)
279	rm -f $(RELAY_TARGET)
280
281clean-replay:
282	rm -f $(REPLAY_OBJS)
283	rm -f $(REPLAY_TARGET)
284
285clean: clean-democonv clean-dm2server clean-proxy clean-relay clean-replay clean-depend
286
287# common files
288$(OBJ_DIR)/common/%.o : common/%.c
289	$(DO_CC)
290
291# democonv files
292$(OBJ_DIR)/democonv/%.o : democonv/%.c
293	$(DO_CC)
294
295# dm2server files
296$(OBJ_DIR)/dm2server/%.o : dm2server/%.c
297	$(DO_CC)
298
299# relay files
300$(OBJ_DIR)/relay/%.o : relay/%.c
301	$(DO_CC)
302
303# replay files
304$(OBJ_DIR)/replay/%.o : replay/%.c
305	$(DO_CC)
306
307# proxy files
308$(OBJ_DIR)/proxy/%.o : proxy/%.c
309	$(DO_CC)
310
311# dependencies (uses the GNU dependency system)
312%.d: %.c
313	@set -e; $(CC) -MM $(CPPFLAGS) $< \
314		| sed -e 's/^\($(notdir $*)\)\.o/$(subst /,\/,$*).o $(subst /,\/,$@)/g' > $@; \
315		[ -s $@ ] || rm -f $@
316
317clean-depend:
318	rm -f $(SOURCES:.c=.d)
319
320-include $(SOURCES:.c=.d)
321