.PRECIOUS: %.o

.PHONY: game all tar dirs clean distclean veryclean compress depend

CC = gcc
CFLAGS = -Wall -O2 -fomit-frame-pointer -ffast-math -funroll-loops -s -mcpu=pentium
CFLAGS = -Wall -Wno-deprecated-declarations -O -g
INCLUDE = -I include -I /usr/local/include
BASENAME = carcass

ifdef DEBUGMODE
   CFLAGS = -W -Wall -O -g -DDEBUGMODE
endif

ifdef DONT_USE_EXTENSIONS
   CFLAGS += -DDONT_USE_CD
endif

ifdef PROFILEMODE
   CFLAGS += -pg
   LFLAGS += -pg
endif

ifdef CROSSCOMPILE
   MINGDIR = $(HOME)/cross-tools/bin
   ifndef XPREFIX
      XPREFIX = i386-mingw32msvc-
   endif
   CFLAGS += -DALLEGRO_WINDOWS
endif

#For Make to detect MingW automatically, the variable MINGDIR must be set
#Likewise, for DJGPP the variable DJGPP must be set
ifdef MINGDIR

   ifdef CROSSCOMPILE
      CC = $(XPREFIX)gcc
      RC = $(XPREFIX)windres
      INCLUDE += -I $(HOME)/cross-tools/include -LI$(HOME)/cross-tools/lib
      STATICLINK = 1
   else
      RC = windres
   endif
   
   ifdef STATICLINK
      LIBS = -lalleg_s -lm -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lole32 -ldinput -lddraw -ldxguid -lwinmm -ldsound
      CFLAGS += -DALLEGRO_STATICLINK -DCROSSCOMPILE
   else
      LIBS = -lalleg -lm -lwinmm
   endif

   LFLAGS = -Wl,--subsystem,windows
   ifdef CPU
      CFLAGS += -mcpu=$(CPU)
   else
      CFLAGS += -mcpu=i686
   endif
   LIBS += -lnet -lwsock32
   OBJDIR = obj/mingw

   EXEF = $(BASENAME)95.exe
   THEMED = themedit95.exe

   SRCARCH = carcassonne-src
   DATARCH = carcassonne-dat

   RESOURCE = $(OBJDIR)/$(BASENAME).res
else
   ifdef DJGPP
      ifdef CPU
         CFLAGS += -mcpu=$(CPU)
      else
         CFLAGS += -mcpu=i686
      endif
      LIBS = -lalleg -lm
      OBJDIR = obj/djgpp
      EXEF = $(BASENAME).exe
      THEMED = themedit.exe

      SRCARCH = carcassonne-src
      DATARCH = carcassonne-dat
   else
      ifdef CPU
         CFLAGS += -mcpu=$(CPU)
      endif
      ifdef STATICLINK
         LIBS = `allegro-config --libs --static` -lXrender
         LFLAGS += -static -static-libgcc
      else
         ifdef SHAREDLINK
            LIBS = `allegro-config --libs --shared`
         else
            LIBS = `allegro-config --libs`
         endif
      endif
      
      ifndef NONETWORK
         LIBS += -lnet
      endif
      
      ifdef OSTYPE
        OBJDIR = obj/$(OSTYPE)
        LIBDIR = lib/$(OSTYPE)
        EXEDIR = bin/$(OSTYPE)
      else
        OBJDIR = obj/unix
        LIBDIR = lib/unix
        EXEDIR = bin/unix
      endif
      EXEF = $(BASENAME)
      THEMED = themedit
      
      VERSION=`grep "define GAME_VERSION" Carcassonne/include/carcass.h | sed 's/\#define GAME_VERSION[ ]*\"//'| sed 's/\"//'`
      BINARCH = carcassonne-$(VERSION)-bin
      SRCARCH = carcassonne-$(VERSION)-src
      DATARCH = carcassonne-$(VERSION)-dat

      CFLAGS += -pipe
   endif
endif

GOBJS +=$(OBJDIR)/carcass.o\
        $(OBJDIR)/linked.o\
        $(OBJDIR)/genrand.o\
        $(OBJDIR)/playgame.o\
        $(OBJDIR)/global.o\
        $(OBJDIR)/palette.o\
        $(OBJDIR)/gfx.o\
        $(OBJDIR)/sound.o\
        $(OBJDIR)/cd.o\
        $(OBJDIR)/gmemusic.o\
        $(OBJDIR)/dialog.o\
        $(OBJDIR)/gamegfx.o\
        $(OBJDIR)/game.o\
        $(OBJDIR)/rules.o\
        $(OBJDIR)/str.o\
        $(OBJDIR)/ctsparse.o\
        $(OBJDIR)/tileset.o\
        $(OBJDIR)/carcassico.o\
        $(RESOURCE)

THEMEDOBJS += $(OBJDIR)/grabber.o\
              $(OBJDIR)/datedit.o\
              $(OBJDIR)/datfname.o\
              $(OBJDIR)/datgrab.o\
              $(OBJDIR)/datgrid.o\
              $(OBJDIR)/datimage.o\
              $(OBJDIR)/datitype.o\
              $(OBJDIR)/carcassico.o\
              $(RESOURCE)

SRC_ARCH_LIST = Carcassonne/Makefile\
                Carcassonne/makefile.dep\
                Carcassonne/depend.sh\
                Carcassonne/gfx/carcassonne.ico\
                Carcassonne/obj/mingw/\
                Carcassonne/obj/djgpp/\
                Carcassonne/src/*\
                Carcassonne/include/*\
                Carcassonne/README\
                Carcassonne/CHANGES

DAT_ARCH_LIST = Carcassonne/carcass.gme\
                Carcassonne/intrface.dat\
                Carcassonne/deftheme.dat\
                Carcassonne/fonts.dat\
                Carcassonne/*.cts\
                Carcassonne/sfx/error.wav\
                Carcassonne/sfx/place.wav\
                Carcassonne/sfx/435.wav\
                Carcassonne/sfx/neg1.wav\
                Carcassonne/sfx/point.wav\
                Carcassonne/README\
                Carcassonne/CHANGES

ifdef NONETWORK
    GOBJS += $(OBJDIR)/nonet.o
else
    GOBJS += $(OBJDIR)/libnet.o
endif

game: dirs $(EXEF)

all: game $(THEMED)

dirs: $(OBJDIR) $(LIBDIR) $(EXEDIR)

tar: distclean depend
	@cd ..; tar cvfz "Carcassonne/$(SRCARCH).tar.gz" $(SRC_ARCH_LIST); cd Carcassonne
	@echo "Building source archive..."
	@cd ..; tar cvfz "Carcassonne/$(SRCARCH).tar.gz" $(SRC_ARCH_LIST); cd Carcassonne
	@echo "Building data archive..."
	@cd ..; tar cvfz "Carcassonne/$(DATARCH).tar.gz" $(DAT_ARCH_LIST); cd Carcassonne
	@echo "Building binary archive..."
	@make STATICLINK=1 all
	@cd ..; tar cvfz "Carcassonne/$(BINARCH).tar.gz" $(DAT_ARCH_LIST) Carcassonne/$(EXEF) Carcassonne/$(THEMED); cd Carcassonne
        
$(OBJDIR):
	mkdir -p $@

$(LIBDIR):
	mkdir -p $@

$(EXEDIR):
	mkdir -p $@


compress: all
	strip $(EXEF)
	upx --best $(EXEF)

clean:
	rm -f $(OBJDIR)/*.o $(EXEF)

distclean: clean
	rm -f obj/unix/*.o obj/djgpp/*.o obj/mingw/*.o $(BASENAME) $(BASENAME).exe $(BASENAME)95.exe

veryclean: distclean
	rm -f makefile.dep

depend:
	@echo "Generating dependencies..."
	@rm -f makefile.dep
	@sh ./depend.sh include src > makefile.dep
	@sh ./depend.sh include src/gfx >> makefile.dep
	@sh ./depend.sh include src/sound >> makefile.dep
	@sh ./depend.sh include src/misc >> makefile.dep
	@sh ./depend.sh include src/loop >> makefile.dep
	@sh ./depend.sh include src/dialog >> makefile.dep
	@sh ./depend.sh include src/net >> makefile.dep
	@sh ./depend.sh include src/themedit >> makefile.dep
	@sh ./depend.sh include src/themedit/plugins >> makefile.dep
	@echo "Done!"
	@exit

#Alternative depend line:
#depend:
#    $(CC) -MM $(CFLAGS) *.cpp | sed "s/.*\.o[ :]*/$(subst /,\/,$(OBJ_DIR))\/\0/g" > _depend

makefile.dep:

$(EXEF): $(GOBJS)
	$(CC) $(LFLAGS) $(GOBJS) -o $@ $(LIBS)

$(THEMED): $(THEMEDOBJS)
	$(CC) $(LFLAGS) $(THEMEDOBJS) -Isrc/themedit -o $@ $(LIBS)

$(RESOURCE): src/$(BASENAME).rc gfx/$(BASENAME).ico
	$(RC) -O coff -o $@ -i $<

include makefile.dep
