# MinaseShogiSystemためのMakefile (for GNU make)

ifeq ($(OS),Windows_NT)
CC = mingw
DEL = del
endif
ifeq ($(CC),cc)
CC = gcc
DEL = rm -f
endif

ifeq ($(CC),icc)
# for ICC for Linux
CFLAGS = -Wall -O3 -ipo -no-prec-div -unroll -fno-alias -DNDEBUG
LFLAGS = -ipo -lpthread

# for core i3/5/7
TARGET_ARCH = -axCORE-AVX-I -march=corei7-avx
# for Pentium4
#TARGET_ARCH = -xSSE2 -I/usr/include/i386-linux-gnu
# for Phenom2
#TARGET_ARCH = -axSSE4.1
# amd64
#TARGET_ARCH = -axSSSE3
endif

ifeq ($(CC),mingw)
ifeq ($(BIT),32)
  # for MingWin32 (sjis)
  PATH = c:\MinGW\bin
  CC = mingw32-gcc
#  CC = c:\TDM-GCC-64\bin\gcc
else
  # for MingWin64 (sjis)
# PATH = c:\TDM-GCC-64\bin
  PATH = C:\Program Files\mingw-w64\x86_64-6.2.0-win32-seh-rt_v5-rev1\mingw64\bin
  CC = x86_64-w64-mingw32-gcc
endif

CFLAGS = --input-charset=cp932 --exec-charset=cp932 -ffast-math -Wall -Wno-unused-result
LFLAGS =

# for release
CFLAGS += -DNDEBUG -O3 -fno-exceptions -fomit-frame-pointer -fstrict-aliasing
LFLAGS += -O3

# for board_test
#CFLAGS += -DNDEBUG -DBOARD_TEST -O3 -fno-exceptions -fomit-frame-pointer -fstrict-aliasing

# for code analyze
#CFLAGS += -DNDEBUG -O1 -fno-exceptions -fstrict-aliasing -g

# for profile
#CFLAGS += -DNDEBUG -O3 -fno-exceptions -fstrict-aliasing
#PROFILE = -pg

# for debug
#CFLAGS += -DDEBUG -O1 -Og -fno-exceptions -fomit-frame-pointer -fstrict-aliasing -g

# for core avx2
#TARGET_ARCH = -march=core-avx2
# for core i3/5/7
TARGET_ARCH = -march=corei7-avx
# for core i3/5/7 (for XP 32bit)
#TARGET_ARCH = -march=corei7
# for core2
#TARGET_ARCH = -march=core2
# for Pentium4 (prescott)
#TARGET_ARCH = -march=prescott
# for Pentium4
#TARGET_ARCH = -march=pentium4
# for Phenom2
#TARGET_ARCH = -march=amdfam10

ifeq ($(BIT),32)
TARGET_ARCH += -m32
else
TARGET_ARCH += -m64
endif
endif

ifeq ($(CC),gcc)
# for GCC x32/x64 (Linux)
CFLAGS = -Wall -Wno-unused-result
# with debug
#CFLAGS += -O0 -g
# with no debug
CFLAGS += -DNDEBUG -O3 -fno-exceptions -fomit-frame-pointer -fstrict-aliasing
LFLAGS += -O3 -Wl,--no-as-needed -lpthread -lm

# for native
#TARGET_ARCH = -march=native
# for core i3/5/7
#TARGET_ARCH = -march=corei7-avx
#TARGET_ARCH = -march=corei7
# for core2
#TARGET_ARCH = -march=core2
# for Pentium4 (64bit)
#TARGET_ARCH = -march=nocona
# for Pentium4 (32bit)
#TARGET_ARCH = -march=pentium4
# for Phenom2
TARGET_ARCH = -march=amdfam10
endif

ifeq ($(CC),opencc)
# for Open64
CFLAGS = -Ofast -ipa -Wall -DNDEBUG
LFLAGS += -ipa -lpthread

# for auto
#TARGET_ARCH = -mtune=auto
# for Phenom2
TARGET_ARCH = -mtune=barcelona -I/usr/include/x86_64-linux-gnu
endif

ifeq ($(CC),clang)
# for CLANG (x32/x64 (Linux)
CFLAGS = -Wall -Ic:\mingw\include
# with debug
#CFLAGS += -O0 -g
# with no debug
CFLAGS += -DNDEBUG -O3
LFLAGS += -lpthread -lm

# for core i3/5/7
TARGET_ARCH = -m64 -mavx
# for Pentium4
#TARGET_ARCH = -m32 -msse2
# for Phenom2
#TARGET_ARCH = -m64 -msse2
endif

ifeq ($(OS),Windows_NT)
OBJDIR =  objs
else
OBJDIR =  ./objs
endif

COMMON_OBJS =\
$(OBJDIR)/mss.o\
$(OBJDIR)/attack.o\
$(OBJDIR)/bit_function.o\
$(OBJDIR)/check.o\
$(OBJDIR)/helper.o\
$(OBJDIR)/hash.o\
$(OBJDIR)/make_drop.o\
$(OBJDIR)/make_move.o\
$(OBJDIR)/make_evasion.o\
$(OBJDIR)/make_capture.o\
$(OBJDIR)/mate_1ply.o\
$(OBJDIR)/ordering.o\
$(OBJDIR)/quiescence.o\
$(OBJDIR)/see.o

LEARN1_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute_nohash.o\
$(OBJDIR)/bod.o\
$(OBJDIR)/csa2move.o\
$(OBJDIR)/feature.o\
$(OBJDIR)/weight_p.o\
$(OBJDIR)/learn1.o

LEARN4_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute_nohash.o\
$(OBJDIR)/bod.o\
$(OBJDIR)/csa2move.o\
$(OBJDIR)/feature.o\
$(OBJDIR)/weight_p.o\
$(OBJDIR)/learn4.o

MATERIAL_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/csa2move.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/material.o

NEXT_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/bod.o\
$(OBJDIR)/clock.o\
$(OBJDIR)/root_search.o\
$(OBJDIR)/search.o\
$(OBJDIR)/next.o

NEXT_USI_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/clock.o\
$(OBJDIR)/root_search.o\
$(OBJDIR)/search.o\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/usi_sub.o\
$(OBJDIR)/next_usi.o

TEST_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/bod.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/test.o

SEE_TEST_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/bod.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/see_test.o

MOVE_TEST_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/bod.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/move_test.o

N_MOVES_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/bod.o\
$(OBJDIR)/csa2move.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/n_moves.o

MSS_USI_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/clock.o\
$(OBJDIR)/root_search.o\
$(OBJDIR)/search.o\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/usi.o\
$(OBJDIR)/usi_sub.o

MSS_XSHOGI_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/evalute.o\
$(OBJDIR)/xshogi.o

BOOK_ADD_OBJS =\
$(COMMON_OBJS)\
$(OBJDIR)/book_probe.o\
$(OBJDIR)/book_add.o\
$(OBJDIR)/csa2move.o\
$(OBJDIR)/evalute.o

$(OBJDIR)/learn1.o: learn.h

$(OBJDIR)/learn4.o: learn.h

$(OBJDIR)/feature.o: feature.h

$(OBJDIR)/weight.o: feature.h

$(OBJDIR)/evalute_nohash.o: evalute.c
	$(CC) $(TARGET_ARCH) $(CFLAGS) $(PROFILE) -DNO_EVAL_HASH -c -o $@ evalute.c

$(OBJDIR)/weight_p.o: weight.c feature.h mutex.h
	$(CC) $(TARGET_ARCH) $(CFLAGS) $(PROFILE) -DPARALLEL -c -o $@ weight.c

$(OBJDIR)/%.o:%.c mss.h defines.h bit_function.h
ifeq ($(OS),Windows_NT)
	@if not exist $(OBJDIR)/$(NULL) mkdir $(OBJDIR)
else
	@if [ ! -d $(OBJDIR) ]; then mkdir $(OBJDIR); fi
endif
	$(CC) $(TARGET_ARCH) $(CFLAGS) $(PROFILE) -c -o $@ $<

mss_usi: $(MSS_USI_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

mss_xshogi: $(MSS_XSHOGI_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

learn4: $(LEARN4_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

learn1: $(LEARN1_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

material: $(MATERIAL_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

next: $(NEXT_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

next_usi: $(NEXT_USI_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

test: $(TEST_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

see_test: $(SEE_TEST_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

move_test: $(MOVE_TEST_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

n_moves: $(N_MOVES_OBJS)
	$(CC) $(TARGET_ARCH) $(PROFILE) $(LFLAGS) -o $@ $^

wdump: wdump.c feature.h
	$(CC) $(TARGET_ARCH) $(CFLAGS) -o $@ wdump.c

winit: winit.c feature.h
	$(CC) $(TARGET_ARCH) $(CFLAGS) -o $@ $@

key_gen: key_gen.c mt19937-64.c
	$(CC) $(TARGET_ARCH) $(CFLAGS) -o $@ $^

book_add: $(BOOK_ADD_OBJS)
	$(CC) $(TARGET_ARCH) $(CFLAGS) -o $@ $^

.PHONY : clean
clean:
ifeq ($(OS),Windows_NT)
	$(DEL) objs\*.o
else
	nkf --overwrite -w -Lu *.c *.h
	$(DEL) objs/*.o
endif

# アセンブラソース作成
%.s: %.c
	$(CC) $(CFLAGS) $(TARGET_ARCH) -masm=intel -S $^
#	$(CC) $(CFLAGS) $(TARGET_ARCH) -g $(LFLAGS) -c $^
#	objdump -S -M intel $*.o > $*.s
#	$(DEL) $*.o
