CC = cc -std=c99
CFLAGS = -Wall -g -I$(PSLIB_DIR)/include -I$(FFTW_DIR)/include
DYLIB = dylib
DYLIB_LDFLAGS = -undefined suppress -flat_namespace -dynamiclib -shared

PSLIB_DIR = ../..
# array.o 
OBJS = dlist.o error.o hash.o logmsg.o memory.o misc.o trace.o vector.o

.PHONY : all
all : $(PSLIB_DIR)/lib/libUtils.a libUtils.$(DYLIB)

libUtils.$(DYLIB) : $(OBJS)
	$(LD) -o libUtils.$(DYLIB) $(DYLIB_LDFLAGS) $(OBJS)
	mv libUtils.$(DYLIB) $(PSLIB_DIR)/lib

$(PSLIB_DIR)/lib/libUtils.a : $(OBJS)
	ar r $(PSLIB_DIR)/lib/libUtils.a $?
	ranlib $(PSLIB_DIR)/lib/libUtils.a
#
# Error codes
#
psErrorCodes.c : $(PSLIB_DIR)/src/Utils/psErrorCodes.dat
	$(PSLIB_DIR)/bin/makeErrorCodes -c psErrorCodes.c -h $(PSLIB_DIR)/include/psErrorCodes.h \
			$(PSLIB_DIR)/src/Utils/psErrorCodes.dat
$(OBJS): psErrorCodes.c
#
# Test code
#
TST_PROGS = tst_array tst_dlist tst_error tst_hash tst_logmsg tst_memory tst_trace
test : $(TST_PROGS)
	for p in $(TST_PROGS); do \
		echo $$p; \
		$$p; \
	done
tst_array : $(PSLIB_DIR)/lib/libUtils.a tst_array.o
	$(CC) $(CFLAGS) -o tst_array tst_array.o $(PSLIB_DIR)/lib/libUtils.a
tst_dlist : $(PSLIB_DIR)/lib/libUtils.a tst_dlist.o
	$(CC) $(CFLAGS) -o tst_dlist tst_dlist.o $(PSLIB_DIR)/lib/libUtils.a
tst_error : $(PSLIB_DIR)/lib/libUtils.a tst_error.o
	$(CC) $(CFLAGS) -o tst_error tst_error.o $(PSLIB_DIR)/lib/libUtils.a
tst_hash : $(PSLIB_DIR)/lib/libUtils.a tst_hash.o
	$(CC) $(CFLAGS) -o tst_hash tst_hash.o $(PSLIB_DIR)/lib/libUtils.a
tst_logmsg : $(PSLIB_DIR)/lib/libUtils.a tst_logmsg.o
	$(CC) $(CFLAGS) -o tst_logmsg tst_logmsg.o $(PSLIB_DIR)/lib/libUtils.a
tst_memory : $(PSLIB_DIR)/lib/libUtils.a tst_memory.o
	$(CC) $(CFLAGS) -o tst_memory tst_memory.o $(PSLIB_DIR)/lib/libUtils.a
tst_trace : $(PSLIB_DIR)/lib/libUtils.a tst_trace.o
	$(CC) $(CFLAGS) -o tst_trace tst_trace.o $(PSLIB_DIR)/lib/libUtils.a
#
#
_tags :;
tags : _tags
	etags *.[ch]
#
clean :
	$(RM) $(TST_PROGS) *.o *.a *.log *.dvi *.aux *.toc *.log *.out *~ core TAGS psErrorCodes.c
empty : clean
