HEADERS = config.h types.h global.h gggo.h play.h uct.h mc.h pack.h	\
	  SFMT.h timebase.h cs.h queue.h
SOURCES = main.c genmove.c uct.c board.c queue.c play.c mc.c	\
	  client.c csutils.c
OTHERS = server.c simple_server.c mc_main.c pack.c update_ren.c	\
	 printutils.c SFMT.c Makefile
OBJECTS =  $(patsubst %.c,%.o,$(SOURCES))

FLAGS = -g -O3 -std=c99	\
  -D_GNU_SOURCE -DFASTEST=1 -DSAFETY=1 -DMEXP=19937	\
  -fomit-frame-pointer -fshort-enums -freg-struct-return	\
  -fschedule-insns -fschedule-insns2 -fforce-addr -ffunction-sections	\
  -fno-strict-aliasing -finline-functions -funroll-loops	\
#  -DNDEBUG

FLAGS_PPU = -g -O3 -std=c99	\
  -D_GNU_SOURCE -DFASTEST=1 -DSAFETY=1 -DMEXP=19937	\
#  -fomit-frame-pointer -fshort-enums -freg-struct-return	\
#  -fschedule-insns -fschedule-insns2 -fforce-addr -ffunction-sections	\
#  -fno-strict-aliasing -finline-functions -funroll-loops	\
#  -DNDEBUG

MFLAGS_X86 = -march=native -msse3 -mfpmath=sse -fgnu89-inline -DSSE2 -DUSE_SPU=0
MFLAGS_PPU = -m32 -maltivec -mabi=altivec -DALTIVEC
MFLAGS_SPU = -DALTIVEC

WARNINGS = -Wall -W -Wpointer-arith -Wbad-function-cast -Wcast-qual \
  -Wcast-align -Wwrite-strings -Wmissing-declarations -Wundef \
  -Wdeclaration-after-statement -Wstrict-prototypes -Wmissing-prototypes

LFLAGS = -Wl,--gc-sections

LIBS = -lpthread -lm -lrt

CFLAGS_X86 = $(FLAGS) $(MFLAGS_X86) $(WARNINGS)
CFLAGS_PPU = $(FLAGS_PPU) $(MFLAGS_PPU) $(WARNINGS)
CFLAGS_SPU = $(FLAGS) $(MFLAGS_SPU) $(WARNINGS)

SYSROOT_PPU = /opt/cell/sysroot/

CC = gcc
TARGETS = fudo x86 ps3 s86

all: fudo s86

fudo: $(HEADERS) $(OBJECTS) printutils.c update_ren.c SFMT.c Makefile
	$(CC) -o $@ $(OBJECTS) -m64 $(CFLAGS_X86) $(LFLAGS) $(LIBS)

ps3: $(HEADERS) server.c pack.c queue.c printutils.c csutils.c spu.a SFMT.c Makefile
	ppu-gcc -o $@ server.c pack.c queue.c csutils.c spu.a $(CFLAGS_PPU) -DUSE_SPU=1 -DSERVER $(LFLAGS) $(LIBS) -lspe2

spu.a: spu
	embedspu -m32 spe_main_handle spu spu-embed32.o
	ppu-ar -qcs $@ spu-embed32.o

spu: $(HEADERS) mc.c mc_main.c pack.c update_ren.c printutils.c csutils.c SFMT.c Makefile
	spu-gcc -o $@ mc.c mc_main.c csutils.c $(CFLAGS_SPU) -DSERVER -lm

x86: $(HEADERS) server.c mc.c mc_main.c pack.c queue.c update_ren.c printutils.c csutils.c SFMT.c Makefile
	gcc -o $@ server.c mc.c mc_main.c queue.c csutils.c -m32 $(CFLAGS_X86) $(LFLAGS) $(LIBS) -DSERVER

s86: $(HEADERS) simple_server.c mc.c pack.c queue.c update_ren.c printutils.c csutils.c SFMT.c Makefile
	gcc -o $@ simple_server.c mc.c queue.c csutils.c -m32 $(CFLAGS_X86) $(LFLAGS) $(LIBS) -DSERVER

ppu: $(HEADERS) simple_server.c mc.c pack.c queue.c update_ren.c printutils.c csutils.c SFMT.c Makefile
	ppu-gcc -o $@ simple_server.c mc.c queue.c csutils.c $(CFLAGS_PPU) -DUSE_SPU=0 -DSERVER $(LFLAGS) $(LIBS)

clean:
	rm -f $(TARGETS) $(OBJECTS) spu spu-embed32.o spu.a ppu core.*

copy:
	cp --archive -p --copy-contents --dereference -t /media/disk/fudo/ \
	    $(HEADERS) $(SOURCES) $(OTHERS)

# Followings are for my printers.
pr2: $(SOURCES) $(HEADERS) $(OTHERS)
	pr2 $?
	touch pr2

$(OBJECTS): $(HEADERS) Makefile

.c.o:
	gcc -c $< $(CFLAGS_X86)

.c.s:
	gcc -S $< $(CFLAGS_X86)
#	gcc -S $< $(CFLAGS_X86) -fverbose-asm
