# The SPIMS software is covered by a license. The use of the software
# represents acceptance of the terms and conditions in the license.
# ******************************************************************
# Copyright (c) 1989, Swedish Institute of Computer Science
############################################################
# Makefile for Protocol Benchmarks
############################################################

all: programs

# The generic benchmarks at the different protocols and the distribution
# functions. 
GENERIC_BASIC = bnull bulk_get bulk_put rr rpc query conn_disc conn_disc_n
GENERIC_COMP = parallel total background bgprio1 bgprio2 bgprio5
GENERIC_DIST = constant uniform bivalue exp

#
LINT = lint
LIBES = -lm $(CONFIG_LIBES)
YFLAGS = -d
CFLAGS = -I. -I../h $(CONFIG_CFLAGS) $(PROTO_CFLAGS)
COPTS = -D$(PROTOCOLNAME)  '-DPSTRING="$(PROTOCOLNAME)"' $(CONFIG)
LINTFLAGS = $(CFLAGS) $(COPTS) -c -x


GENERAL_S= ../src/ipc.c ../src/ipc_fd.c ../src/ipc_sig.c \
	../src/ipc_pres.c ../src/ipc_system.c ../src/ipc_remote.c \
	../src/ipc_route.c ../src/bench.c ../src/bench-metr.c \
	../src/bench-alarm.c ../src/bench-stats.c ../src/bench-output.c \
	../src/bench-server.c ../src/bench-subr.c \
	../src/bench-mt2st.c ../src/demon-server.c ../src/demon.c \
	../src/demon-logger.c ../src/demon-subr.c \
	../src/bench-delay.c ../src/client-proc.c \
	../src/client-exec.c ../src/server-proc.c ../src/server-exec.c \
	../src/symbol.c ../src/spec.c \
	../src/lex.c ../src/convert.c ../src/error.c \
	../src/random.c ../src/bio.c ../src/state.c \
	../src/malloc.c ../src/strtod.c \
	bench-auto.c demon-auto.c

GENERAL_SOURCES= ../src/gram.y $(GENERAL_S)
GENERAL_LINT_SOURCES= y.tab.c $(GENERAL_S)

# Default transport for the control protocol
# Other possibilities are:
#	../OBJ/ipc_tp_tsap.o	(requires libtsap)
#	ipc_tp.o		(the measured protocol) See protocols/ipc_tp.c
#
IPC_TRANSPORT_OBJ = ../OBJ/ipc_tp_tcp.o

IPCOBJ = ../OBJ/ipc.o ../OBJ/ipc_fd.o ../OBJ/ipc_sig.o \
	../OBJ/ipc_pres.o ../OBJ/ipc_system.o ../OBJ/ipc_remote.o \
	../OBJ/ipc_route.o ../OBJ/ipc_queue.o $(IPC_TRANSPORT_OBJ)

BENCH_OBJECTS = ../OBJ/gram.o ../OBJ/lex.o \
	../OBJ/bench.o ../OBJ/bench-metr.o ../OBJ/bench-alarm.o \
	../OBJ/bench-stats.o ../OBJ/bench-output.o ../OBJ/bench-delay.o \
	../OBJ/bench-server.o ../OBJ/bench-subr.o ../OBJ/bench-mt2st.o

DEMON_OBJECTS = ../OBJ/demon.o ../OBJ/demon-server.o ../OBJ/demon-logger.o \
	../OBJ/demon-subr.o \
	../OBJ/client-exec.o ../OBJ/server-exec.o \
	../OBJ/client-proc.o ../OBJ/server-proc.o

COMMON_OBJS = ../OBJ/bio.o ../OBJ/spec.o ../OBJ/symbol.o ../OBJ/state.o  \
	../OBJ/error.o ../OBJ/convert.o ../OBJ/priority.o ../OBJ/random.o \
	../OBJ/strtod.o ../OBJ/malloc.o

GENERAL_OBJECTS = $(BENCH_OBJECTS) $(IPCOBJ) \
	$(COMMON_OBJS) 


GENERAL_DOBJECTS = $(DEMON_OBJECTS) $(IPCOBJ) \
	$(COMMON_OBJS) \
	../OBJ/bench-metr.o ../OBJ/bench-stats.o ../OBJ/bench-delay.o \
	../OBJ/bench-mt2st.o ../OBJ/bench-output.o 




BASIC = $(GENERIC_BASIC) $(LOCAL_BASIC)
COMP = $(GENERIC_COMP) $(LOCAL_COMP)
DIST = $(GENERIC_DIST) $(LOCAL_DIST)

########################################
# makefile.conf contains
# - the configuration (benchmark and distribution) dependent
#   source files as CONFIG_SOURCES.
# - the objects files as BASIC_OBJS COMP_OBJS and DIST_OBJS
# -  dependencies for the above files
########################################

SOURCES = $(GENERAL_SOURCES) $(CONFIG_SOURCES)
LINT_SOURCES = $(GENERAL_LINT_SOURCES) $(CONFIG_SOURCES)

CONFIG_OBJECTS = $(COMP_OBJS) $(DIST_OBJS)
CONFIG_DOBJECTS = $(BASIC_OBJS) $(COMP_OBJS) $(DIST_OBJS)

OBJECTS = bench-auto.o $(CONFIG_OBJECTS) $(ADDR_OBJS) protoport.o
XOBJECTS = $(GENERAL_OBJECTS) 
DOBJECTS  = demon-auto.o $(CONFIG_DOBJECTS) $(PROTO_OBJS) $(ADDR_OBJS) \
	protocommon.o protoport.o
XDOBJECTS = $(GENERAL_DOBJECTS) 

############################################################
# programs
############################################################

programs: bench demon

bench:	$(OBJECTS) $(XOBJECTS)
	$(LDCC) $(PROTO_LIB_LOCATIONS) -o bench $(XOBJECTS) $(OBJECTS) \
		$(PROTO_B_LIBS) $(PROTO_LIBS) $(LIBES) 

demon:	$(DOBJECTS) $(XDOBJECTS)
	$(LDCC) $(PROTO_LIB_LOCATIONS) -o demon $(XDOBJECTS) $(DOBJECTS) \
		$(PROTO_D_LIBS) $(PROTO_LIBS) $(LIBES) 

clean:
	rm -f core *~ *.o bench demon

lint:	$(LINT_SOURCES)
	$(LINT) $(LINTFLAGS) $(LINT_SOURCES) $(PROTO_LIBS) $(LIBES) 


########################################
#
# Configuration things
#
########################################

config: config.info bench-auto.c demon-auto.c
config: makefile.conf dists.h benchmarks.h
	-@if [ ! -f protospec.h ]; then \
	 { echo Looking for $(PROTO_HEADER) ... ; \
	   rm -f protospec.h; \
	   if [ -f $(PROTO_HEADER) ]; then \
		echo $(LN)  $(PROTO_HEADER) protospec.h; \
		$(LN) $(PROTO_HEADER) protospec.h; \
	else if [ -f ../protocols/$(PROTO_HEADER) ]; then \
		echo $(LN)  ../protocols/$(PROTO_HEADER) protospec.h; \
		$(LN)  ../protocols/$(PROTO_HEADER) protospec.h; \
	else echo "Can't find the protocol specific header file"; \
	     exit 1; \
	fi; fi; } else true; fi
	-@if [ ! -f addrspec.h ]; then \
	 { echo Looking for $(ADDR_HEADER) ... ; \
	   rm -f addrspec.h; \
	   if [ -f $(ADDR_HEADER) ]; then \
		echo $(LN)  $(ADDR_HEADER) addrspec.h; \
		$(LN) $(ADDR_HEADER) addrspec.h; \
	else if [ -f ../protoaddrs/$(ADDR_HEADER) ]; then \
		echo $(LN)  ../protoaddrs/$(ADDR_HEADER) addrspec.h; \
		$(LN)  ../protoaddrs/$(ADDR_HEADER) addrspec.h; \
	else echo "Can't find the address specific header file"; \
	     exit 1; \
	fi; fi; } else true; fi

PROTO_FILES=`echo $(PROTO_OBJS) | ../config/o2null`
ADDR_FILES=`echo $(ADDR_OBJS) | ../config/o2null`

config.info: Makefile ../config/Makefile ../autoconf/exclude.awk
	@echo '$(EXCLUDED_BASIC)' >tmp.info
	@echo '$(EXCLUDED_COMP)' >>tmp.info
	@echo '$(EXCLUDED_DIST)' >>tmp.info
	@echo '$(BASIC)' >>tmp.info
	@echo '$(COMP)' >>tmp.info
	@echo '$(DIST)' >>tmp.info
	awk -f ../autoconf/exclude.awk <tmp.info >config.info
	@rm -f tmp.info
	@echo $(PROTO_FILES) >>config.info
	@echo $(ADDR_FILES) >>config.info


bench-auto.c: Makefile ../config/Makefile ../autoconf/bench-auto.awk
bench-auto.c: config.info
	awk -f ../autoconf/bench-auto.awk <config.info >bench-auto.c

demon-auto.c: Makefile ../config/Makefile ../autoconf/demon-auto.awk
demon-auto.c: config.info
	awk -f ../autoconf/demon-auto.awk <config.info >demon-auto.c


makefile.conf: Makefile ../config/Makefile config.info
makefile.conf: ../autoconf/sfiles.awk ../autoconf/ofiles.awk
makefile.conf: ../autoconf/depend.awk
	@echo 'all: programs' >makefile.conf
	awk -f ../autoconf/sfiles.awk  <config.info >>makefile.conf
	awk -f ../autoconf/ofiles.awk  <config.info >>makefile.conf
	awk -f ../autoconf/depend.awk <config.info >>makefile.conf

dists.h: Makefile ../config/Makefile ../autoconf/distheader.awk
dists.h: config.info
	awk -f ../autoconf/distheader.awk  <config.info  >dists.h

benchmarks.h: Makefile ../config/Makefile config.info
benchmarks.h: ../autoconf/benchheader.awk
	awk -f ../autoconf/benchheader.awk  <config.info  >benchmarks.h

############################################################
# Rules for protocol dependent files
############################################################

protocommon.o:
	$(CC) $(CFLAGS) $(COPTS) -c ../protocols/protocommon.c

protoport.o:
	$(CC) $(CFLAGS) $(COPTS) -c ../protocols/protoport.c

bench-auto.o:
	$(CC) $(CFLAGS) $(COPTS) -c bench-auto.c

demon-auto.o:
	$(CC) $(CFLAGS) $(COPTS) -c demon-auto.c


############################################################
# Dependiencies for protocol dependent files
############################################################

bench-auto.o: bench-auto.c
bench-auto.o: ../h/general.h ../h/symbol.h ../h/spec.h ../h/error.h

demon-auto.o: demon-auto.c
demon-auto.o: ../h/general.h ../h/symbol.h ../h/spec.h ../h/error.h

protocommon.o: ../protocols/protocommon.c
protocommon.o: ../h/general.h protospec.h Makefile

protoport.o: ../protocols/protoport.c
protoport.o: Makefile

# Only used when IPC_TRANSPORT_OBJ is defined to be ipc_tp.o
ipc_tp.o: ../protocols/ipc_tp.c
ipc_tp.o: protospec.h ../h/general.h
