# Makefile for thread parallelism examples
#
# THREADCNT, if non-zero, overrides # threads in pool when testing
THREADCNT=
#
# RENDFLGS, can override queue size by specifying, for example, -q 2000
RENDFLGS=-q 2000
#
# if Solaris 2.4 and earlier (uses Posix "blanket" simulation")
LO=pblanket.o tpool.o
L=pblanket.o tpool.o -lthread
CINCLUDE=-Iposix/include
# elseif Solaris 2.5 and later (uses Posix threads library)
LO=tpool.o
L=tpool.o -lpthread
CINCLUDE=
# endif
#
CC=cc
CFLAGS = -w $(CINCLUDE)
#CFLAGS = -g $(CINCLUDE)

CFILES = doccer.c tabulate.c pblanket.c driver.c tpool.c \
	 barrier.c workpile.c queue.c \
	 matutils.c mm.c relax.c \
	 ms-mm.c ms-relax.c \
	 wp-mm.c wp-sim-gen.c wp-sim-parse.c wp-sim.c wp-sim-nt.c \
	 pl-relax.c \
	 pl-rend-t.c pl-rend-c.c pl-rend-e.c pl-rend-p.c \
	 pl-rend-gen.c pl-rend-gt.c pl-rend-pipe.c pl-rend-utils.c

HFILES = driver.h tpool.h barrier.h workpile.h queue.h \
	matutils.h wp-sim.h pl-rend.h pl-rend-gt.h

BFILES = ms-mm ms-relax wp-mm wp-sim pl-relax pl-rend

default: all

doccer: doccer.o
	$(CC) -o doccer doccer.o

tabulate: tabulate.o
	$(CC) -o tabulate tabulate.o

ms-mm: mm.o ms-mm.o matutils.o driver.o $(LO)
	$(CC) -o ms-mm mm.o ms-mm.o matutils.o driver.o $(L)

ms-relax: relax.o ms-relax.o matutils.o driver.o barrier.o $(LO)
	$(CC) -o ms-relax relax.o ms-relax.o matutils.o barrier.o driver.o $(L)
 
wp-mm: mm.o wp-mm.o matutils.o driver.o workpile.o $(LO)
	$(CC) -o wp-mm mm.o wp-mm.o matutils.o driver.o workpile.o $(L)
 
wp-sim: wp-sim.o wp-sim-nt.o wp-sim-gen.o wp-sim-parse.o driver.o workpile.o $(LO)
	$(CC) -o wp-sim wp-sim.o wp-sim-nt.o wp-sim-gen.o wp-sim-parse.o \
		workpile.o driver.o $(L)

pl-relax: relax.o pl-relax.o matutils.o driver.o queue.o $(LO)
	$(CC) -o pl-relax relax.o pl-relax.o matutils.o driver.o queue.o $(L)

pl-rend: pl-rend-t.o pl-rend-c.o pl-rend-e.o pl-rend-p.o \
	pl-rend-gen.o pl-rend-gt.o pl-rend-pipe.o pl-rend-utils.o \
	queue.o driver.o $(LO)
	$(CC) -o pl-rend pl-rend-t.o pl-rend-c.o pl-rend-e.o pl-rend-p.o \
		pl-rend-gen.o pl-rend-gt.o pl-rend-pipe.o pl-rend-utils.o \
		queue.o driver.o $(L) -lm
 
all: $(BFILES)

test: all
	ms-mm 0 1 $(THREADCNT)
	ms-relax 0 1 $(THREADCNT)
	wp-mm 0 1 $(THREADCNT)
	wp-sim 0 1 $(THREADCNT)
	pl-relax 0 1 $(THREADCNT)
	pl-rend 0 10050 $(THREADCNT)

measure: all
	ms-mm 20 1 $(THREADCNT) >>measure.out
	ms-mm 20 2 $(THREADCNT) >>measure.out
	ms-mm 10 3 $(THREADCNT) >>measure.out
	ms-mm 10 6 $(THREADCNT) >>measure.out
	ms-relax 4 1 $(THREADCNT) >>measure.out
	ms-relax 4 2 $(THREADCNT) >>measure.out
	ms-relax 2 3 $(THREADCNT) >>measure.out
	ms-relax 2 4 $(THREADCNT) >>measure.out
	wp-mm 20 1 $(THREADCNT) >>measure.out
	wp-mm 20 2 $(THREADCNT) >>measure.out
	wp-mm 10 3 $(THREADCNT) >>measure.out
	wp-mm 10 6 $(THREADCNT) >>measure.out
	wp-sim 50 8 $(THREADCNT) >>measure.out
	wp-sim 50 10 $(THREADCNT) >>measure.out
	wp-sim 50 13 $(THREADCNT) >>measure.out
	wp-sim 50 16 $(THREADCNT) >>measure.out
	pl-relax 4 1 $(THREADCNT) >>measure.out
	pl-relax 4 2 $(THREADCNT) >>measure.out
	pl-relax 2 3 $(THREADCNT) >>measure.out
	pl-relax 2 4 $(THREADCNT) >>measure.out
	pl-rend $(RENDFLGS) 3 10001 $(THREADCNT) >>measure.out
	pl-rend $(RENDFLGS) 3 10010 $(THREADCNT) >>measure.out
	pl-rend $(RENDFLGS) 3 10030 $(THREADCNT) >>measure.out
	pl-rend $(RENDFLGS) 3 10050 $(THREADCNT) >>measure.out

# use this on an 8-processor system

measure-8: all
	rm -f measure.out
	make THREADCNT=0 measure
	make THREADCNT=1 measure
	make THREADCNT=2 measure
	make THREADCNT=4 measure
	make THREADCNT=6 measure
	make THREADCNT=8 measure
	make THREADCNT=10 measure
	make THREADCNT=12 measure

# use this on a 2-processor system

measure-2: all
	rm -f measure.out
	make THREADCNT=0 measure
	make THREADCNT=1 measure
	make THREADCNT=2 measure
	make THREADCNT=4 measure
	pl-rend $(RENDFLGS) 3 10001 5 >>measure.out
	pl-rend $(RENDFLGS) 3 10010 5 >>measure.out
	pl-rend $(RENDFLGS) 3 10030 5 >>measure.out
	pl-rend $(RENDFLGS) 3 10050 5 >>measure.out

lint:   $(CFILES)
	lint $(CFLAGS) $(CFILES)

doc: doccer $(CFILES)
	rm -f synch.doc
	doccer tpool.h tpool.c barrier.h barrier.c workpile.h workpile.c \
		queue.h queue.c pblanket.c >synch.doc
	rm -f utils.doc
	doccer driver.h driver.c >utils.doc
	rm -f mm.doc
	doccer mm.c ms-mm.c wp-mm.c matutils.h matutils.c >mm.doc
	rm -f relax.doc
	doccer relax.c ms-relax.c pl-relax.c >relax.doc
	rm -f sim.doc
	doccer wp-sim.h wp-sim.c wp-sim-gen.c wp-sim-parse.c >sim.doc
	rm -f rend.doc
	doccer pl-rend.h pl-rend-gt.h pl-rend-gen.c pl-rend-gt.c \
		pl-rend-t.c pl-rend-c.c pl-rend-e.c pl-rend-p.c \
		pl-rend-pipe.c pl-rend-utils.c >rend.doc

clean:
	rm -f *.o *~ *% core makefile.bak
	
clobber: clean
	rm -f $(BFILES) doccer tabulate
	rm -f pl-rend.ppm wp-sim.log measure.out *.doc

########### DO NOT ADD ANYTHING BELOW THIS LINE ! ***************
CDEPENDFILES = $(CFILES) $(LFILES) $(YFILES) 

depend:
	@ echo making dependencies
	@ /usr/bin/rm -fr makedep eddep
	@ echo > makedep
	@ cc -xM1 $(CFLAGS) $(CDEPENDFILES) >> makedep
	@ echo '/^# DO NOT DELETE THIS LINE/+2,$$d' > eddep
	@ echo '$$r makedep' >> eddep
#	@ echo '1,$$s/\\.o/\\.o/g' >> eddep
	@ echo 'w makefile' >> eddep
	@ cp makefile makefile.bak
	@ ed - makefile < eddep
	@ /usr/bin/rm -fr makedep eddep 
	@ echo '# DEPENDENCIES MUST BE LAST IN FILE' >> makefile
	@ echo '# IF YOU PUT STUFF HERE IT WILL GO AWAY' >> makefile
	@ echo '# see make depend above' >> makefile

# DO NOT DELETE THIS LINE


doccer.o: doccer.c
tabulate.o: tabulate.c
pblanket.o: pblanket.c
driver.o: driver.c
driver.o: tpool.h
driver.o: driver.h
tpool.o: tpool.c
tpool.o: tpool.h
barrier.o: barrier.c
barrier.o: barrier.h
workpile.o: workpile.c
workpile.o: workpile.h
queue.o: queue.c
queue.o: queue.h
matutils.o: matutils.c
matutils.o: driver.h
matutils.o: matutils.h
mm.o: mm.c
mm.o: driver.h
mm.o: matutils.h
relax.o: relax.c
relax.o: driver.h
relax.o: matutils.h
ms-mm.o: ms-mm.c
ms-mm.o: driver.h
ms-mm.o: matutils.h
ms-mm.o: tpool.h
ms-relax.o: ms-relax.c
ms-relax.o: driver.h
ms-relax.o: matutils.h
ms-relax.o: barrier.h
ms-relax.o: tpool.h
wp-mm.o: wp-mm.c
wp-mm.o: driver.h
wp-mm.o: matutils.h
wp-mm.o: tpool.h
wp-mm.o: workpile.h
wp-sim-gen.o: wp-sim-gen.c
wp-sim-gen.o: wp-sim.h
wp-sim-gen.o: driver.h
wp-sim-gen.o: workpile.h
wp-sim-parse.o: wp-sim-parse.c
wp-sim-parse.o: wp-sim.h
wp-sim-parse.o: driver.h
wp-sim-parse.o: workpile.h
wp-sim.o: wp-sim.c
wp-sim.o: wp-sim.h
wp-sim.o: driver.h
wp-sim.o: workpile.h
wp-sim.o: tpool.h
wp-sim-nt.o: wp-sim-nt.c
wp-sim-nt.o: wp-sim.h
wp-sim-nt.o: driver.h
wp-sim-nt.o: workpile.h
wp-sim-nt.o: tpool.h
pl-relax.o: pl-relax.c
pl-relax.o: driver.h
pl-relax.o: matutils.h
pl-relax.o: queue.h
pl-relax.o: tpool.h
pl-rend-t.o: pl-rend-t.c
pl-rend-t.o: pl-rend.h
pl-rend-t.o: driver.h
pl-rend-t.o: pl-rend-gt.h
pl-rend-c.o: pl-rend-c.c
pl-rend-c.o: pl-rend.h
pl-rend-c.o: driver.h
pl-rend-c.o: pl-rend-gt.h
pl-rend-e.o: pl-rend-e.c
pl-rend-e.o: pl-rend.h
pl-rend-e.o: driver.h
pl-rend-e.o: pl-rend-gt.h
pl-rend-p.o: pl-rend-p.c
pl-rend-p.o: pl-rend.h
pl-rend-p.o: driver.h
pl-rend-p.o: pl-rend-gt.h
pl-rend-gen.o: pl-rend-gen.c
pl-rend-gen.o: pl-rend.h
pl-rend-gen.o: driver.h
pl-rend-gen.o: pl-rend-gt.h
pl-rend-gt.o: pl-rend-gt.c
pl-rend-gt.o: pl-rend.h
pl-rend-gt.o: driver.h
pl-rend-gt.o: pl-rend-gt.h
pl-rend-pipe.o: pl-rend-pipe.c
pl-rend-pipe.o: pl-rend.h
pl-rend-pipe.o: driver.h
pl-rend-pipe.o: pl-rend-gt.h
pl-rend-pipe.o: queue.h
pl-rend-pipe.o: tpool.h
pl-rend-utils.o: pl-rend-utils.c
pl-rend-utils.o: pl-rend.h
pl-rend-utils.o: driver.h
pl-rend-utils.o: pl-rend-gt.h
# DEPENDENCIES MUST BE LAST IN FILE
# IF YOU PUT STUFF HERE IT WILL GO AWAY
# see make depend above
