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

# type (cd osl/release; make) to build optimized library
ifdef RELEASE
else
DEBUG=t
endif

ifdef DEBUG
CXXOPTFLAGS ?= -O -DDEBUG
else
CXXOPTFLAGS = $(RELEASE_CXX_OPTFLAGS) -DNDEBUG
endif

WARNING_FLAGS += -Werror
ifneq ($(CXX),icc)
## gcc
ifdef RELEASE
WARNING_FLAGS += $(WARN_INLINE)
ifndef PROFILE
CXXOPTFLAGS += -fomit-frame-pointer
endif
else
OTHERFLAGS = $(DEBUGFLAGS)
WARNING_FLAGS += -Wunused-parameter
endif
endif
OTHERFLAGS += -pipe $(CPUOPTION)

OSL_HOME_FLAGS = -DOSL_HOME=\"$(shell dirname `pwd`)\"
CXXFLAGS += $(OSL_HOME_FLAGS) $(CXXOPTFLAGS) $(OTHERFLAGS) \
	$(WARNING_FLAGS) $(PROF) $(GCH_INCLUDES) $(INCLUDES)

# all : update-headers clean-objects
all : update-headers 
	$(MAKE) $(LIBOSL_BOARD)
	$(MAKE) $(LIBOSL_SEARCH)

OBJS = 	$(LIB_BOARD_OBJS) $(LIB_SEARCH_OBJS)
LIB_BOARD_OBJS = \
	$(patsubst %.o,move_generator/%.o,$(MOVE_GENERATOR_OBJS)) \
	$(patsubst %.o,move_classifier/%.o,$(MOVE_CLASSIFIER_OBJS)) \
	$(patsubst %.o,record/%.o,$(RECORD_OBJS)) \
	$(patsubst %.o,stat/%.o,$(STAT_OBJS)) \
	$(patsubst %.o,effect_util/%.o,$(EFFECT_UTIL_OBJS)) \
	$(patsubst %.o,threatmate/%.o,$(THREATMATE_OBJS))  \
	$(EXCEPTIONAL_SEARCH_OBJS) \
	$(BASIC_OBJS)
LIB_SEARCH_OBJS = \
	$(patsubst %.o,rating/%.o,$(RATING_OBJS)) \
	$(patsubst %.o,move_probability/%.o,$(MOVE_PROBABILITY_OBJS)) \
	$(patsubst %.o,search/%.o,$(SEARCH_OBJS)) \
	$(patsubst %.o,checkmate/%.o,$(CHECKMATE_OBJS)) \
	$(patsubst %.o,game_playing/%.o,$(GAME_PLAYING_OBJS)) \
	$(patsubst %.o,annotate/%.o,$(ANNOTATE_OBJS)) \
	c/facade.o

ifdef USE_NTESUKI
 LIB_SEARCH_OBJS += $(patsubst %.o,ntesuki/%.o,$(NTESUKI_OBJS)) 
endif

BASIC_OBJS = stl/pool_allocator.o \
	hash/boardKey.o hash/hashKey.o hash/hashKeyStack.o \
	hash/hashRandom.o hash/hashRandomPair.o hash/boardKey128.o \
	effect/numBitmapEffect.o effect/boardBitMask.o \
	effect/liberty8.o effect/liberty8Table.o effect/moveSignature.o \
	effect/numSimpleEffect.o \
	effect/effectedNumTable.o \
	effect/signatureEffect.o \
	mobility/mobilityTable.o \
	container/bitXmask.o container/pieceMask.o container/moveStack.o \
	container/moveVector.o container/moveLogProbVector.o \
	container/pieceVector.o container/ptypeOSquareVector.o \
	container/nearMask.o container/pieceValues.o container/square8.o \
	container/boardMask.o container/tripleInt.o \
	eval/pieceEval.o eval/progressEval.o eval/see.o \
	eval/endgame/attackKing.o eval/endgame/defenseKing.o \
	eval/endgame/kingPieceTable.o eval/endgame/attackDefense.o \
	eval/ppair/piecePairRawTable.o eval/ppair/piecePairPieceTable.o \
	eval/ppair/piecePairEvalBase.o \
	eval/ml/weights.o \
	eval/ml/piecePair.o eval/ml/piecePairKing.o \
	eval/ml/openMidEndingEval.o eval/ml/pieceEval.o \
	eval/ml/pin.o eval/ml/pieceStand.o \
	eval/ml/mobility.o eval/ml/kingTable.o \
	eval/ml/king8.o eval/ml/minorPiece.o \
	eval/ml/majorPiece.o eval/ml/progress.o \
	state/numEffectState.o state/simpleState.o \
	state/historyState.o \
	progress/ptypeProgress.o progress/effect5x3.o \
	progress/effect5x3d.o progress/effect5x3Table.o \
	progress/ml/newProgress.o \
	ptypeList.o ptype.o square.o player.o piece.o \
	offset.o offset32.o pieceTable.o boardTable.o ptypeTable.o \
	move.o direction.o  squareCompressor.o sennichite.o \
	centering3x3.o centering5x3.o \
	moveLogProb.o pieceStand.o pieceStandIO.o pathEncoding.o \
	tables.o repetitionCounter.o oslConfig.o \
	misc/mask.o misc/trace.o misc/milliSeconds.o misc/random.o misc/perfmon.o \
	misc/nonBlockDelete.o misc/align16New.o \
	misc/ncores.o misc/base64.o misc/ctime.o \
	misc/log/htmlPerformanceLog.o misc/log/textPerformanceLog.o \
	misc/sjis2euc.o misc/iconvConvert.o misc/binaryIO.o \
	misc/characterEncodingConvertWin32.o misc/filePath.o misc/eucToLang.o \
	enter_king/enterKing.o enter_king/enterKingUtil.o enter_king/simplePredictor.o
# LIB_SEARCH_OBJS の方が相応しいがtables.ccの関係で LIB_BOARD_OBJS に
# 入れる必要があるもの
EXCEPTIONAL_SEARCH_OBJS = \
	checkmate/immediateCheckmateTable.o checkmate/proofNumberTable.o  \
	checkmate/king8Info.o

MOVE_GENERATOR_OBJS = open.o drop.o allMoves.o escape_.o \
	pieceOnBoard.o capture_.o promote_.o legalMoves.o \
	addEffect8.o addEffect8Table.o attackToPinned.o additionalLance.o \
	addEffectWithEffect.o 
MOVE_CLASSIFIER_OBJS = check_.o safeMove.o kingOpenMove.o \
	blockLongEffect.o trapRook.o canAttackInNMoves.o classifier.o
MOVE_PROBABILITY_OBJS = stateInfo.o feature.o featureSet.o moveInfo.o
RECORD_OBJS = record.o csa.o csaString.o kisen.o \
	opening/openingBook.o opening/bookInMemory.o psn.o \
	csaRecord.o compactBoard.o miniBoard.o kanjiPrint.o usi.o kanjiMove.o \
	ki2.o checkDuplicate.o kakinoki.o miniBoardChar50.o myshogi.o
SEARCH_OBJS = killerMoveTable.o bigramKillerMove.o quiescenceSearch2.o \
	searchRecorder.o sortCaptureMoves.o \
	simpleHashTable.o quiescenceGenerator.o timeControl.o \
	threatmateState.o dualThreatmateState.o \
	searchState2.o searchTimer.o historyTable.o \
	breakThreatmate.o usiReporter.o searchMonitor.o \
	simpleHashRecord.o quiescenceRecord.o \
	alphaBeta2.o alphaBeta2Parallel.o moveGenerator.o \
	alphaBeta3.o hashRejections.o moveWithComment.o \
	moveScore.o alphaBeta4.o \
	moveStackRejections.o \
	analyzer/recordSet_.o analyzer/categoryMoveVector.o \
	quiescenceLog.o \
	analyzer/dotWriter.o analyzer/logWriter.o 
CHECKMATE_OBJS = pieceCost.o proofTreeDepthDfpn.o \
	fixedDepthSearcher.o \
	fixedDepthSearcher2.o\
	proofDisproof.o \
	limitToCheckCount.o dfpn.o dualDfpn.o dfpnParallel.o \
	checkmateIfCapture.o immediateCheckmate.o 
NTESUKI_OBJS = ntesukiRecord.o ntesukiTable.o ntesukiMove.o ntesukiMoveList.o ntesukiMoveGenerator.o \
	ntesukiSearcher.o ntesukiSimulationSearcher.o oracleProverLight.o \
	ntesukiMoveGenerator.o
RATING_OBJS = feature.o group.o featureSet.o \
	ratedMove.o ratedMoveVector.o ratingEnv.o \
	feature/pattern.o feature/capture.o feature/checkmate.o feature/square.o \
	feature/countEffect2.o feature/bigramAttack.o feature/king8.o \
	group/bigramGroup.o group/captureGroup.o group/squareGroup.o \
	group/patternGroup.o group/escape.o group/king8Group.o bradleyTerry.o 
STAT_OBJS = twoDimensionalStatistics.o histogram.o ratio.o 
EFFECT_UTIL_OBJS = additionalEffect.o effectUtil.o shadowEffect.o \
	neighboring8Direct.o neighboring25Direct.o sendOffSquare.o \
	neighboring8Effect.o pin.o virtualPin.o
GAME_PLAYING_OBJS = gameState.o computerPlayer.o csaLogger.o \
	gameManager.o gnuShogiClient.o csaClient.o cuiClient.o \
	openingBookTracer.o winCountTracer.o recordTracer.o \
	alphaBetaPlayer.o bookPlayer.o timeKeeper.o \
	csaTime.o weightTracer.o historyToTable.o searchPlayer.o \
	speculativeSearchPlayer.o speculativeModel.o \
	speculativeAllMoves.o \
	usiState.o usiResponse.o
ANNOTATE_OBJS = analyzer.o facade.o analysesResult.o
THREATMATE_OBJS = kfendPredictor.o richPredictor.o treePredictor.o mlPredictor.o 

SRCS = $(patsubst %.o,%.cc,$(OBJS))
DEPS = $(patsubst %.cc,.deps/%.cc.d,$(SRCS))

ifeq ($(USE_GCH),yes)
HEADER_DEPS = $(patsubst %,.deps/%.d,$(HEADERS))
endif

-include $(DEPS) $(HEADER_DEPS)

libosl_board.a : $(LIB_BOARD_OBJS)
libosl_search.a : $(LIB_SEARCH_OBJS)
libosl_%.a:
	-mkdir .objs
	(cd .objs; for o in $^; do \
	  target=`echo $$o|sed -e 's/\//-/g'`; \
	  if [ ! -f $$target ]; then \
	    ln -s ../$$o $$target; \
	  fi; \
	done)
	$(ARC) $@ $(patsubst %,.objs/%,$(subst /,-,$^))
	-$(RANLIB) $@

### 今まであったファイルが消えた時に必要 (ファイル名の変更など)
light-clean:
	-rm -rf .deps .objs .gch 
	-rm -f *.a
### バイナリ互換性がなくなった時に必要 (gcc のバージョンアップなど)
clean: light-clean
	-rm $(OBJS)
distclean: clean 
	rm -f *~

ifeq ($(USE_GCH),yes)
update-headers: $(patsubst %,.gch/%.gch,$(HEADERS))
else
update-headers: 
endif

clean-objects:
	if [ -f oslConfig.o ]; then rm oslConfig.o; fi
