# $Header$
EMHOME =	../../..
INSTALL =	$(EMHOME)/modules/install
COMPARE =	$(EMHOME)/modules/compare
LINT	=	lint
BINDIR	=	$(EMHOME)/lib

# set HOWMUCH to head -20 to limit number of patterns used
#HOWMUCH =	head -20
HOWMUCH	=	cat

LEXLIB =	-ll
INCLDIR	=	-I$(EMHOME)/h -I$(EMHOME)/modules/h -I$(EMHOME)/modules/pkg
PREFLAGS =	$(INCLDIR) -DPRIVATE=static#	 -DDEBUG

# Enable the next line to produce a version that output's the line number
# from the patterns file each time an optimization is performed.
#PREFLAGS =	$(PREFLAGS) -DSTATS

PROFFLAG =	-O
CFLAGS =	$(PREFLAGS) $(PROFFLAG) $(COPT)
LINTFLAGS =	$(PREFLAGS) -DNORCSID
LLOPT =
CMD =		'$(CC) -c $(CFLAGS)'
AR = ar
SUF = o
LIBSUF = a

LIBOPT =	libemopt.$(LIBSUF)
LIBCEOPT =	libCEopt.$(LIBSUF)

.SUFFIXES:	.d .r

.r.d:		; CMD=$(CMD); export CMD; awk -f makefuns.awk $*.r | sh -x
		touch $@

.SUFFIXES: .$(SUF)
.c.$(SUF):
	$(CC) -c $(CFLAGS) $*.c

CSRC =		main.c nopt.c mkstrct.c aux.c outputdfa.c outcalls.c\
		findworst.c initlex.c

SRCS =		Makefile nopt.h parser.h parser.g syntax.l pseudo.r\
		patterns $(CSRC)

NOFILES =	nopt.$(SUF) dfa.$(SUF) trans.$(SUF) aux.$(SUF) mkstrct.$(SUF)

POFILES =	parser.$(SUF) syntax.$(SUF) outputdfa.$(SUF) outcalls.$(SUF) findworst.$(SUF)\
		initlex.$(SUF) Lpars.$(SUF)

GENFILES =	Lpars.h Lpars.c parserdummy parser.c syntax.c \
		dfa.c dfa.c.new trans.c trans.c.new\
		incalls.d incalls.r incalls.r.new pseudo.d

all:		em_nopt $(LIBOPT) $(LIBCEOPT) em_opt.3

install:	all
		$(INSTALL) lib/$(LIBOPT)
		$(INSTALL) lib/$(LIBCEOPT)
		$(INSTALL) man/em_opt.3
		cp em_nopt.6 $(EMHOME)/man
		cp em_nopt $(BINDIR)/em_nopt

cmp:		all
		-$(COMPARE) lib/$(LIBOPT)
		-$(COMPARE) lib/$(LIBCEOPT)
		-$(COMPARE) man/em_opt.3
		-cmp em_nopt $(BINDIR)/em_nopt

pr:
		@pr $(SRCS)

opr:
		make pr | opr

lint:		lintparser lintnopt

clean:
		rm -f O_*.$(SUF)
		rm -f O_*.c
		rm -f $(NOFILES) main.$(SUF) $(POFILES)
		rm -f $(GENFILES) parser em_nopt $(LIBOPT) $(LIBCEOPT)

# How to build stand alone version of the optimizer

NOPTLIB = 	$(EMHOME)/modules/lib/libread_emk.$(LIBSUF)\
		$(EMHOME)/modules/lib/libemk.$(LIBSUF)\
		$(EMHOME)/modules/lib/liballoc.$(LIBSUF)\
		$(EMHOME)/modules/lib/malloc.$(SUF)\
		$(EMHOME)/modules/lib/libprint.$(LIBSUF)\
		$(EMHOME)/modules/lib/libstring.$(LIBSUF)\
		$(EMHOME)/modules/lib/libsystem.$(LIBSUF)\
		$(EMHOME)/lib/em_data.$(LIBSUF)

em_nopt:	incalls.r main.$(SUF) $(NOFILES)
		$(CC) -o em_nopt main.$(SUF) $(NOFILES) $(NOPTLIB)

OLINT =		main.c mkstrct.c nopt.c aux.c dfa.c trans.c

OLINTLIB = 	$(EMHOME)/modules/lib/llib-lread_emkV.ln\
		$(EMHOME)/modules/lib/llib-lemk.ln\
		$(EMHOME)/modules/lib/llib-lsystem.ln\
		$(EMHOME)/modules/lib/llib-lalloc.ln\
		$(EMHOME)/modules/lib/llib-lprint.ln\
		$(EMHOME)/modules/lib/llib-lstring.ln

lintnopt:	incalls.r $(OLINT)
		$(LINT) $(LINTFLAGS) $(OLINT) $(OLINTLIB)

# How to build the library version of the optimizer

$(LIBOPT):	$(NOFILES) pseudo.d incalls.d
		rm -f $(LIBOPT)
		ar rc $(LIBOPT) O_*.$(SUF) $(NOFILES)
		-sh -c 'ranlib $(LIBOPT)'

$(LIBCEOPT):	incalls.r
		rm -f O_*.$(SUF) $(NOFILES) pseudo.d incalls.d
		-mv $(LIBOPT) $(LIBOPT).saved
		make "EMHOME="$(EMHOME) PREFLAGS='$(INCLDIR) -DPRIVATE=static -DCODE_EXPANDER' $(LIBOPT)
		mv $(LIBOPT) $(LIBCEOPT)
		-mv $(LIBOPT).saved $(LIBOPT)
		rm -f O_*.$(SUF) $(NOFILES)

incalls.r:	patterns parser
		-$(EMHOME)/lib/cpp patterns | $(HOWMUCH) >/tmp/patts
		parser </tmp/patts
		-rm /tmp/patts

# How to build the lint library for the optimizer

LLINT =		nopt.c mkstrct.c aux.c dfa.c trans.c

lintlib:	incalls.r $(LLINT)
		$(LINT) $(LINTFLAGS) $(LLINT) -Cemopt
		mv llib-lemopt.ln $(EMHOME)/modules/lib

# How to build program to parse patterns table and build c files.

PARSERLIB =	$(EMHOME)/lib/em_data.$(LIBSUF)\
		$(EMHOME)/modules/lib/liballoc.$(LIBSUF)\
		$(EMHOME)/modules/lib/libstring.$(LIBSUF)\
		$(EMHOME)/modules/lib/libsystem.$(LIBSUF)

parser:		parserdummy $(POFILES) $(PARSERLIB)
		$(CC) -o parser $(LDFLAGS) $(POFILES) $(PARSERLIB) $(LEXLIB)

parserdummy:	parser.g
		LLgen $(LLOPT) parser.g
		touch parserdummy

PLINT =		parser.c syntax.c outputdfa.c outcalls.c\
		findworst.c initlex.c Lpars.c

PLINTLIB =	$(EMHOME)/modules/lib/llib-lalloc.ln\
		$(EMHOME)/modules/lib/llib-lstring.ln\
		$(EMHOME)/modules/lib/llib-lsystem.ln

lintparser:	parserdummy $(PLINT)
		$(LINT) $(LINTFLAGS) $(PLINT) $(PLINTLIB)

# Dependancies

main.$(SUF):		nopt.h
nopt.$(SUF):		nopt.h
mkstrct.$(SUF):	nopt.h
aux.$(SUF):		nopt.h
pseudo.d:	nopt.h makefuns.awk
dfa.$(SUF):		nopt.h
trans.$(SUF):	nopt.h
incalls.d:	nopt.h makefuns.awk

parser.$(SUF):	Lpars.h parser.h
Lpars.$(SUF):	Lpars.h
syntax.$(SUF):	syntax.l parser.h Lpars.h
outputdfa.$(SUF):	parser.h Lpars.h
outcalls.$(SUF):	parser.h
findworst.$(SUF):	parser.h
initlex.$(SUF):	parser.h
