# volatile information VERSION=0.4 RELEASE=beta QUAKE2_DIR=/usr/local/games/quake2 BIN_DIR=/usr/local/bin ARCH=i386 SHLIBEXT=so Q2MODULE=game$(ARCH).$(SHLIBEXT) define NEWLINE endef # distribution settings DIST_BASE=relay DIST_DIR=$(DIST_BASE)-$(VERSION) # debug is the default build mode ifneq ($(MODE),debug) ifneq ($(MODE),release) MODE=debug endif endif # default commands and build options CC=gcc LD=gcc CPPFLAGS=-Icommon CFLAGS=-Wall -fPIC LDFLAGS=-lm # commands DO_CC=$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< DO_LINK=$(LD) $(LDFLAGS) -o $@ $^ DO_SHLINK=$(LD) $(LDFLAGS) -shared -o $@ $^ TAR=/bin/tar # include mode-specific build options (can override the above) # targets DEMOCONV_TARGET=$(OUT_DIR)/democonv/democonv DM2SERVER_TARGET=$(OUT_DIR)/dm2server/dm2server PROXY_TARGET=$(OUT_DIR)/proxy/$(Q2MODULE) RELAY_TARGET=$(OUT_DIR)/relay/$(Q2MODULE) REPLAY_TARGET=$(OUT_DIR)/replay/$(Q2MODULE) TARGETS = \ $(DEMOCONV_TARGET) \ $(DM2SERVER_TARGET) \ $(PROXY_TARGET) \ $(RELAY_TARGET) \ $(REPLAY_TARGET) # objects DEMOCONV_OBJS = \ $(OBJ_DIR)/common/block.o \ $(OBJ_DIR)/common/bsp.o \ $(OBJ_DIR)/common/cmd.o \ $(OBJ_DIR)/common/dm2.o \ $(OBJ_DIR)/common/endian.o \ $(OBJ_DIR)/common/getopt.o \ $(OBJ_DIR)/common/getopt1.o \ $(OBJ_DIR)/common/mem.o \ $(OBJ_DIR)/common/pak.o \ $(OBJ_DIR)/common/q2utils.o \ $(OBJ_DIR)/common/utils.o \ $(OBJ_DIR)/democonv/dc_dm2.o \ $(OBJ_DIR)/democonv/dc_main.o DM2SERVER_OBJS = \ $(OBJ_DIR)/common/block.o \ $(OBJ_DIR)/common/bsp.o \ $(OBJ_DIR)/common/cmd.o \ $(OBJ_DIR)/common/dm2.o \ $(OBJ_DIR)/common/endian.o \ $(OBJ_DIR)/common/mem.o \ $(OBJ_DIR)/common/menu.o \ $(OBJ_DIR)/common/net.o \ $(OBJ_DIR)/common/pak.o \ $(OBJ_DIR)/common/q2utils.o \ $(OBJ_DIR)/common/utils.o \ $(OBJ_DIR)/dm2server/sv_challenge.o \ $(OBJ_DIR)/dm2server/sv_clcmds.o \ $(OBJ_DIR)/dm2server/sv_client.o \ $(OBJ_DIR)/dm2server/sv_cvar.o \ $(OBJ_DIR)/dm2server/sv_dm2.o \ $(OBJ_DIR)/dm2server/sv_main.o \ $(OBJ_DIR)/dm2server/sv_menus.o \ $(OBJ_DIR)/dm2server/sv_net.o \ $(OBJ_DIR)/dm2server/sv_pmove.o \ $(OBJ_DIR)/dm2server/sv_svcmds.o PROXY_OBJS = \ $(OBJ_DIR)/common/proxy.o \ $(OBJ_DIR)/proxy/p_main.o RELAY_OBJS = \ $(OBJ_DIR)/common/block.o \ $(OBJ_DIR)/common/cmd.o \ $(OBJ_DIR)/common/dm2.o \ $(OBJ_DIR)/common/endian.o \ $(OBJ_DIR)/common/mem.o \ $(OBJ_DIR)/common/pak.o \ $(OBJ_DIR)/common/proxy.o \ $(OBJ_DIR)/common/q2utils.o \ $(OBJ_DIR)/common/utils.o \ $(OBJ_DIR)/relay/r_export.o \ $(OBJ_DIR)/relay/r_import.o \ $(OBJ_DIR)/relay/r_main.o REPLAY_OBJS = \ $(OBJ_DIR)/common/block.o \ $(OBJ_DIR)/common/cmd.o \ $(OBJ_DIR)/common/dm2.o \ $(OBJ_DIR)/common/endian.o \ $(OBJ_DIR)/common/mem.o \ $(OBJ_DIR)/common/menu.o \ $(OBJ_DIR)/common/pak.o \ $(OBJ_DIR)/common/q2utils.o \ $(OBJ_DIR)/common/utils.o \ $(OBJ_DIR)/replay/rp_client.o \ $(OBJ_DIR)/replay/rp_cmds.o \ $(OBJ_DIR)/replay/rp_dm2.o \ $(OBJ_DIR)/replay/rp_main.o \ $(OBJ_DIR)/replay/rp_menus.o \ $(OBJ_DIR)/replay/rp_q2utils.o \ $(OBJ_DIR)/replay/rp_save.o \ $(OBJ_DIR)/replay/rp_spawn.o \ $(OBJ_DIR)/replay/rp_svcmds.o \ $(OBJ_DIR)/replay/rp_utils.o \ $(OBJ_DIR)/replay/rp_view.o SOURCES = \ $(wildcard common/*.c) \ $(wildcard democonv/*.c) \ $(wildcard dm2server/*.c) \ $(wildcard proxy/*.c) \ $(wildcard relay/*.c) \ $(wildcard replay/*.c) HEADERS = \ $(wildcard common/*.h) \ $(wildcard democonv/*.h) \ $(wildcard dm2server/*.h) \ $(wildcard proxy/*.h) \ $(wildcard relay/*.h) \ $(wildcard replay/*.h) PROJECTS = \ democonv/democonv.dsp \ dm2server/dm2server.dsp \ proxy/proxy.dsp \ relay/relay.dsp \ replay/replay.dsp EXTRA_SOURCES = \ COPYING \ ChangeLog \ FAQ \ Makefile \ README \ proxify \ SOURCE_DISTFILES = $(SOURCES) $(HEADERS) $(PROJECTS) $(EXTRA_SOURCES) SOURCE_DIST = $(DIST_DIR).src.tar.gz # phony targets .PHONY: all clean \ democonv clean-democonv \ relay clean-relay \ replay clean-replay \ proxy clean-proxy \ dist dist-clean \ volatile \ clean-depend # default build all: democonv dm2server proxy relay replay # rule to make directories if needed (use sort to remove duplicates) COMMON_DIRS=$(OBJ_DIR)/common DEMOCONV_DIRS=$(sort $(OUT_DIR)/democonv $(OBJ_DIR)/democonv) DM2SERVER_DIRS=$(sort $(OUT_DIR)/dm2server $(OBJ_DIR)/dm2server) PROXY_DIRS=$(sort $(OUT_DIR)/proxy $(OBJ_DIR)/proxy) RELAY_DIRS=$(sort $(OUT_DIR)/relay $(OBJ_DIR)/relay) REPLAY_DIRS=$(sort $(OUT_DIR)/replay $(OBJ_DIR)/replay) INSTALL_DIRS=$(QUAKE2_DIR)/release $(QUAKE2_DIR)/proxy $(QUAKE2_DIR)/proxy/relay $(QUAKE2_DIR)/proxy/replay $(COMMON_DIRS) $(DEMOCONV_DIRS) $(DM2SERVER_DIRS) $(PROXY_DIRS) $(RELAY_DIRS) $(REPLAY_DIRS) $(INSTALL_DIRS): mkdir -p $@ # democonv make democonv : $(COMMON_DIRS) $(DEMOCONV_DIRS) $(DEMOCONV_TARGET) $(DEMOCONV_TARGET) : $(DEMOCONV_OBJS) $(DO_LINK) # dm2server make dm2server : $(COMMON_DIRS) $(DM2SERVER_DIRS) $(DM2SERVER_TARGET) $(DM2SERVER_TARGET) : $(DM2SERVER_OBJS) $(DO_LINK) # proxy make proxy: $(COMMON_DIRS) $(PROXY_DIRS) $(PROXY_TARGET) $(PROXY_TARGET): $(PROXY_OBJS) $(DO_SHLINK) # relay make relay : $(COMMON_DIRS) $(RELAY_DIRS) $(RELAY_TARGET) $(RELAY_TARGET) : $(RELAY_OBJS) $(DO_SHLINK) # replay make replay : $(COMMON_DIRS) $(REPLAY_DIRS) $(REPLAY_TARGET) $(REPLAY_TARGET): $(REPLAY_OBJS) $(DO_SHLINK) # volatile make volatile: @echo \#define RELAY_VERSION \"$(VERSION)\" > common/volatile.h @echo \#define RELAY_RELEASE \"$(RELEASE)\" >> common/volatile.h # distribution make source-dir: @[ -e $(DIST_DIR) ] && rm -rf $(DIST_DIR) || exit 0 @mkdir -m 755 $(DIST_DIR) @mkdir -m 755 $(DIST_DIR)/common @mkdir -m 755 $(DIST_DIR)/democonv @mkdir -m 755 $(DIST_DIR)/dm2server @mkdir -m 755 $(DIST_DIR)/proxy @mkdir -m 755 $(DIST_DIR)/relay @mkdir -m 755 $(DIST_DIR)/replay @for file in $(SOURCE_DISTFILES); do \ install -s -o root -g wheel -m 555 $$file $(DIST_DIR)/$$file; \ chmod 644 $(DIST_DIR)/$$file; \ done @chmod 755 $(DIST_DIR)/proxify source-dist: source-dir @[ -e $(SOURCE_DIST) ] && rm -f $(SOURCE_DIST) || exit 0 $(TAR) czf $(SOURCE_DIST) $(DIST_DIR) @chmod 644 $(SOURCE_DIST) # install make install: $(INSTALL_DIRS) install -s -o root -g wheel -m 555 $(DEMOCONV_TARGET) $(BIN_DIR) install -s -o root -g wheel -m 555 $(DM2SERVER_TARGET) $(BIN_DIR) install -s -o root -g wheel -m 555 $(PROXY_TARGET) $(QUAKE2_DIR)/release install -s -o root -g wheel -m 555 $(RELAY_TARGET) $(QUAKE2_DIR)/proxy/relay install -s -o root -g wheel -m 555 $(REPLAY_TARGET) $(QUAKE2_DIR)/proxy/replay # remove carriage returns remove-carriage-returns: dos2unix $(SOURCES) $(HEADERS) $(EXTRA_SOURCES) lowercase: lcfile $(SOURCES) $(HEADERS) # clean make clean-democonv: rm -f $(DEMOCONV_OBJS) rm -f $(DEMOCONV_TARGET) clean-dm2server: rm -f $(DM2SERVER_OBJS) rm -f $(DM2SERVER_TARGET) clean-proxy: rm -f $(PROXY_OBJS) rm -f $(PROXY_TARGET) clean-relay: rm -f $(RELAY_OBJS) rm -f $(RELAY_TARGET) clean-replay: rm -f $(REPLAY_OBJS) rm -f $(REPLAY_TARGET) clean: clean-democonv clean-dm2server clean-proxy clean-relay clean-replay clean-depend # common files $(OBJ_DIR)/common/%.o : common/%.c $(DO_CC) # democonv files $(OBJ_DIR)/democonv/%.o : democonv/%.c $(DO_CC) # dm2server files $(OBJ_DIR)/dm2server/%.o : dm2server/%.c $(DO_CC) # relay files $(OBJ_DIR)/relay/%.o : relay/%.c $(DO_CC) # replay files $(OBJ_DIR)/replay/%.o : replay/%.c $(DO_CC) # proxy files $(OBJ_DIR)/proxy/%.o : proxy/%.c $(DO_CC) # dependencies (uses the GNU dependency system) %.d: %.c @set -e; $(CC) -MM $(CPPFLAGS) $< \ | sed -e 's/^\($(notdir $*)\)\.o/$(subst /,\/,$*).o $(subst /,\/,$@)/g' > $@; \ [ -s $@ ] || rm -f $@ clean-depend: rm -f $(SOURCES:.c=.d) -include $(SOURCES:.c=.d)