# $Id$

# 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
# scaling	reruns the benchmark using same parameters as last time,
#		except it asks what scaling value to use
# hardware	reruns the hardware benchmarks using the same parameters
# os		reruns the OS benchmarks using the same parameters
# 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)
# debug		builds all the benchmarks with '-g' debugging flag
# assembler	builds the .s files for each benchmark
#
# This is largely self configuring.  Most stuff is pretty portable.  
#
# If you don't have gcc, try make CC=cc and see if that works.
#
# If you want to do cross-compilation try make OS=armv5tel-linux-gnu
# or whatever your OS string should be in the target environment.
# Since many embedded development environments also have a special
# cross-compiler, you might want to also select a particular compiler,
# so your build command would look something like:
#	make OS=armv5tel-linux-gnu CC=gcc-arm
#
# Overriding the OS and CC make parameters needs to be done as an
# argument to make, not as an environment variable.  See above comments.
#

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

CC=`../scripts/compiler`
MAKE=`../scripts/make`
AR=ar
ARCREATE=cr
RANLIB=ranlib

# base of installation location
BASE=/usr/local
O= ../bin/unknown
D= ../doc
TRUE=/bin/true
OS=`../scripts/os`
TARGET=`../scripts/target`
BINDIR=../bin/$(OS)
CONFIG=../bin/$(OS)/`../scripts/config`
UTILS=../scripts/target ../scripts/os ../scripts/gnu-os ../scripts/compiler \
	../scripts/hostinfo ../scripts/hostinfo-template ../scripts/version \
	../scripts/config ../scripts/config-run ../scripts/results \
	../scripts/lmbench ../scripts/make ../scripts/build
INSTALL=cp
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* 

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

INCS =	bench.h lib_mem.h lib_tcp.h lib_udp.h stats.h timing.h

SRCS =  bw_file_rd.c bw_mem.c bw_mmap_rd.c bw_pipe.c bw_tcp.c bw_udp.c	\
	bw_unix.c							\
	cache.c clock.c disk.c enough.c flushdisk.c getopt.c hello.c	\
	lat_connect.c lat_ctx.c	lat_fcntl.c lat_fifo.c lat_fs.c 	\
	lat_mem_rd.c lat_mmap.c lat_ops.c lat_pagefault.c lat_pipe.c 	\
	lat_proc.c lat_rpc.c lat_select.c lat_sig.c lat_syscall.c	\
	lat_tcp.c lat_udp.c lat_unix.c lat_unix_connect.c lat_sem.c	\
	lat_usleep.c lat_pmake.c  					\
	lib_debug.c lib_mem.c lib_stats.c lib_tcp.c lib_timing.c 	\
	lib_udp.c lib_unix.c lib_sched.c				\
	line.c lmdd.c lmhttp.c par_mem.c par_ops.c loop_o.c memsize.c 	\
	mhz.c msleep.c rhttp.c seek.c timing_o.c tlb.c stream.c		\
	bench.h lib_debug.h lib_tcp.h lib_udp.h lib_unix.h names.h 	\
	stats.h timing.h version.h

ASMS =  $O/bw_file_rd.s $O/bw_mem.s $O/bw_mmap_rd.s $O/bw_pipe.s 	\
	$O/bw_tcp.s $O/bw_udp.s $O/bw_unix.s $O/clock.s			\
	$O/disk.s $O/enough.s $O/flushdisk.s $O/getopt.s $O/hello.s	\
	$O/lat_connect.s $O/lat_ctx.s lat_fcntl.s $O/lat_fifo.s		\
	$O/lat_fs.s $O/lat_mem_rd.s $O/lat_mmap.s $O/lat_ops.s		\
	$O/lat_pagefault.s $O/lat_pipe.s $O/lat_proc.s $O/lat_rpc.s	\
	$O/lat_select.s $O/lat_sig.s $O/lat_syscall.s $O/lat_tcp.s	\
	$O/lat_udp.s $O/lat_unix.s $O/lat_unix_connect.s $O/lat_sem.s	\
	$O/lib_debug.s $O/lib_mem.s	\
	$O/lib_stats.s $O/lib_tcp.s $O/lib_timing.s $O/lib_udp.s	\
	$O/lib_unix.s $O/lib_sched.s					\
	$O/line.s $O/lmdd.s $O/lmhttp.s $O/par_mem.s	\
	$O/par_ops.s $O/loop_o.s $O/memsize.s $O/mhz.s $O/msleep.s	\
	$O/rhttp.s $O/timing_o.s $O/tlb.s $O/stream.s			\
	$O/cache.s $O/lat_dram_page.s $O/lat_pmake.s $O/lat_rand.s	\
	$O/lat_usleep.s $O/lat_cmd.s
EXES =	$O/bw_file_rd $O/bw_mem $O/bw_mmap_rd $O/bw_pipe $O/bw_tcp 	\
	$O/bw_unix $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/lat_sem 							\
	$O/memsize $O/lat_unix $O/lmdd $O/timing_o $O/enough		\
	$O/msleep $O/loop_o $O/lat_fifo $O/lmhttp $O/lat_http		\
	$O/lat_fcntl $O/disk $O/lat_unix_connect $O/flushdisk		\
	$O/lat_ops $O/line $O/tlb $O/par_mem $O/par_ops 		\
	$O/stream
OPT_EXES=$O/cache $O/lat_dram_page $O/lat_pmake $O/lat_rand 		\
	$O/lat_usleep $O/lat_cmd
LIBOBJS= $O/lib_tcp.o $O/lib_udp.o $O/lib_unix.o $O/lib_timing.o 	\
	$O/lib_mem.o $O/lib_stats.o $O/lib_debug.o $O/getopt.o		\
	$O/lib_sched.o

lmbench: $(UTILS)
	@env CFLAGS+=-O MAKE="$(MAKE)" MAKEFLAGS="$(MAKEFLAGS)" CC="$(CC)" OS="$(OS)" ../scripts/build all
	-@env CFLAGS+=-O MAKE="$(MAKE)" MAKEFLAGS="k$(MAKEFLAGS)" CC="$(CC)" OS="$(OS)" ../scripts/build opt

results: lmbench
	@env OS="${OS}" ../scripts/config-run
	@env OS="${OS}" ../scripts/results

rerun: lmbench
	@if [ ! -f $(CONFIG) ]; then env OS="${OS}" ../scripts/config-run; fi
	@env OS="${OS}" ../scripts/results

scaling: lmbench
	@if [ ! -f $(CONFIG) ]; then env OS="${OS}" ../scripts/config-run; \
	 else ../scripts/config-scaling $(CONFIG); fi
	@env OS="${OS}" ../scripts/results

hardware: lmbench
	@if [ ! -f $(CONFIG) ]; then env OS="${OS}" ../scripts/config-run; fi
	@env OS="${OS}" BENCHMARK_HARDWARE=YES BENCHMARK_OS=NO  ../scripts/results

os: lmbench
	@if [ ! -f $(CONFIG) ]; then env OS="${OS}" ../scripts/config-run; fi
	@env OS="${OS}" BENCHMARK_HARDWARE=NO  BENCHMARK_OS=YES ../scripts/results

install: lmbench
	@env CFLAGS+=-O MAKE="$(MAKE)"  MAKEFLAGS="$(MAKEFLAGS)" CC="${CC}" OS="${OS}" ../scripts/build install-target

install-target:
	if [ ! -d $(BASE) ]; then mkdir $(BASE); fi
	if [ ! -d $(BASE)/bin ]; then mkdir $(BASE)/bin; fi
	if [ ! -d $(BASE)/include ]; then mkdir $(BASE)/include; fi
	if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir $(DESTDIR)$(libdir); fi
	cp $(EXES) $(BASE)/bin
	cp $(INCS) $(BASE)/include
	cp $O/lmbench.a $(DESTDIR)$(libdir)/libmbench.a
	cd ../doc; env MAKEFLAGS="$(MAKEFLAGS)" make CC="${CC}" OS="${OS}" BASE="$(BASE)" install


# No special handling for all these
all: $(EXES) $O/lmbench
opt: $(OPT_EXES)
asm: $(ASMS)
$(ASMS):
	$(CC) -S $(CFLAGS) $(CPPFLAGS) -o $@ `basename $@ .s`.c $(LDFLAGS)

Wall:
	@env CFLAGS+="-g -O -Wall" MAKE="$(MAKE)" MAKEFLAGS="$(MAKEFLAGS)" CC="${CC}" OS="${OS}" ../scripts/build all opt

debug:
	@env CFLAGS+="-g -O -DDEBUG" MAKE="$(MAKE)" MAKEFLAGS="$(MAKEFLAGS)" CC="${CC}" OS="${OS}" ../scripts/build all opt

assembler:
	@env CFLAGS+=-O MAKE="$(MAKE)" MAKEFLAGS="$(MAKEFLAGS)" CC="${CC}" OS="${OS}" ../scripts/build asm


tag:
	ROOT=`cat ../CVS/Root`; \
	MODULE=`cat ../CVS/Repository`; \
	VERSION=`../scripts/version`; \
	TAG=`echo lmbench_$${VERSION} | sed -e 's/-/_/g' -e 's/\\./_/g'`; \
	cd .. \
	&& cvs -d$${ROOT} tag -c "$${TAG}"

dist: 
	SRCDIR=`pwd`; \
	ROOT=`cat ../CVS/Root`; \
	MODULE=`cat ../CVS/Repository`; \
	VERSION=`../scripts/version`; \
	cd /tmp \
	&& cvs -d$${ROOT} export -Dtomorrow \
		 -d $${MODULE}-$${VERSION} $${MODULE} \
	&& chmod +x $${MODULE}-$${VERSION}/scripts/[a-z]* \
	&& mv $${MODULE}-$${VERSION} lmbench-$${VERSION} \
	&& tar czf $${SRCDIR}/../../lmbench-$${VERSION}.tgz \
		lmbench-$${VERSION} \
	&& rm -rf lmbench-$${VERSION};

clean:
	/bin/rm -f ../bin/*/CONFIG ../bin/*/*.[oas]
	/bin/rm -f *.[oas]

clobber:
	/bin/rm -rf ../bin* SHAR

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

depend: ../scripts/depend
	../scripts/depend

testmake: $(SRCS) $(UTILS) # used by scripts/make to test gmake
	@true

.PHONY: lmbench results rerun hardware os install all Wall debug \
	install install-target dist get edit get-e clean clobber \
	share depend testmake

$O/lmbench : ../scripts/lmbench version.h
	rm -f $O/lmbench
	VERSION=`../scripts/version`; \
	sed -e "s/<version>/$${VERSION}/g" < ../scripts/lmbench > $O/lmbench
	chmod +x $O/lmbench

$O/lmbench.a: $(LIBOBJS)
	/bin/rm -f $O/lmbench.a
	$(AR) $(ARCREATE) $O/lmbench.a $(LIBOBJS)
	-$(RANLIB) $O/lmbench.a

$O/lib_timing.o : lib_timing.c $(INCS)
	$(COMPILE) -c lib_timing.c -o $O/lib_timing.o
$O/lib_mem.o : lib_mem.c $(INCS)
	$(COMPILE) -c lib_mem.c -o $O/lib_mem.o
$O/lib_tcp.o : lib_tcp.c $(INCS)
	$(COMPILE) -c lib_tcp.c -o $O/lib_tcp.o
$O/lib_udp.o : lib_udp.c $(INCS)
	$(COMPILE) -c lib_udp.c -o $O/lib_udp.o
$O/lib_unix.o : lib_unix.c $(INCS)
	$(COMPILE) -c lib_unix.c -o $O/lib_unix.o
$O/lib_debug.o : lib_debug.c $(INCS)
	$(COMPILE) -c lib_debug.c -o $O/lib_debug.o
$O/lib_stats.o : lib_stats.c $(INCS)
	$(COMPILE) -c lib_stats.c -o $O/lib_stats.o
$O/lib_sched.o : lib_sched.c $(INCS)
	$(COMPILE) -c lib_sched.c -o $O/lib_sched.o
$O/getopt.o : getopt.c $(INCS)
	$(COMPILE) -c getopt.c -o $O/getopt.o

$(UTILS) :
	-cd ../scripts; cp info hostinfo; cp info-template hostinfo-template

# Do not remove the next line, $(MAKE) depend needs it
# MAKEDEPEND follows
$O/rhttp.s:rhttp.c timing.h stats.h bench.h 
$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.s:http.c timing.h stats.h bench.h 
$O/http:  http.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/http http.c $O/lmbench.a $(LDLIBS)

$O/flushdisk.s:flushdisk.c 
$O/flushdisk:  flushdisk.c 
	$(COMPILE) -DMAIN -o $O/flushdisk flushdisk.c

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

$O/lat_ctx.s: lat_ctx.c timing.h stats.h bench.h
$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.s:lmhttp.c timing.h stats.h bench.h
$O/lmhttp:  lmhttp.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lmhttp lmhttp.c $O/lmbench.a $(LDLIBS)

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

$O/bw_file_rd.s:bw_file_rd.c timing.h stats.h bench.h
$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.s:bw_mem.c timing.h stats.h bench.h
$O/bw_mem:  bw_mem.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/bw_mem bw_mem.c $O/lmbench.a $(LDLIBS)

$O/bw_mmap_rd.s:bw_mmap_rd.c timing.h stats.h bench.h
$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.s:bw_pipe.c timing.h stats.h bench.h
$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.s:bw_tcp.c bench.h timing.h stats.h lib_tcp.h
$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_udp.s:bw_udp.c bench.h timing.h stats.h lib_udp.h
$O/bw_udp:  bw_udp.c bench.h timing.h stats.h lib_udp.h $O/lmbench.a
	$(COMPILE) -o $O/bw_udp bw_udp.c $O/lmbench.a $(LDLIBS)

$O/bw_unix.s:bw_unix.c timing.h stats.h bench.h
$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/disk.s:disk.c flushdisk.c bench.h timing.h stats.h lib_tcp.h
$O/disk:  disk.c flushdisk.c bench.h timing.h stats.h lib_tcp.h $O/lmbench.a
	$(COMPILE) -o $O/disk disk.c $O/lmbench.a $(LDLIBS)

$O/clock.s:clock.c timing.h stats.h bench.h
$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.s:hello.c
$O/hello:  hello.c $O/lmbench.a
	$(COMPILE) -o $O/hello hello.c $O/lmbench.a $(LDLIBS)

$O/lat_alarm.s:lat_alarm.c timing.h stats.h bench.h
$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.s:lat_connect.c lib_tcp.c bench.h lib_tcp.h timing.h stats.h
$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_unix_connect.s:lat_unix_connect.c lib_tcp.c bench.h lib_tcp.h timing.h stats.h
$O/lat_unix_connect:  lat_unix_connect.c lib_tcp.c bench.h lib_tcp.h timing.h stats.h $O/lmbench.a
	$(COMPILE) -o $O/lat_unix_connect lat_unix_connect.c $O/lmbench.a $(LDLIBS)

$O/lat_fs.s:lat_fs.c timing.h stats.h bench.h
$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_fcntl.s:lat_fcntl.c timing.h stats.h bench.h
$O/lat_fcntl:  lat_fcntl.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_fcntl lat_fcntl.c $O/lmbench.a $(LDLIBS)

$O/lat_mem_rd.s:lat_mem_rd.c timing.h stats.h bench.h
$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.s:lat_mem_rd2.c timing.h stats.h bench.h
$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.s:lat_mem_wr.c timing.h stats.h bench.h
$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.s:lat_mem_wr2.c timing.h stats.h bench.h
$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.s:lat_mmap.c timing.h stats.h bench.h
$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.s:lat_mmaprd.c timing.h stats.h bench.h
$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_ops.s:lat_ops.c timing.h stats.h bench.h
$O/lat_ops:  lat_ops.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_ops lat_ops.c $O/lmbench.a $(LDLIBS)

$O/lat_pagefault.s:lat_pagefault.c timing.h stats.h bench.h
$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.s:lat_pipe.c timing.h stats.h bench.h
$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_fifo.s:lat_fifo.c timing.h stats.h bench.h
$O/lat_fifo:  lat_fifo.c timing.h stats.h bench.h $O/lmbench.a
	$(COMPILE) -o $O/lat_fifo lat_fifo.c $O/lmbench.a $(LDLIBS)

$O/lat_proc.s:lat_proc.c timing.h stats.h bench.h
$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.s:lat_rpc.c timing.h stats.h bench.h
$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.s:lat_sig.c timing.h stats.h bench.h
$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.s:lat_syscall.c timing.h stats.h bench.h
$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.s:  lat_select.c timing.h stats.h bench.h
$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.s:lat_tcp.c timing.h stats.h bench.h lib_tcp.h
$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.s:lat_udp.c timing.h stats.h bench.h lib_udp.h
$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.s:lat_unix.c timing.h stats.h bench.h
$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.s:lib_tcp.c bench.h lib_tcp.h
$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.s:lib_udp.c bench.h lib_udp.h
$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.s:lmdd.c timing.h stats.h bench.h
$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.s:enough.c timing.h stats.h bench.h
$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.s:loop_o.c timing.h stats.h bench.h
$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.s:timing_o.c timing.h stats.h bench.h
$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.s:memsize.c timing.h stats.h bench.h
$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.s:msleep.c timing.h stats.h bench.h
$O/msleep:  msleep.c timing.h stats.h bench.h 
	$(COMPILE) -o $O/msleep msleep.c

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

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

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

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

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

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

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

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

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

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

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

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

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