# $Id: Makefile,v 1.34 1997/06/24 06:29:25 lm Exp lm $

# Make targets:
#
# lmbench	[default] builds the benchmark suite for the current os/arch
# results	builds, configures run parameters, and runs the benchmark
# rerun		reruns the benchmark using the same parameters as last time
# clean		cleans out sources and run configuration
# clobber	clean and removes the bin directories
# shar		obsolete, use cd .. && make shar
# depend	builds make dependencies (needs gcc)
#
# This is largely self configuring.  Most stuff is pretty portable.  You
# may have problems with the mhz program.  It needs a C compiler smart
# enough to use "register" when running in unoptimized mode.  gcc does
# this.  cc may not.  Look at the output of mhz and see if it is close
# (within a few percent).  If not, try a different compiler and send me
# mail with the info.
#
# OS config.  If you aren't one of the known OS's (see ../scripts/os)
# then you need to make a target in this makefile with the flags that
# you need.  First fix os to spit out your os and then create a target
# here.  Please mail me that info so I can update the makefile.
#
# If you don't have gcc, try make CC=cc and see if that works.

# I finally know why Larry Wall's Makefile says "Grrrr".
SHELL=/bin/sh

CC = `../scripts/compiler`
AR = ar
ARCREATE = cr
O= ../bin/unknown
TRUE=/bin/true
OS=`../scripts/os`
TARGET=`../scripts/target`
BINDIR=../bin/$(OS)
CONFIG=../bin/$(OS)/`../scripts/config`
RCCS=../rccs
RESULTS=Results/$(OS)
SAMPLES=lmbench/Results/aix/rs6000 lmbench/Results/hpux/snake \
	lmbench/Results/irix/indigo2 lmbench/Results/linux/pentium \
	lmbench/Results/osf1/alpha lmbench/Results/solaris/ss20* 

SYS5=
CFLAGS = -O $(SYS5) $(CF)

COMPILE=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)

SRCS =  bench.h bw_file_rd.c bw_mem_cp.c bw_mem_rd.c bw_mem_wr.c	\
	bw_mmap_rd.c bw_pipe.c bw_tcp.c hello.c lat_connect.c lat_ctx.c	\
	lat_fs.c lat_mem_rd.c lat_mmap.c lat_pagefault.c lat_pipe.c	\
	lat_proc.c lat_rpc.c lat_syscall.c lat_tcp.c lat_udp.c		\
	lib_tcp.c lib_udp.c mhz.c lib_timing.c lat_sig.c mhz.irix	\
	memsize.c bw_unix.c lat_unix.c lmdd.c timing_o.c enough.c	\
	timing.h stats.h lib_tcp.h lib_udp.h lat_select.c \
	msleep.c loop_o.c

EXES = 	$O/bw_file_rd $O/bw_mem_cp $O/bw_mem_rd $O/bw_mem_wr		\
	$O/bw_mmap_rd $O/bw_pipe $O/bw_tcp $O/hello  			\
	$O/lat_select $O/lat_pipe $O/lat_rpc $O/lat_syscall $O/lat_tcp	\
	$O/lat_udp $O/lat_mmap $O/mhz $O/lat_proc $O/lat_pagefault 	\
	$O/lat_connect $O/lat_fs $O/lat_sig $O/lat_mem_rd 	\
	$O/lat_ctx $O/memsize $O/lat_unix $O/bw_unix \
	$O/lmdd $O/timing_o $O/enough $O/msleep $O/loop_o

LIBOBJS= $O/lib_tcp.o $O/lib_udp.o $O/lib_timing.o

lmbench:
	@echo Building for $(TARGET)
	@if [ ! -d $(BINDIR) ]; then mkdir -p $(BINDIR); fi
	$(MAKE) CC="$(CC)" O=$(BINDIR) $(TARGET)

results: 
	@$(MAKE) lmbench CC=$(CC) O=$(BINDIR) $(TARGET)
	@../scripts/config-run
	@../scripts/results

rerun: 
	@if [ ! -f $(CONFIG) ]; then ../scripts/config-run; fi
	@../scripts/results

# No special handling for all these
all irix osf1 aix bsdi linux ultrix sunos unknown: $(EXES)

# System specific stuff.
solaris:
	$(MAKE) CC="$(CC)" O=$O LDLIBS="-lnsl -lsocket" SYS5=-DSYS5 all

hpux:
	@echo ======================================
	@echo If you have gcc, try "make -e CC=gcc"
	@echo ======================================
	$(MAKE) CC="$(CC)" O=$O CFLAGS="$(CFLAGS) -Dvalloc=malloc" all

bsd:
	$(MAKE) CC="$(CC)" O=$O CFLAGS="$(CFLAGS) -Duint='unsigned int'" all

get $(SRCS):
	$(RCCS) get -s $(SRCS)

edit get-e:
	$(RCCS) get -e -s $(SRCS)

clean:
	/bin/rm -f ../bin/*/CONFIG ../bin/*/*.[oa]
	$(RCCS) clean -e -s

clobber:
	/bin/rm -rf ../bin* SHAR
	$(RCCS) clean -e -s

shar:
	cd ../.. && shar lmbench/Results/Makefile $(SAMPLES) lmbench/scripts/* lmbench/src/Makefile lmbench/src/*.[ch] > lmbench/SHAR

depend:
	../scripts/depend

# No optimization for these.
$O/mhz: mhz.c lib_timing.c bench.h $O/lmbench.a
	if [ $(TARGET) = irix ]; \
	then cp mhz.irix $O/mhz; chmod +xw $O/mhz; \
	else $(CC) $(SYS5) -o $O/mhz mhz.c $O/lmbench.a; \
	fi

	if [ $(OS) = irix ]; 				\
	then	$(CC) $(SYS5) $(SGI) -O -o $O/lat_ctx lat_ctx.c $O/lmbench.a; 	\
	else	$(CC) $(SYS5) -o $O/lat_ctx lat_ctx.c $O/lmbench.a;		\
	fi

$O/lmbench.a: lib_timing.c lib_tcp.c lib_udp.c 
	$(COMPILE) -c lib_timing.c -o $O/lib_timing.o
	$(COMPILE) -c lib_tcp.c -o $O/lib_tcp.o
	$(COMPILE) -c lib_udp.c -o $O/lib_udp.o
	/bin/rm -f $O/lmbench.a
	$(AR) $(ARCREATE) $O/lmbench.a $(LIBOBJS)
	-ranlib $O/lmbench.a

# Do not remove the next line, $(MAKE) depend needs it
# MAKEDEPEND follows
$O/rhttp:  rhttp.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/rhttp rhttp.c $O/lmbench.a $(LDLIBS)

$O/http:  http.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/http http.c $O/lmbench.a $(LDLIBS)

$O/lat_ctx: lat_ctx.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_ctx lat_ctx.c $O/lmbench.a $(LDLIBS)

$O/lmhttp:  lmhttp.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lmhttp lmhttp.c $O/lmbench.a $(LDLIBS)

$O/bw_file_rd:  bw_file_rd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_file_rd bw_file_rd.c $O/lmbench.a $(LDLIBS)

$O/bw_mem_cp:  bw_mem_cp.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_mem_cp bw_mem_cp.c $O/lmbench.a $(LDLIBS)

$O/bw_mem_rd:  bw_mem_rd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_mem_rd bw_mem_rd.c $O/lmbench.a $(LDLIBS)

$O/bw_mem_wr:  bw_mem_wr.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_mem_wr bw_mem_wr.c $O/lmbench.a $(LDLIBS)

$O/bw_mmap_rd:  bw_mmap_rd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_mmap_rd bw_mmap_rd.c $O/lmbench.a $(LDLIBS)

$O/bw_pipe:  bw_pipe.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_pipe bw_pipe.c $O/lmbench.a $(LDLIBS)

$O/bw_tcp:  bw_tcp.c bench.h timing.h stats.h lib_tcp.h $O/lmbench.a
	$(COMPILE) -o $O/bw_tcp bw_tcp.c $O/lmbench.a $(LDLIBS)

$O/bw_unix:  bw_unix.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_unix bw_unix.c $O/lmbench.a $(LDLIBS)

$O/clock:  clock.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/clock clock.c $O/lmbench.a $(LDLIBS)

$O/hello:  hello.c $O/lmbench.a
	$(COMPILE) -o $O/hello hello.c $O/lmbench.a $(LDLIBS)

$O/lat_alarm:  lat_alarm.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_alarm lat_alarm.c $O/lmbench.a $(LDLIBS)

$O/lat_connect:  lat_connect.c lib_tcp.c bench.h lib_tcp.h timing.h stats.h $O/lmbench.a
	$(COMPILE) -o $O/lat_connect lat_connect.c $O/lmbench.a $(LDLIBS)

$O/lat_fs:  lat_fs.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_fs lat_fs.c $O/lmbench.a $(LDLIBS)

$O/lat_mem_rd:  lat_mem_rd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mem_rd lat_mem_rd.c $O/lmbench.a $(LDLIBS)

$O/lat_mem_rd2:  lat_mem_rd2.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mem_rd2 lat_mem_rd2.c $O/lmbench.a $(LDLIBS)

$O/lat_mem_wr:  lat_mem_wr.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mem_wr lat_mem_wr.c $O/lmbench.a $(LDLIBS)

$O/lat_mem_wr2:  lat_mem_wr2.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mem_wr2 lat_mem_wr2.c $O/lmbench.a $(LDLIBS)

$O/lat_mmap:  lat_mmap.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mmap lat_mmap.c $O/lmbench.a $(LDLIBS)

$O/lat_mmaprd:  lat_mmaprd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_mmaprd lat_mmaprd.c $O/lmbench.a $(LDLIBS)

$O/lat_pagefault:  lat_pagefault.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_pagefault lat_pagefault.c $O/lmbench.a $(LDLIBS)

$O/lat_pipe:  lat_pipe.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_pipe lat_pipe.c $O/lmbench.a $(LDLIBS)

$O/lat_proc:  lat_proc.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_proc lat_proc.c $O/lmbench.a $(LDLIBS)

$O/lat_rpc:  lat_rpc.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_rpc lat_rpc.c $O/lmbench.a $(LDLIBS)

$O/lat_sig:  lat_sig.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_sig lat_sig.c $O/lmbench.a $(LDLIBS)

$O/lat_syscall:  lat_syscall.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_syscall lat_syscall.c $O/lmbench.a $(LDLIBS)

$O/lat_select:  lat_select.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_select lat_select.c $O/lmbench.a $(LDLIBS)

$O/lat_tcp:  lat_tcp.c timing.h stats.h bench.h lib_tcp.h $O/lmbench.a
	$(COMPILE) -o $O/lat_tcp lat_tcp.c $O/lmbench.a $(LDLIBS)

$O/lat_udp:  lat_udp.c timing.h stats.h bench.h lib_udp.h $O/lmbench.a
	$(COMPILE) -o $O/lat_udp lat_udp.c $O/lmbench.a $(LDLIBS)

$O/lat_unix:  lat_unix.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_unix lat_unix.c $O/lmbench.a $(LDLIBS)

$O/lib_tcp:  lib_tcp.c bench.h lib_tcp.h $O/lmbench.a
	$(COMPILE) -o $O/lib_tcp lib_tcp.c $O/lmbench.a $(LDLIBS)

$O/lib_udp:  lib_udp.c bench.h lib_udp.h $O/lmbench.a
	$(COMPILE) -o $O/lib_udp lib_udp.c $O/lmbench.a $(LDLIBS)

$O/lmdd:  lmdd.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lmdd lmdd.c $O/lmbench.a $(LDLIBS)

$O/enough:  enough.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/enough enough.c $O/lmbench.a $(LDLIBS)

$O/loop_o:  loop_o.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/loop_o loop_o.c $O/lmbench.a $(LDLIBS)

$O/timing_o:  timing_o.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/timing_o timing_o.c $O/lmbench.a $(LDLIBS)

$O/memsize:  memsize.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/memsize memsize.c $O/lmbench.a $(LDLIBS)

$O/msleep:  msleep.c timing.h stats.h bench.h 
	$(COMPILE) -o $O/msleep msleep.c
