OSL_HOME = ..
-include makefile.local
-include $(OSL_HOME)/makefile.local
-include $(OSL_HOME)/makefile.conf

LOADLIBES += -lcppunit -lboost_thread$(BOOST_POSTFIX_MT) $(LDLIBS)

CXXOPTFLAGS ?= -O -DDEBUG
OTHERFLAGS = -pipe $(DEBUGFLAGS) $(CPUOPTION)
CXXFLAGS = $(CXXOPTFLAGS) $(OTHERFLAGS) \
	$(WARNING_FLAGS) $(GCH_INCLUDES) $(INCLUDES)

PROGRAMS = testBoard testSearch testAll testOpening

ifdef USE_NTESUKI
 TEST_OBJS += $(Q_NTESUKI_OBJS)
 PROGRAMS += testNtesuki
endif

all : 
	$(MAKE) update-lib
	$(MAKE) test-target
test-target: $(PROGRAMS)
update-lib:
	cd $(OSL_HOME)/lib; $(MAKE)

BOARD_OBJS = board.t.o ptype.t.o player.t.o piece.t.o move.t.o direction.t.o \
	centering3x3.t.o centering5x3.t.o ptypeList.t.o \
	pathEncoding.t.o pieceStand.t.o pieceStandIO.t.o repetitionCounter.t.o \
	container/pieceMask.t.o container/bitXmask.t.o \
	container/moveStack.t.o \
	container/moveLogProbVector.t.o container/ptypeOSquareVector.t.o \
	container/boardMask.t.o container/tripleInt.t.o container/quadInt.t.o \
	misc/fixedCapacityVector.t.o misc/carray.t.o misc/carray2d.t.o \
	misc/mask.t.o misc/nonBlockDelete.t.o misc/reorder.t.o \
	misc/math.t.o misc/base64.t.o misc/fastCopier.t.o \
	misc/bitOp.t.o \
	stl/vector.t.o stl/hash_map.t.o stl/hash_set.t.o \
	apply_move/doUndoMoveLock.t.o \
	eval/pieceEval.t.o eval/progressEval.t.o eval/see.t.o \
	eval/minorPieceBonus.t.o \
	eval/ppair/piecePairIndex.t.o eval/ppair/piecePairRawEval.t.o \
	eval/ppair/piecePairPieceEval.t.o \
	eval/endgame/attackKing.t.o eval/endgame/defenseKing.t.o \
	eval/endgame/attackDefense.t.o eval/endgame/kingPieceTable.t.o \
	eval/ml/piecePair.t.o \
	eval/ml/openMidEndingEval.t.o \
	state/simpleState.t.o \
	state/pawnMaskState.t.o \
	state/numEffectState.t.o effect/moveSignature.t.o \
	effect/liberty8.t.o \
	stat/twoDimensionalStatistics.t.o \
	hash/boardKey.t.o hash/hashKey.t.o hash/hashRandom.t.o \
	progress/ptypeProgress.t.o progress/effect5x3.t.o \
	progress/effect5x3d.t.o progress/ml/newProgress.t.o \
	$(patsubst %.o,record/%.o,$(RECORD_OBJS)) \
	$(patsubst %.o,move_generator/%.o,$(MOVE_GENERATOR_OBJS)) \
	$(patsubst %.o,move_classifier/%.o,$(MOVE_CLASSIFIER_OBJS)) \
	$(patsubst %.o,move_order/%.o,$(MOVE_ORDER_OBJS)) \
	$(patsubst %.o,effect_util/%.o,$(EFFECT_UTIL_OBJS)) \
	$(patsubst %.o,threatmate/%.o,$(THREATMATE_OBJS)) \
	$(patsubst %.o,mobility/%.o,$(MOBILITY_OBJS)) \
	enter_king/enterKing.t.o enter_king/simplePredictor.t.o
RECORD_OBJS = csa.t.o record.t.o kisen.t.o psn.t.o kanjiPrint.t.o usi.t.o \
	kanjiMove.t.o ki2.t.o compactBoard.t.o miniBoard.t.o miniBoardChar50.t.o
MOVE_GENERATOR_OBJS = allMoves.t.o capture_.t.o \
  escapeMoves.t.o promote_.t.o kingWalk.t.o dropAroundKing8.t.o \
  openKingRoad.t.o safeDropMajorPiece.t.o \
	addEffect8.t.o attackToPinned.t.o  \
	addEffectWithEffect.t.o legalMoves.t.o

MOVE_CLASSIFIER_OBJS = check_.t.o kingOpenMove.t.o safeMove.t.o \
	pawnDropCheckmate.t.o attackDefenceAroundKing.t.o \
	blockLongEffect.t.o trapRook.t.o 
MOVE_ORDER_OBJS = promotion.t.o cheapPtype.t.o captureSort.t.o \
	captureEstimation.t.o
EFFECT_UTIL_OBJS = pin.t.o additionalEffect.t.o unblockableCheck.t.o \
	effectUtil.t.o sendOffSquare.t.o neighboring8Direct.t.o \
	virtualPin.t.o
MOBILITY_OBJS = countMobility.t.o rookMobility.t.o bishopMobility.t.o \
	lanceMobility.t.o mobilityTable.t.o
THREATMATE_OBJS = kfendPredictor.t.o richPredictor.t.o treePredictor.t.o mlPredictor.t.o
SEARCH_OBJS = problems.o simpleHashRecord.t.o fixedEval.t.o \
	searchRecorder.t.o simpleHashTable.t.o \
	moveGenerator.t.o alphaBeta2.t.o \
	breakThreatmate.t.o hashRejections.t.o \
	moveStackRejections.t.o \
	threatmateState.t.o dualThreatmateState.t.o lRUMoves.t.o \
	quiescenceSearch.t.o quiescenceRecord.t.o quiescenceGenerator.t.o \
	dominanceCheck.t.o \
	bigramKillerMove.t.o  sacrificeCheck.t.o \
	shouldPromoteCut.t.o 
CHECKMATE_OBJS = proofDisproof.t.o \
	proofPieces.t.o \
	pawnCheckmateMoves.t.o king8Info.t.o \
	dfpn.t.o dualDfpn.t.o oracleProver.t.o \
	fixedDepthSearcher.t.o checkmateIfCapture.t.o \
	immediateCheckmate.t.o proofNumberTable.t.o \
	oracleAdjust.t.o 
NTESUKI_OBJS = ntesukiResult.t.o ntesukiRecord.t.o ntesukiTable.t.o rzone.t.o \
	ntesukiMoveGenerator.t.o ntesukiSearcher.t.o ntesukiSimulationSearcher.t.o \
	move_generator/addEffect8Defense.t.o move_generator/captureEffectToAroundKing8.t.o 
GAME_PLAYING_OBJS = recordTracer.t.o bookPlayer.t.o csaClient.t.o \
	gnuShogiClient.t.o historyToTable.t.o searchPlayer.t.o \
	gameState.t.o alphaBetaPlayer.t.o alphaBetaOpenMidEndingEvalPlayer.t.o \
	weightTracer.t.o
RATING_OBJS = standardFeatureSet.t.o ratedMoveVector.t.o feature/patternLong.t.o \
	feature/threatmate.t.o
OPENING_OBJS = openingBook.t.o
MOVE_PROBABILITY_OBJS = feature.t.o featureSet.t.o moveInfo.t.o \
	stateInfo.t.o
MISC_OBJS = 

# qualified objects
Q_SEARCH_OBJS = $(patsubst %.o,search/%.o,$(SEARCH_OBJS)) \
	$(patsubst %.o,checkmate/%.o,$(CHECKMATE_OBJS)) \
	$(patsubst %.o,game_playing/%.o,$(GAME_PLAYING_OBJS)) 
Q_NTESUKI_OBJS = $(patsubst %.o,ntesuki/%.o,$(NTESUKI_OBJS))
Q_RATING_OBJS = $(patsubst %.o,rating/%.o,$(RATING_OBJS)) \
	$(patsubst %.o,move_probability/%.o,$(MOVE_PROBABILITY_OBJS))
Q_OPENING_OBJS = $(patsubst %.o,record/opening/%.o,$(OPENING_OBJS))
TEST_OBJS = $(BOARD_OBJS) $(Q_SEARCH_OBJS) $(Q_OPENING_OBJS) \
 $(MISC_OBJS) $(Q_RATING_OBJS)

OBJS = testAll.o $(TEST_OBJS)
SRCS = $(patsubst %.o,%.cc,$(OBJS))

search/alphaBeta2.t: search/alphaBeta2.t.o testOne.o search/problems.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(CXXFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LDFLAGS) $(LOADLIBES) 
%.t: %.t.o testOne.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(CXXFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LDFLAGS) $(LOADLIBES) 
# make binary forcibly adding -O0 flags so that gdb can well trace the program
%.t.gdb: %.t.cc %.t.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(CXXFLAGS) -o $(OUTPUTPREFIX)$@ -O0 testOne.cc $< $(FILE_OSL_ALL) $(LDFLAGS) $(LOADLIBES) 

-include $(patsubst %.cc,.deps/%.cc.d,$(SRCS))

testAll: $(OBJS) $(FILE_OSL_ALL)
	mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LOADLIBES) 
testLong: testLong.o $(TEST_OBJS) $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LOADLIBES) 

testBoard: $(BOARD_OBJS) testAll.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^  $(LOADLIBES) 
testSearch: $(Q_SEARCH_OBJS) testAll.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LOADLIBES) 
testNtesuki: $(Q_NTESUKI_OBJS) testAll.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LOADLIBES) 
testRating: $(Q_RATING_OBJS) testAll.o $(FILE_OSL_ALL)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^ $(LOADLIBES) 
testOpening: $(Q_OPENING_OBJS) testAll.o $(FILE_OSL_BOARD)
	-@mkdir -p `dirname $(OUTPUTPREFIX)$@` > /dev/null 2>&1
	$(CXX) $(LDFLAGS) -o $(OUTPUTPREFIX)$@ $^  $(LOADLIBES) 

light-clean:
	-rm -rf .deps 
clean: light-clean
	-rm -f core *.o $(OBJS) $(PROGRAMS) nohup.out checkmate.log
distclean: clean 
	rm -f *~
