.PRECIOUS: %.o

.PHONY: game all clean distclean veryclean compress depend

# Ugly hack to detect platform, should be done properly using CMake (or
# autotools)
UNAME = $(shell uname)

ifeq ($(UNAME),Linux)
ARCH_FLAGS = -mtune=native
else 
ifeq ($(UNAME), Darwin)
# Flags describing the target architecture; these work for OS X (Intel) and
# will produce a "fat binary" there that can run in both 64 bit and 32 bit mode
ARCH_FLAGS = -arch i386 -arch x86_64
endif
endif

ifeq ($(UNAME), Darwin)
CFLAGS = -Wall -Winline -Wno-deprecated-declarations --param max-inline-insns-single=800 -O3 -fast -g $(ARCH_FLAGS)
else
CFLAGS = -Wall -Winline -Wno-deprecated-declarations --param max-inline-insns-single=800 -O2 -funroll-loops -finline -g $(ARCH_FLAGS)
endif

CC = gcc
LFLAGS =$(ARCH_FLAGS)
A5LFLAGS = $(LFLAGS)
#A5LIBS = `pkg-config --libs a5_font-debug-4.9 allegro-debug-4.9 a5_ttf-debug-4.9 a5_iio-debug-4.9 a5_primitives-debug-4.9 a5_dialog-debug-4.9`
A5LIBS = `pkg-config --libs allegro_font-debug-4.9 allegro-debug-4.9 allegro_ttf-debug-4.9 allegro_image-debug-4.9 allegro_primitives-debug-4.9 allegro_dialog-debug-4.9`
INCLUDE = -Iinclude
BASENAME = jazz

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

ifdef PROFILEMODE
   CFLAGS += -pg
endif

EXEF = c$(BASENAME)
CFLAGS += -pipe

OBJDIR=obj/

GOBJS = $(OBJDIR)/genrand.o\
        $(OBJDIR)/names.o\
        $(OBJDIR)/move.o\
        $(OBJDIR)/square.o\
        $(OBJDIR)/board.o\
        $(OBJDIR)/movegen.o\
        $(OBJDIR)/pieces.o\
        $(OBJDIR)/game.o\
        $(OBJDIR)/fen.o\
        $(OBJDIR)/write_pgn.o\
        $(OBJDIR)/alphabeta.o\
        $(OBJDIR)/computer.o\
        $(OBJDIR)/evaluate.o\
        $(OBJDIR)/piece_tables.o\
        $(OBJDIR)/pawns.o\
        $(OBJDIR)/see.o\
        $(OBJDIR)/timer.o\
        $(OBJDIR)/hashtable.o\
        $(OBJDIR)/bitboard.o

ifeq ($(UNAME),Linux)
GOBJS += $(OBJDIR)/qsort.o
endif

all: dirs game

game: $(EXEF) a5jazz

test: dirs test_jazz perftest

hashkeys: $(OBJDIR)/generate_hash_keys.o $(OBJDIR)/genrand.o
	$(CC) $(LFLAGS)  $^ -o $@ $(LIBS)


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

$(OBJDIR):
	mkdir -p $@

$(LIBDIR):
	mkdir -p $@

$(EXEDIR):
	mkdir -p $@

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

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

distclean:
	rm -f obj/*.o

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/rules >> makefile.dep
	@sh ./depend.sh include src/misc >> makefile.dep
	@sh ./depend.sh include src/eval >> makefile.dep
	@sh ./depend.sh include src/search >> makefile.dep
	@sh ./depend.sh include src/computer >> makefile.dep
	@sh ./depend.sh include src/interface >> makefile.dep
	@sh ./depend.sh include src/import >> makefile.dep
	@sh ./depend.sh include src/export >> makefile.dep
	@sh ./depend.sh include src/hash >> makefile.dep
	@sh ./depend.sh include src/timer >> makefile.dep
	@echo "Done!"
	@exit

makefile.dep:

$(EXEF): $(OBJDIR)/cjazz.o $(GOBJS)
	$(CC) $(LFLAGS) $< $(GOBJS) -o $@ $(LIBS)

test_jazz: $(OBJDIR)/test_jazz.o $(GOBJS)
	$(CC) $(LFLAGS) $< $(GOBJS) -o $@ $(LIBS)

perftest: $(OBJDIR)/perftest.o $(GOBJS)
	$(CC) $(LFLAGS) $< $(GOBJS) -o $@ $(LIBS)

a5jazz: $(OBJDIR)/a5jazz.o $(GOBJS)
	$(CC) $(A5LFLAGS) $< $(GOBJS) -o $@ $(LIBS) $(A5LIBS)

ucijazz: $(OBJDIR)/uci.o $(GOBJS)
	$(CC) $(A5LFLAGS) $< $(GOBJS) -o $@ $(LIBS)

include makefile.dep
