##############################################################################
#                                                                            #
#     Makefile for $CTKROOT/src                                              #
#                                                                            #
#     CTK VERSION 1.3.5  Apr 22, 2007			      	             #
#                                                                            #
##############################################################################

# Before running make, please carefully read and follow the following 6 steps:

## Step 1. Uncomment the line below to select your machine's architecture i.e. either solaris or linux

export _ARCH = linux
#export _ARCH = solaris

## Step 2. Do you wish to compile the MATLAB interface?
##  If 'YES' then  uncomment the following lines two lines
##  and edit the path MATLABROOT if necessary.
#export _HAS_MATLAB = 1
#export MATLABROOT= /usr/local/matlab

## Step 3. Did you have Qt Widgets installed?  
## If 'YES' then uncomment the following two lines and edit the paths if necessary
#export _HAS_QT = 1
#export QTDIR = /usr/lib/qt-3.3

## Step 4. Select your compiler, this may be set to either:
# a) GCC  = GNU project C amd C++ Compilers, gcc and g++, (gcc-2.x)
# b) GCC3  = GNU project C amd C++ Compilers, gcc and g++, (gcc-3.x)
# c) KCC  = KAI C++ compiler

export COMPILER = GCC3

## Step 5. Uncomment the following line to build a non-optimised debug version
#export DEBUG = 1


#############################################################################
#
#  You shouldn't need to touch anything below this line
# 
#############################################################################

## Add in paths for MATLAB, Qt etc

ifdef _HAS_MATLAB
export SYSCONF_IFLAGS_MATLAB =  -I$(MATLABROOT)/extern/include
ifeq ($(_ARCH), solaris)
export SYSCONF_LFLAGS_MATLAB = -L$(MATLABROOT)/extern/lib/sol2  # Uncomment this for Sun/Solaris
endif
ifeq ($(_ARCH), linux)
export SYSCONF_LFLAGS_MATLAB = -L$(MATLABROOT)/extern/lib/glnx86 # Uncomment this for Linux
endif
endif

ifdef _HAS_QT
export SYSCONF_LFLAGS_QT  = -L/usr/local/lib -L/usr/X11R6/lib  # Paths for X11 libs: libX11, libXmu, libXext, etc
export XLIBS = -lX11 -lXmu -lXext -lICE -lSM       # These may or may not all be needed??
endif


## Set the endianness
ifeq ($(_ARCH), solaris)
export ENDIAN_DEF = -DCTK_BIG_ENDIAN    # for little endian processors (e.g. Sun, HP, IBM)
else
export ENDIAN_DEF = -DCTK_LITTLE_ENDIAN        # for big_endian processors (e.g. Intel, Vax)
endif

## Set up compiler specific definitions

# GCC3 - V 3.x
ifeq ($(COMPILER), GCC3)
export SYSCONF_CPP=	g++
export SYSCONF_CC=	gcc

COMPILER_FLAGS_DEBUG=     -DHAVE_CONFIG_H -D_GCC3 -Wall -Wextra  -Wno-deprecated -Wstrict-prototypes  -g -D_DEBUG -fno-operator-names  
COMPILER_FLAGS_OPTIMISE=  -D_GCC3 -Wall -Wextra -O2 -fno-operator-names
COMPILER_FLAGS_CAREFUL_OPTIMISE=  -D_GCC3  -Wall -Wextra -O2 -fno-operator-names  # GCC tends to run out of virtual memory when -O2 is applied to some sources
export AR = ar -r
else

# GCC - V 2.x
ifeq ($(COMPILER), GCC)
export SYSCONF_CPP=	g++
export SYSCONF_CC=	gcc

COMPILER_FLAGS_DEBUG=     -DHAVE_CONFIG_H -D_GCC -Wall -Wextra  -g -D_DEBUG -fno-operator-names  
COMPILER_FLAGS_OPTIMISE=  -D_GCC -Wall  -Wextra  -O2 -fno-operator-names
COMPILER_FLAGS_CAREFUL_OPTIMISE=  -D_GCC  -Wall -Wextra  -fno-operator-names  # GCC tends to run out of virtual memory when -O2 is applied to some sources
export AR = ar -r
else

#KCC
ifeq ($(COMPILER), KCC)
export SYSCONF_CPP=		KCC     
export SYSCONF_CC=		KCC     
COMPILER_FLAGS_DEBUG=    -D_KCC -g -D_DEBUG --one_instantiation_per_object
COMPILER_FLAGS_OPTIMISE=  -D_KCC +K3 -O2 --one_instantiation_per_object
COMPILER_FLAGS_CAREFUL_OPTIMISE=  $(COMPILER_FLAGS_OPTIMISE)   # KCC use the normal optimise flags on all sources
export AR = KCC -o   # !!KCC libraries must be compiled using KCC!!
endif
endif
endif

# Note: COMPILER_FLAGS_CAREFUL_OPTIMISE. These are flags to be used for some sensitive sources that don't like being compiled with full optimisation. ... so far this problem has only shown up with gcc)


############################

CPP=		$(SYSCONF_CPP)

program_OBJS = CTKScript.o

ifdef _HAS_QT
export QTCCFLAGS+=      -D_HAS_QT
export _COMPILE_GUI = 1
export SYSCONF_IFLAGS_QT = -I$(QTDIR)/include
export SYSCONF_LFLAGS_QT  += -L$(QTDIR)/lib
# Solaris seems to need both qt and qui while linux needs only qui
ifeq ($(_ARCH), solaris) 
export SYSCONF_LIBS_QT = -lqt -lqui $(XLIBS)
endif
ifeq ($(_ARCH), linux)
export SYSCONF_LIBS_QT = -lqui $(XLIBS)
endif
endif

ifdef _HAS_MATLAB
export MATLABCCFLAGS= -D_HAS_MATLAB -DV5_COMPAT
export SYSCONF_LIBS_MATLAB = -leng -lmx -lmat -lut
endif



ifdef _COMPILE_GUI
	CTKGUI_TARGET+= ctkGUI
endif


ifndef CTKROOT
export CTKROOT= $(shell cd ..; pwd)
endif

ifndef CTKLOCAL
export CTKLOCAL= $(CTKROOT)/local
endif


ALL=$(program_OBJS) libctk.a bin

export SYSCONF_IFLAGS_CTK =  -I$(CTKROOT)/include/ctk -I$(CTKROOT)/include
export SYSCONF_LFLAGS_CTK = -L$(CTKROOT)/lib
export SYSCONF_LIBS_CTK = -lctk
export SYSCONF_LIBS_CTKGUI = -lctkGUI


#	Options to be passed to your C++ compiler:

ifdef DEBUG
export COMPILER_FLAGS = $(COMPILER_FLAGS_DEBUG) $(ENDIAN_DEF)
export COMPILER_FLAGS_CAREFUL = $(COMPILER_FLAGS_DEBUG) $(ENDIAN_DEF)
else 
export COMPILER_FLAGS = $(COMPILER_FLAGS_OPTIMISE) $(ENDIAN_DEF)
export COMPILER_FLAGS_CAREFUL = $(COMPILER_FLAGS_CAREFUL_OPTIMISE) $(ENDIAN_DEF)
endif

#	Compile flags for the library:
CPPFLAGS= $(SYSCONF_IFLAGS_CTK) $(SYSCONF_IFLAGS_MATLAB) $(SYSCONF_IFLAGS_QT) $(MATLABCCFLAGS) $(QTCCFLAGS) 
export CPPFLAGS

OBJS = $(OBJS_CORE) $(OBJS_BLOCKS) $(OBJS_CONTRIB)

OBJS_CORE = ctk_block.o ctk_CTK_reader.o ctk_CTK_writer.o ctk_command_line.o ctk_data_descriptor.o ctk_decoder.o ctk_dsp.o ctk_error.o ctk_feature_vector.o ctk_file_desc.o ctk_group.o ctk_HMM.o ctk_HMM_builder.o ctk_HMM_edit.o ctk_lattice.o ctk_param.o ctk_parse.o ctk_pipe.o ctk_reco.o ctk_ro_file.o ctk_script.o ctk_shell.o ctk_socket.o

OBJS_BLOCKS = blocks/ctk_binaural.o blocks/ctk_binary_ops.o blocks/ctk_colour_mask.o blocks/ctk_correlator.o blocks/ctk_decimator.o blocks/ctk_differentiator.o blocks/ctk_FFT.o blocks/ctk_file.o blocks/ctk_filter.o blocks/ctk_framer.o blocks/ctk_gammatone_bank.o blocks/ctk_generators.o blocks/ctk_haircell.o blocks/ctk_harmonic_removal.o blocks/ctk_HMM_decoder.o blocks/ctk_HMM_MS_decoder.o blocks/ctk_integrator.o blocks/ctk_localisation.o blocks/ctk_matlab.o blocks/ctk_noise_estimation.o blocks/ctk_process_groups.o blocks/ctk_qfigure.o blocks/ctk_reducer.o blocks/ctk_simple_blocks.o blocks/ctk_unary_ops.o

OBJS_CONTRIB = contrib/ctk_acg_pitch.o contrib/ctk_adaptive_noise_estimation.o contrib/ctk_filter_colour.o contrib/ctk_gmask.o contrib/ctk_tracker.o


all:  $(ALL)

ctkGUI:
	@echo Making GUI
	(cd GUI; $(MAKE) -f Makefile.GUI)

bin:	$(CTKGUI_TARGET)
	@echo Making binaries
	(cd $(CTKLOCAL)/src; $(MAKE) -f Makefile.local all)
#	rm -f $(CTKROOT)/bin/CTK* $(CTKROOT)/bin/ctk
#	ln -s $(CTKLOCAL)/bin/* $(CTKROOT)/bin
	@echo
	@echo All done!! Have a nice day!!
	@echo

clean:
	-rm -f $(OBJS) $(program_OBJS) $(OBJMOC) $(SRCMOC)
	-rm -f *~ contrib/*~ blocks/*~ core
	-rm -f ctk
	-rm -f *.a
	(cd GUI; $(MAKE) -f Makefile.GUI clean)
	(cd $(CTKLOCAL)/src; $(MAKE) -f Makefile.local clean)

new_block:
	-rm ctk_CTK_reader.o GUI/ctk_gui_centralw.o
	gmake all

########################### Conversions ##############################

.SUFFIXES:	.cpp .C .cc .cxx .o .h .hh

libctk.a: 	$(OBJS)
	$(AR) libctk.a $?
	rm -f ../lib/libctk.a
	ln -sf ../src/libctk.a ../lib

# For CTKScript.o
CTK%.o: CTK%.cpp
	$(CPP) $(COMPILER_FLAGS) $(CPPFLAGS) -c $<
	rm -f ../lib/$@
	ln -sf ../src/$@ ../lib

ctk_CTK_reader.o: ctk_CTK_reader.cpp ctk_CTK_reader.hh  sys/ctk_sys_translation_table.cpp
	$(CPP) $(COMPILER_FLAGS_CAREFUL) $(CPPFLAGS) -c -o ctk_CTK_reader.o ctk_CTK_reader.cpp

%.o: %.cpp %.hh
	$(CPP) $(COMPILER_FLAGS) $(CPPFLAGS) -c $< -o $@ 

.PHONY: ctkGUI bin clean all new_block delete_trans_table_objs
