CC = gcc
CFLAGS = -O3

MPICC = mpicc
MPICFLAGS = -O3

AR = ar -qc


MONITOR         = monitor
GATE            = gated
MONCONLIB       = libndebug.a


default: $(MONITOR) $(MONCONLIB) $(GATE)

$(MONITOR): Monitor.o Formula.o TCPIPlib.o CombinedDebugger.o Thread_Semaphore.o
	$(CC) $(CFLAGS) -o $@ Monitor.o Formula.o TCPIPlib.o CombinedDebugger.o Thread_Semaphore.o -lpthread
	strip $@
	if [ ! -e monitorCD ]; then ln -s monitor monitorCD; fi

Monitor.o: Monitor.c Formula.h TCPIPlib.h MonitorDefs.h CommonMonitorDefs.h CombinedDebugger.h Monitor.h NDMessages.h Thread_Semaphore.h
	$(CC) $(CFLAGS) -c Monitor.c

Formula.o: Formula.c Formula.h TCPIPlib.h MonitorDefs.h CommonMonitorDefs.h
	$(CC) $(CFLAGS) -c Formula.c

TCPIPlib.o: TCPIPlib.c TCPIPlib.h Thread_Semaphore.h
	$(CC) $(CFLAGS) -c TCPIPlib.c

CombinedDebugger.o: CombinedDebugger.c TCPIPlib.h CombinedDebugger.h Monitor.h CDMessages.h Thread_Semaphore.h
	$(CC) $(CFLAGS) -c CombinedDebugger.c

Thread_Semaphore.o: Thread_Semaphore.c Thread_Semaphore.h
	$(CC) $(CFLAGS) -c Thread_Semaphore.c

$(MONCONLIB): TCPIPlib_MPI.o MonitorConnect.o Thread_Semaphore_MPI.o
	rm -f $@
	$(AR) $@ TCPIPlib_MPI.o MonitorConnect.o Thread_Semaphore_MPI.o

TCPIPlib_MPI.o: TCPIPlib.c TCPIPlib.h Thread_Semaphore.h
	$(MPICC) $(MPICFLAGS) -c -o $@ TCPIPlib.c

MonitorConnect.o: MonitorConnect.c TCPIPlib.h MonitorConnect.h CommonMonitorDefs.h
	$(MPICC) $(MPICFLAGS) -c MonitorConnect.c

Thread_Semaphore_MPI.o: Thread_Semaphore.c Thread_Semaphore.h
	$(MPICC) $(MPICFLAGS) -c -o $@ Thread_Semaphore.c

$(GATE): Gate.o TCPIPlib.o Thread_Semaphore.o
	$(CC) $(CFLAGS) -o $@ Gate.o TCPIPlib.o Thread_Semaphore.o -lpthread
	strip $@

Gate.o: Gate.c TCPIPlib.h CommonMonitorDefs.h Thread_Semaphore.h
	$(CC) $(CFLAGS) -c Gate.c
