# created on 4/12/2006 by James Bentler

CXX ?= g++
CC ?= gcc
NASM ?= nasm
CCDV = @./ccdv
ifdef DEBUG
  CFLAGS ?= -pipe -Wall -Wno-unused -fno-strict-aliasing
else
  CFLAGS ?= -pipe -Wall -Wno-unused -fno-strict-aliasing -O2 -fomit-frame-pointer
  CXXFLAGS ?= -fno-rtti
endif
ifdef GC
  CFLAGS += -ffunction-sections
  LDFLAGS += -Wl,--gc-sections
endif
CFLAGS += -MMD -DHAVE_FILELENGTH -D__forceinline=inline -Izlib -IFLAC `sdl-config --cflags`
CFLAGS += -Dstricmp=strcasecmp -Dstrnicmp=strncasecmp -DNEED_STRUPR
LDFLAGS += -lFLAC++ -lFLAC -lz -lfmod `sdl-config --libs`
NASMFLAGS += -f elf -DM_TARGET_LINUX

SRCDIRS = src/ $(addprefix src/,g_doom/ g_heretic/ g_hexen/ g_raven/ g_shared/ g_strife/ oplsynth/ sound/ sdl/)
VPATH = $(SRCDIRS)
INCLUDES = $(addprefix -I,$(SRCDIRS))
CFLAGS += $(INCLUDES)

RELEASEOBJ ?= releaseobj
DEBUGOBJ ?= debugobj

CPPSRCS = $(wildcard $(addsuffix *.cpp,$(SRCDIRS)))
CSRCS = $(wildcard $(addsuffix *.c,$(SRCDIRS)))
ifdef NOASM
  CFLAGS += -DNOASM
else
  ASRCS = $(wildcard src/*.nas)
  CFLAGS += -DUSEASM=1
endif
SRCS = $(CSRCS) $(CPPSRCS) $(ASRCS)
CPPOBJFILES = $(notdir $(patsubst %.cpp,%.o,$(CPPSRCS)))
COBJFILES = $(notdir $(patsubst %.c,%.o,$(CSRCS)))
AOBJFILES = $(notdir $(patsubst %.nas,%.o,$(ASRCS)))

ZDOOM = zdoom
ZDOOMDEBUG = zdoomd

ifdef DEBUG
  OBJDIR = $(DEBUGOBJ)
  CFLAGS += -D_DEBUG -g3
  NASMFLAGS += -g
  ZDOOMBIN = $(ZDOOMDEBUG)
else
  OBJDIR = $(RELEASEOBJ)
  CFLAGS += -DNDEBUG
  LDFLAGS += -s -Wl,-Map=$(ZDOOM).map
  ZDOOMBIN = $(ZDOOM)
endif
CXXFLAGS += $(CFLAGS)

COBJS = $(addprefix $(OBJDIR)/,$(CPPOBJFILES) $(COBJFILES))
DEPS = $(patsubst %.o,%.d,$(COBJS))
OBJS = $(addprefix $(OBJDIR)/,$(AOBJFILES)) $(COBJS)

all: $(ZDOOMBIN) toolsandpk3 zdoom.pk3

$(ZDOOMBIN): ccdv updaterev $(OBJDIR) $(OBJS)
	$(CCDV) $(CXX) $(LDFLAGS) $(OBJDIR)/autostart.o \
	$(filter-out %/autostart.o %/autozend.o,$(OBJS)) \
	$(OBJDIR)/autozend.o -o $(ZDOOMBIN)

$(OBJDIR)/%.o: %.cpp
	$(CCDV) $(CXX) $(CXXFLAGS) -o $@ -c $<

$(OBJDIR)/%.o: %.c
	$(CCDV) $(CC) $(CFLAGS) -o $@ -c $<

$(OBJDIR)/%.o: %.nas
	$(CCDV) $(NASM) -o $@ $(NASMFLAGS) $<

# This file needs special handling so that it actually gets compiled with SSE2 support.
$(OBJDIR)/nodebuild_classify_sse2.o: nodebuild_classify_sse2.cpp
	$(CCDV) $(CXX) $(CXXFLAGS) -msse2 -mfpmath=sse -c -o $@ $<

$(OBJDIR):
	mkdir $(OBJDIR)

toolsandpk3: ccdv tools/makewad/makewad tools/dehsupp/dehsupp tools/xlatcc/xlatcc
	$(MAKE) -C wadsrc/

zdoom.pk3: toolsandpk3
	ln -sf wadsrc/zdoom.pk3 ./

tools/makewad/makewad:
	$(MAKE) -C tools/makewad/

tools/dehsupp/dehsupp:
	$(MAKE) -C tools/dehsupp/

tools/xlatcc/xlatcc:
	$(MAKE) -C tools/xlatcc/


updaterev: tools/updaterevision/updaterevision
	@tools/updaterevision/updaterevision . src/svnrevision.h

tools/updaterevision/updaterevision:
	$(MAKE) -C tools/updaterevision

.PHONY : clean cleandeps cleanobjs distclean toolsandpk3 cleantools updaterev

clean: cleanobjs
	rm -f $(ZDOOMDEBUG) $(ZDOOM) $(ZDOOM).map
	rm -f ccdv

cleantools:
	@$(MAKE) -C tools/makewad clean
	@$(MAKE) -C tools/dehsupp clean
	@$(MAKE) -C tools/xlatcc clean

cleandebug:
	rm -f $(ZDOOMDEBUG) $(DEBUGOBJ)/*.o $(DEBUGOBJ)/*.d
	-rmdir $(DEBUGOBJ)

cleanrelease:
	rm -f $(ZDOOM) $(ZDOOM).map $(RELEASEOBJ)/*.o $(RELEASEOBJ)/*.o
	-rmdir $(RELEASEOBJ)

# I could use a recursive delete instead, but that could be dangerous...
distclean: clean cleandeps
	-rmdir $(RELEASEOBJ) $(DEBUGOBJ)

cleandeps:
	rm -f $(RELEASEOBJ)/*.d $(DEBUGOBJ)/*.d

cleanobjs:
	rm -f $(RELEASEOBJ)/*.o $(DEBUGOBJ)/*.o 
   
ccdv: ccdv-posix.c
	@gcc -Os -s ccdv-posix.c -o ccdv

ifeq (,$(findstring $(MAKECMDGOALS),clean cleandeps cleanobjs distclean toolsandpk3 cleantools updaterev))
-include $(DEPS)
endif
