MAN.C=man.c man_get_slot.c man_put_slot.c
MAN.O=man.o man_get_slot.o man_put_slot.o
COMMON.C=put_slot.c name.c cm_time.c cm_sd.c msg.c cm_util.c
COMMON.O=put_slot.o name.o cm_time.o cm_sd.o msg.o cm_util.o
USER.C=usr_var.c usr_get_slot.c usr_put_slot.c cm_usr1.c cm_usr2.c
USER.O=usr_var.o usr_get_slot.o usr_put_slot.o cm_usr1.o cm_usr2.o
LUSER.C=Luser.c
LUSER.O=Luser.o
LIBS=/usr/local/lib/libstream.a
CMLIB=libcm.a
MBLIB=/usr/local/lib/mailbox.o
LINCLUDE=/usr/local/include
CFLAGS=-g -I$(LINCLUDE)/inet/stream -Ifranz -DCMM_VERSION=7
LINTFLAGS=-I$(LINCLUDE)/inet/stream -Ifranz -DCMM_VERSION=7
HFILES=cm.h cm_bytestuff.h cm_constants.h cm_interface.h cm_man.h cm_msg.h \
	cm_sd.h cm_slot.h cm_sync.h cm_time.h cm_var.h
LISPHFILES=config.h dfuncs.h global.h lconf.h lstructs.h ltypes.h\
	module.h public.h sigtab.h

# demonstrate various cm_sync options
EXAMPLE1=client1a client1b server1y server1z

# demonstrate passing various C types (in a machine-dependent way)
EXAMPLE2=client2 server2

# demonstrate AMRF-style mailboxes in c & Lisp
# some names are in uppercase to accomodate the outside world (nip, vax cmm)
# non-NBS people should ignore this example
# EXAMPLE6=client6 server6

# provoke bad user behavior
# 8a is a reader that never reads its input
# 8b is designed to have a high probability of exiting while cmm is writing
# to it, thereby signalling the cmm with a SIGPIPE 
EXAMPLE8=client8 server8a server8b

normal: $(CMLIB) $(LUSER.O)

cleanup:
	rm $(MAN.O) $(COMMON.O) $(LUSER.O) $(CMLIB)

install: $(CMLIB) $(LUSER.O) makedirs
	cp cmm /usr/local/bin
	cp $(HFILES) /usr/local/include/cm
	sh -c 'cd franz;cp `echo *` /usr/local/include/franz'
	cp $(CMLIB) $(LUSER.O) /usr/local/lib
	cp cm.lisp /usr/local/lisp

shar:
	ls franz > shar-input
	cat shar-input | sed 's/^/franz\//' > tmp
	ls Makefile README $(HFILES) $(MAN.C) $(COMMON.C) $(USER.C) \
		server1z.c server1y.c client1a.c client1b.c \
		server2.c client2.c server8a.c server8b.c client8.c \
		$(LUSER.C) cm.lisp  >> tmp
	cat tmp | sed 's/^/src\//' > shar-input

makedirs: /usr/local/include/cm /usr/local/include/franz /usr/local/lisp

/usr/local/lisp:
	mkdir /usr/local/lisp

/usr/local/include/cm:
	mkdir /usr/local/include/cm

/usr/local/include/franz:
	mkdir /usr/local/include/franz

vws: Lvws.o vws.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o vws vws.o $(MBLIB) $(CMLIB) $(LIBS)

lint: lintcmm lintuser

lintc:
	lint -Ccm $(USER.C) $(COMMON.C) -lstream

examples: $(LUSER.O) $(EXAMPLE1) $(EXAMPLE2) $(EXAMPLE6) $(EXAMPLE8)

$(CMLIB): cmm $(MAN.O) $(USER.O) $(COMMON.O)
	ar cr $(CMLIB) `lorder $(USER.O) $(COMMON.O) | tsort`
	ranlib $(CMLIB)

server1z: server1z.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server1z server1z.o $(CMLIB) $(LIBS)

server1y: server1y.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server1y server1y.o $(CMLIB) $(LIBS)

client1a: client1a.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o client1a client1a.o $(CMLIB) $(LIBS)

client1b: client1b.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o client1b client1b.o $(CMLIB) $(LIBS)

server2: server2.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server2 server2.o $(CMLIB) $(LIBS)

client2: client2.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o client2 client2.o $(CMLIB) $(LIBS)

client6: client6.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o client6 client6.o $(MBLIB) $(CMLIB) $(LIBS)

server6: server6.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server6 server6.c $(MBLIB) $(CMLIB) $(LIBS)

client8: client8.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o client8 client8.c $(CMLIB) $(LIBS)

server8a: server8a.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server8a server8a.c $(CMLIB) $(LIBS)

server8b: server8b.o $(USER.O) $(COMMON.O) $(CMLIB)
	cc $(CFLAGS) -o server8b server8b.c $(CMLIB) $(LIBS)

cmm: $(MAN.O) $(COMMON.O)
	cc $(CFLAGS) -o cmm $(MAN.O) $(COMMON.O) $(LIBS)

lintcmm:
	lint $(LINTFLAGS) $(MAN.C) $(COMMON.C) -lstream | tee cmm.lint

lintuser:
	lint -u $(LINTFLAGS) $(USER.C) $(COMMON.C) -lstream | tee user.lint

Luser.o: cm_constants.h cm_sd.h cm_var.h cm_interface.h

cm_usr1.o: cm_constants.h cm_sd.h cm_interface.h cm_sync.h cm_msg.h cm_slot.h cm_time.h

cm_usr2.o: cm_constants.h cm_sd.h cm_var.h cm_interface.h

usr_put_slot.o: cm_bytestuff.h cm_msg.h cm_slot.h cm_interface.h

msg.o: cm_constants.h cm_slot.h cm_sd.h cm_msg.h

put_slot.o: cm_constants.h cm_slot.h cm_sd.h cm_msg.h

man_get_slot.o: cm_constants.h cm_var.h cm_slot.h cm_man.h cm_sd.h cm_msg.h cm_time.h

man_put_slot.o: cm_constants.h cm_slot.h cm_sd.h

man.o: cm_constants.h cm_var.h cm_slot.h cm_time.h cm_man.h cm_sd.h cm_msg.h

cm_sd.o: cm_sd.h cm_var.h

usr_get_slot.o: cm_constants.h cm_sd.h cm_interface.h cm_slot.h

usr_var.o: cm_sd.h cm_interface.h
