include tnet.mk

##### Check that CUDA Toolkit directory was set
ifneq ($(HAVE_CUDA), true)
  $(warning %%% WARNING!!!)
  $(warning %%% CUDA not found! Incorrect path in CUDA_TK_BASE: $(CUDA_TK_BASE))
  $(warning %%% Try setting CUDA_TK_BASE in 'trunk/src/tnet.mk')
  $(warning %%% WARNING!!!)
else
  #$(warning %%% INFO: Using CUDA from CUDA_TK_BASE: $(CUDA_TK_BASE))
endif


##### Includes
INCLUDE := -IKaldiLib -ITNetLib -ISTKLib 
INCLUDE += -ICuBaseLib -ICuTNetLib
INCLUDE += -I$(CUDA_TK_BASE)/include

CXXFLAGS += $(INCLUDE)

##### CPU implementation libs
LDFLAGS :=   -LTNetLib -lTNetLib
LDFLAGS +=   -LKaldiLib -lKaldiLib
LDFLAGS +=   -pthread 

##### Link with GotoBLAS
ifeq ($(BITS64), true) 
  LDFLAGS += -LGotoBLASLib -lgoto2_64 -lgfortran
else
  LDFLAGS += -LGotoBLASLib -lgoto2 -lgfortran
endif
LDFLAGS += -Wl,-rpath,$(PWD)/GotoBLASLib

##### CUDA implementation libs
ifeq ($(CUDA), true)
  #TNet libs
  LDFLAGS_CUDA := -LCuTNetLib -lCuTNet
  LDFLAGS_CUDA += -LCuBaseLib -lCuBase
  #CUDA toolkit libs
  ifeq ($(BITS64), true)
    LDFLAGS_CUDA += -L$(CUDA_TK_BASE)/lib64 -Wl,-rpath,$(CUDA_TK_BASE)/lib64
  else
    LDFLAGS_CUDA += -L$(CUDA_TK_BASE)/lib -Wl,-rpath,$(CUDA_TK_BASE)/lib
  endif
  LDFLAGS_CUDA += -lcublas -lcudart -lcuda 
endif


##############################################################
# Target programs 
##############################################################

#CPU tools
BINS := TNet TNorm TFeaCat TSegmenter TJoiner
all : $(BINS) 
$(BINS): lib

#GPU tools
CUBINS := TNetCu TNormCu TFeaCatCu TRbmCu TRecurrentCu
ifeq ($(STK), true)
  CUBINS += TMpeCu TMmiCu
endif
ifeq ($(CUDA), true)
cubins : $(CUBINS)
##HINT: Link CUDA libs only with CUDA tools!!!##
##(recursive target-specific variable value)##
cubins : LDFLAGS += $(LDFLAGS_CUDA)
##
all : cubins
$(CUBINS): lib culib
endif


##############################################################
# program compliling implicit rule
##############################################################
% : %.o
	$(CXX)  -o $@  $< $(CXXFLAGS) $(INCLUDE) $(LDFLAGS)

 
##############################################################
# module compliling implicit rule
##############################################################
%.o : %.cc lib
	$(CXX)  -o $@  -c $< $(CFLAGS) $(CXXFLAGS) $(INCLUDE)


##############################################################
# STK specific rules
##############################################################
#TMpeCu depends on STK
TMpeCu.o: stklib
TMpeCu: LDFLAGS := -LSTKLib -lSTKLib $(LDFLAGS) $(LDFLAGS_CUDA)
#TMmiCu depends on STK
TMmiCu.o: stklib
TMmiCu: LDFLAGS := -LSTKLib -lSTKLib $(LDFLAGS) $(LDFLAGS_CUDA)


##############################################################
# Source files for CPU/GPU tools
##############################################################
CC_BINS=$(addsuffix .cc, $(BINS))
CC_CUBINS=$(addsuffix .cc, $(CUBINS))

O_BINS=$(addsuffix .o, $(BINS))
O_CUBINS=$(addsuffix .o, $(CUBINS))

$(O_BINS) : $(CC_BINS) 
$(O_CUBINS) : $(CC_CUBINS) 

$(BINS) : $(O_BINS)
$(CUBINS) : $(O_CUBINS)

##############################################################
.PHONY: lib culib stklib clean doc depend

lib:
	@cd KaldiLib && make $(FWDPARAM)
	@cd TNetLib && make $(FWDPARAM)

culib: 
	@cd CuBaseLib && make $(FWDPARAM)
	@cd CuTNetLib && make $(FWDPARAM)
	
stklib:
	@cd STKLib && make $(FWDPARAM)

clean:
	rm -f *.o $(BINS) $(CUBINS)
	@cd STKLib && make clean
	@cd KaldiLib && make clean
	@cd TNetLib && make clean
	@cd CuBaseLib && make clean
	@cd CuTNetLib && make clean

doc:
	doxygen ../doc/doxyfile_TNet

depend: 
	$(CXX) -M $(CXXFLAGS) $(CC_BINS) $(INCLUDE) > .depend.mk1
	@cd KaldiLib && make depend
	@cd TNetLib && make depend
	touch .depend.mk{1,2}
	cat .depend.mk{1,2} > .depend.mk
	rm .depend.mk{1,2}

cudepend:
	$(CXX) -M $(CXXFLAGS) $(CC_CUBINS) $(INCLUDE) > .depend.mk2
	@cd CuBaseLib && make depend
	@cd CuTNetLib && make depend
ifeq ($(HAVE_CUDA), true)
depend: cudepend
endif
ifeq ($(STK), true)
cudepend: stklib
endif


-include .depend.mk