
# Makefile for utils.a library,


# make configuration:
include ../Make_config.mk
include ../Make_server_config.mk

export

# other local definitions:
#CFLAGS  += -Werror-implicit-function-declaration

ARFLAGS = cr


VPATH   = ../db_ ../dbx_ \
          AllocOps DofOps SetLogicMatrixOps setLogicMatrixOps \
          MatlabLayer MatrixUtils Numerics Sparse SortAndSearch \
          Marshalling Time StdMemOut ElementUtils clientserver Signals\
		  Io


HEADERS = imos.h \
          imdbx.h 

ifeq ($(cluster),0)
OBJECTS=  ConnectionParameters.$(OBJ_EXT)\
          CCSSparseMatrixAsMatlabSparse.$(OBJ_EXT)\
          DataSetRefAddToGarbageCollector.$(OBJ_EXT)\
          DataSetRefDeleteFromGarbageCollector.$(OBJ_EXT)\
		  GetAnalysisTypeAsEnum.$(OBJ_EXT) \
          ExistAndValidType.$(OBJ_EXT)\
          mexFlush.$(OBJ_EXT)\
		  CheckNumMatlabArguments.$(OBJ_EXT)
endif

OBJECTS += alloc.$(OBJ_EXT) \
		  mxGetAssignedField.$(OBJ_EXT)\
          MemoryManager.$(OBJ_EXT)\
		  clientserver.$(OBJ_EXT)\
		  cross.$(OBJ_EXT)\
		  norm.$(OBJ_EXT)\
		  ClientServerBoot.$(OBJ_EXT)\
		  CsrSparseMatrix.$(OBJ_EXT)\
          BinarySearch.$(OBJ_EXT) \
          GetAnalysisTypeAsEnumFromString.$(OBJ_EXT) \
		  GetDOFCount.$(OBJ_EXT) \
          GetVectorbOrthogonalToVectora.$(OBJ_EXT) \
          InitDofTree.$(OBJ_EXT) \
          InsertionSort.$(OBJ_EXT) \
          MarshallingUtils.$(OBJ_EXT)\
          Merge.$(OBJ_EXT) \
          nsscanf.$(OBJ_EXT) \
          ParseSetListIntoSetLogicMatrix.$(OBJ_EXT) \
          Partn.$(OBJ_EXT) \
          effective_value.$(OBJ_EXT) \
          Paterson.$(OBJ_EXT) \
		  PrintfMacroExpand.$(OBJ_EXT)\
          Quicksort.$(OBJ_EXT) \
          QuicksortDoubleByInteger.$(OBJ_EXT) \
          QuicksortIntegerByDouble.$(OBJ_EXT) \
          QuicksortIntegerByInteger.$(OBJ_EXT) \
          QuicksortTwoIntegersByInteger.$(OBJ_EXT) \
          SetLogicMatrix.$(OBJ_EXT) \
          SetUsetBitFromChar.$(OBJ_EXT) \
          SparseMatrix.$(OBJ_EXT) \
          SparseMatrixColumn.$(OBJ_EXT) \
          SparseUtils.$(OBJ_EXT) \
		  StdMemOutAdd.$(OBJ_EXT)\
		  StdMemOutIsOpen.$(OBJ_EXT)\
		  StdMemOutOpen.$(OBJ_EXT)\
		  StdMemOutClose.$(OBJ_EXT)\
          TokenstringIter.$(OBJ_EXT) \
          UnsymmCrout.$(OBJ_EXT) \
          ValidateDofSelections.$(OBJ_EXT)\
		  WriteDataToDisk.$(OBJ_EXT)\
          waitn.$(OBJ_EXT)\
          waitms.$(OBJ_EXT)\
		  Catch_Sigchld.$(OBJ_EXT)\
		  Catch_Sigurg.$(OBJ_EXT)\
		  Catch_Sigint.$(OBJ_EXT)\
		  Catch_Sigio.$(OBJ_EXT)     \
		  posix_signal.$(OBJ_EXT)
	
ifeq ($(cluster),1)
OBJECTS+=   mxGetField.$(OBJ_EXT)\
            mexGetArrayPtr.$(OBJ_EXT)\
            Catch_Sigusr2.$(OBJ_EXT)\
			EmptyErrorString.$(OBJ_EXT)            \
			GetOwnershipBoundariesFromRange.$(OBJ_EXT)\
			IsWorkspaceSynchronized.$(OBJ_EXT)     \
			Mergesolvec.$(OBJ_EXT)\
			Profiler.$(OBJ_EXT)                    \
			Reducematrix.$(OBJ_EXT)         \
			Reducevectorg.$(OBJ_EXT)         \
			Reducematrixfromgtof.$(OBJ_EXT) \
			Reducerightside.$(OBJ_EXT)\
			SerialToVec.$(OBJ_EXT)                 \
			SerialToVecNoBcast.$(OBJ_EXT)                 \
			SetErrMsg.$(OBJ_EXT)                   \
			SharedStack.$(OBJ_EXT)                 \
			VectorPartition.$(OBJ_EXT)	               \
			Wtime.$(OBJ_EXT)                       \
			MPIDebug.$(OBJ_EXT)
endif

# additional Windows build objects:

ifeq (win,$(findstring win,$(platform)))
OBJECTS += strcasecmp.$(OBJ_EXT)
endif


ifeq (no,$(supported))
ERR = unsupported combination of VER, PLATFORM, COMPILER
all: print_build_info err
else
ifeq ($(cluster),0)
all : print_build_info utils.$(LIB_EXT) 
else
all : print_build_info utils.$(LIB_EXT) 
endif
endif

utils.$(LIB_EXT) : $(OBJECTS) 
ifeq (win,$(findstring win,$(platform)))
	echo $(OBJECTS) > utils.rsp
	../rsp_formatter.pl utils.rsp
	tlib /C utils @utils.rsp
	rm utils.rsp
else
	$(AR) $(ARFLAGS) utils.$(LIB_EXT) $(OBJECTS)
	ranlib utils.$(LIB_EXT)
endif


# Dynamic allocation:
alloc.$(OBJ_EXT) : alloc.c alloc.h $(HEADERS)
MemoryManager.$(OBJ_EXT) : MemoryManager.c MemoryManager.h $(HEADERS)

# MatlabLayer:
ExistAndValidType.$(OBJ_EXT)                    : ExistAndValidType.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
DataSetRefAddToGarbageCollector.$(OBJ_EXT)      : DataSetRefAddToGarbageCollector.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
DataSetRefDeleteFromGarbageCollector.$(OBJ_EXT) : DataSetRefDeleteFromGarbageCollector.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
mexFlush.$(OBJ_EXT)                             : mexFlush.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
CCSSparseMatrixAsMatlabSparse.$(OBJ_EXT)        : CCSSparseMatrixAsMatlabSparse.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
ConnectionParameters.$(OBJ_EXT) : ConnectionParameters.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
CheckNumMatlabArguments.$(OBJ_EXT) : CheckNumMatlabArguments.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
GetAnalysisTypeAsEnum.$(OBJ_EXT)                : GetAnalysisTypeAsEnum.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<




# DofOps:
GetDOFCount.$(OBJ_EXT) : GetDOFCount.c $(HEADERS)
InitDofTree.$(OBJ_EXT) : InitDofTree.c $(HEADERS)
SetUsetBitFromChar.$(OBJ_EXT)   : SetUsetBitFromChar.c $(HEADERS)
ValidateDofSeletions.$(OBJ_EXT) : ValidateDofSelections.c $(HEADERS)

# Element utilities
Paterson.$(OBJ_EXT) : Paterson.c $(HEADERS)
effective_value.$(OBJ_EXT) : effective_value.c $(HEADERS)

# Matrix Utilities:
#RowToColumnOrder.$(OBJ_EXT) : RowToColumnOrder.c $(HEADERS)
Merge.$(OBJ_EXT) : Merge.c $(HEADERS)
Partn.$(OBJ_EXT) : Partn.c $(HEADERS)

# Sparse:
SparseMatrix.$(OBJ_EXT)       : SparseMatrix.c       Sparse.h $(HEADERS)
SparseMatrixColumn.$(OBJ_EXT) : SparseMatrixColumn.c Sparse.h $(HEADERS)
SparseUtils.$(OBJ_EXT)        : SparseUtils.c        Sparse.h $(HEADERS)
CsrSparseMatrix.$(OBJ_EXT)    : CsrSparseMatrix.c    CsrSparseMatrix.h $(HEADERS)

# SetLogicMatrixOps:
ParseSetListIntoSetLogicMatrix.$(OBJ_EXT) : ParseSetListIntoSetLogicMatrix.c SetLogicMatrix.h $(HEADERS)
SetLogicMatrix.$(OBJ_EXT)  : SetLogicMatrix.c SetLogicMatrix.h $(HEADERS)
TokenstringIter.$(OBJ_EXT) : TokenstringIter.c SetLogicMatrix.h $(HEADERS)

# string handling:
nsscanf.$(OBJ_EXT) : nsscanf.c $(HEADERS)
strcasecmp.$(OBJ_EXT) : strcasecmp.c $(HEADERS)

#ReallocateArray.$(OBJ_EXT) : ReallocateArray.c $(HEADERS)

# Numerics:
GetVectorbOrthogonalToVectora.$(OBJ_EXT) : GetVectorbOrthogonalToVectora.c $(HEADERS)
UnsymmCrout.$(OBJ_EXT)     : UnsymmCrout.c   UnsymmCrout.h $(HEADERS)
norm.$(OBJ_EXT)     : norm.c   $(HEADERS)

# SortAndSearch:
# (note: on linux, override implicit rules to include conformance to the c99 standard
# to allow log2() function usage in Quicksort routines)
BinarySearch.$(OBJ_EXT)              : BinarySearch.c              $(HEADERS)
InsertionSort.$(OBJ_EXT)             : InsertionSort.c             $(HEADERS)


ifeq ($(cluster),0)
Quicksort.$(OBJ_EXT)                 : Quicksort.c                 $(HEADERS)
QuicksortDoubleByInteger.$(OBJ_EXT)  : QuicksortDoubleByInteger.c  $(HEADERS)
QuicksortIntegerByDouble.$(OBJ_EXT)  : QuicksortIntegerByDouble.c  $(HEADERS)
else

Quicksort.$(OBJ_EXT)                 : Quicksort.c                 $(HEADERS)
ifeq (lin,$(findstring lin,$(platform)))
	$(CC) -c -std=c99 $(CFLAGS) $< -o Quicksort.$(OBJ_EXT)
endif
QuicksortDoubleByInteger.$(OBJ_EXT)  : QuicksortDoubleByInteger.c  $(HEADERS)
ifeq (lin,$(findstring lin,$(platform)))
	$(CC) -c -std=c99 $(CFLAGS) $< -o QuicksortDoubleByInteger.$(OBJ_EXT)
endif
QuicksortIntegerByDouble.$(OBJ_EXT)  : QuicksortIntegerByDouble.c  $(HEADERS)
ifeq (lin,$(findstring lin,$(platform))) 
	$(CC) -c -std=c99 $(CFLAGS) $< -o QuicksortIntegerByDouble.$(OBJ_EXT)
endif

endif

# Marshalling 
MarshallingUtils.$(OBJ_EXT): MarshallingUtils.c 

# Time
waitn.$(OBJ_EXT): waitn.c 
waitms.$(OBJ_EXT): waitms.c 

# STDMEMOUT
StdMemOutAdd.$(OBJ_EXT): StdMemOutAdd.c 
StdMemOutIsOpen.$(OBJ_EXT): StdMemOutIsOpen.c 
StdMemOutOpen.$(OBJ_EXT): StdMemOutOpen.c 
StdMemOutClose.$(OBJ_EXT): StdMemOutClose.c 


#ParseSetRecordIntoSetLogicMatrix.$(OBJ_EXT) : ParseSetRecordIntoSetLogicMatrix.c $(HEADERS)
#setLogicMatrix.$(OBJ_EXT)  : setLogicMatrix.c $(HEADERS)
#tokenstringIter.$(OBJ_EXT) : tokenstringIter.c  $(HEADERS)

#Printf macro expansion: 
PrintfMacroExpand.$(OBJ_EXT): PrintfMacroExpand.c 

#IO
WriteDataToDisk.$(OBJ_EXT): WriteDataToDisk.c $(HEADERS)

#Client/Server compilation
ifeq ($(cluster),0)
ClientServerBoot.$(OBJ_EXT) : ClientServerBoot.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<

GetAnalysisTypeAsEnumFromString.$(OBJ_EXT)                : GetAnalysisTypeAsEnumFromString.c $(HEADERS)
	$(MEX) -c $(MOPTS) $(CFLAGS) $<
	
else
ClientServerBoot.$(OBJ_EXT) : ClientServerBoot.c $(HEADERS)
endif
mxGetAssignedField.$(OBJ_EXT) : mxGetAssignedField.c $(HEADERS)
mexGetArrayPtr.$(OBJ_EXT) : mexGetArrayPtr.c $(HEADERS)
GetAnalysisTypeAsEnumFromString.$(OBJ_EXT)                : GetAnalysisTypeAsEnumFromString.c $(HEADERS)

ifeq ($(cluster),1) #server objects
EmptyErrorString.$(OBJ_EXT): EmptyErrorString.c
mxGetField.$(OBJ_EXT) : mxGetField.c $(HEADERS)
GetOwnershipBoundariesFromRange.$(OBJ_EXT): GetOwnershipBoundariesFromRange.c
IsWorkspaceSynchronized.$(OBJ_EXT): IsWorkspaceSynchronized.c
MatPartition.$(OBJ_EXT): MatrixUtils/MatPartition.c
Mergesolvec.$(OBJ_EXT): MatrixUtils/Mergesolvec.c
Profiler.$(OBJ_EXT): Time/Profiler.c
Reducematrixfromgtof.$(OBJ_EXT): MatrixUtils/Reducematrixfromgtof.c
Reducematrix.$(OBJ_EXT): MatrixUtils/Reducematrix.c
Reducevectorg.$(OBJ_EXT): MatrixUtils/Reducevectorg.c
Reducerightside.$(OBJ_EXT): MatrixUtils/Reducerightside.c
SerialToVec.$(OBJ_EXT): MatrixUtils/SerialToVec.c
SerialToVecNoBcast.$(OBJ_EXT): MatrixUtils/SerialToVecNoBcast.c
SetErrMsg.$(OBJ_EXT): SetErrMsg.c
SharedStack.$(OBJ_EXT): SharedStack.c
VectorPartition.$(OBJ_EXT): VectorPartition.c
Wtime.$(OBJ_EXT): Time/Wtime.c
endif

#clientserver
clientserver.$(OBJ_EXT): clientserver/clientserver.c clientserver/clientserver.h

#Signals
Catch_Sigchld.$(OBJ_EXt): Signals/Catch_Sigchld.c $(HEADERS)
Catch_Sigusr2.$(OBJ_EXt): Signals/Catch_Sigusr2.c $(HEADERS)
Catch_Sigurg.$(OBJ_EXt): Signals/Catch_Sigurg.c $(HEADERS)
Catch_Sigint.$(OBJ_EXT): Signals/Catch_Sigint.c
posix_signal.$(OBJ_EXT): Signals/posix_signal.c

#Default compilation rules
include ../Make_build_err_usage_targets.mk
include ../Make_default_rules.mk


.PHONY : clean
ifeq (no,$(supported))
   ERR = unsupported combination of VER, PLATFORM, COMPILER
   clean: print_build_info err
else
clean: print_build_info
	@echo cleaning up files with extensions .$(LIB_EXT), .$(OBJ_EXT) and .$(MEX_EXT) ...
	-rm -f ./*.$(LIB_EXT) ./*.$(OBJ_EXT) ./*.$(MEX_EXT)
endif

