# $Header$

#PARAMS		do not remove this line!

SRC_DIR = $(SRC_HOME)/util/opt

CFILES=	$(SRC_DIR)/main.c $(SRC_DIR)/getline.c $(SRC_DIR)/lookup.c \
	$(SRC_DIR)/var.c $(SRC_DIR)/process.c $(SRC_DIR)/backward.c \
	$(SRC_DIR)/util.c $(SRC_DIR)/alloc.c $(SRC_DIR)/putline.c \
	$(SRC_DIR)/cleanup.c $(SRC_DIR)/peephole.c $(SRC_DIR)/flow.c \
	$(SRC_DIR)/reg.c $(SRC_DIR)/tes.c pop_push.c

OFILES=	main.$(SUF) getline.$(SUF) lookup.$(SUF) var.$(SUF) process.$(SUF) backward.$(SUF) util.$(SUF)\
	alloc.$(SUF) putline.$(SUF) cleanup.$(SUF) peephole.$(SUF) flow.$(SUF) tes.$(SUF) pop_push.$(SUF)
ONOGLOB=regnoglob.$(SUF)
OGLOB=regglob.$(SUF)

LIBS=	$(TARGET_HOME)/lib.bin/em_data.$(LIBSUF)
ULIBS=	$(UTIL_HOME)/lib.bin/em_data.$(ULIBSUF)
INCLUDES=-I$(TARGET_HOME)/h -I$(SRC_DIR) -I.
UINCLUDES=-I$(TARGET_HOME)/h -I$(SRC_DIR) -I.
CFLAGS= -DNDEBUG $(INCLUDES) $(COPTIONS)
UCFLAGS= -DNDEBUG $(INCLUDES) $(UCOPTIONS)
LDFLAGS=$(LDOPTIONS)
ULDFLAGS=$(ULDOPTIONS)
LINTFLAGS=$(INCLUDES) -DNDEBUG -DNORCSID $(LINTOPTIONS)
CPP=$(UTIL_HOME)/lib.bin/cpp

all:	opt opt2

opt:	$(OFILES) $(ONOGLOB) pattern.$(SUF) $(LIBS)
	$(CC) $(LDFLAGS) $(CFLAGS) $(OFILES) $(ONOGLOB) pattern.$(SUF) $(LIBS) -o opt

opt2:	$(OFILES) $(OGLOB) pattern.$(SUF) $(LIBS)
	$(CC) $(LDFLAGS) $(CFLAGS) $(OFILES) $(OGLOB) pattern.$(SUF) $(LIBS) -o opt2

test:	opt testopt
	testopt

cmp:	all
	-cmp opt $(TARGET_HOMTARGET_HOME)/lib.bin/em_opt
	-cmp opt2 $(TARGET_HOME)/lib.bin/em_opt2

install:all
	cp opt $(TARGET_HOME)/lib.bin/em_opt
	cp opt2 $(TARGET_HOME)/lib.bin/em_opt2
	if [ $(DO_MACHINE_INDEP) = y ] ; \
	then	mk_manpage $(SRC_DIR)/em_opt.6 $(TARGET_HOME) ; \
	fi

pattern.c:	$(SRC_DIR)/patterns mktab
	$(CPP) $(SRC_DIR)/patterns | mktab > pattern.c

mktab:	mktab.$(USUF) $(ULIBS)
	$(UCC) $(ULDFLAGS) mktab.$(USUF) $(ULIBS) -o mktab

mktab.$(USUF):	scan.c $(SRC_DIR)/optim.h $(SRC_DIR)/param.h $(SRC_DIR)/pattern.h $(SRC_DIR)/types.h mktab.c
	$(UCC) -c $(UCFLAGS) mktab.c

mktab.c:	$(SRC_DIR)/mktab.y
	yacc $(SRC_DIR)/mktab.y && mv y.tab.c mktab.c

pop_push.c: $(SRC_HOME)/etc/em_table $(SRC_DIR)/pop_push.awk
	awk -f $(SRC_DIR)/pop_push.awk < $(SRC_HOME)/etc/em_table > pop_push.c

regglob.c:	$(SRC_DIR)/reg.c
	echo '#define GLOBAL_OPT' > regglob.c
	cat $(SRC_DIR)/reg.c >> regglob.c

regnoglob.c:	$(SRC_DIR)/reg.c
	cp $(SRC_DIR)/reg.c regnoglob.c

depend: pattern.c pop_push.c regglob.c regnoglob.c
	rm_deps Makefile >Makefile.new
	for i in $(CFILES) pattern.c regglob.c regnoglob.c ; do \
		echo "`basename $$i .c`.$$(SUF):	$$i" >> Makefile.new ; \
		echo '	$$(CC) -c $$(CFLAGS)' $$i >> Makefile.new ; \
		$(UTIL_HOME)/lib.bin/cpp -d $(INCLUDES) $$i | sed "s/^/`basename $$i .c`.$$(SUF):	/" >> Makefile.new ; \
	done
	mv Makefile Makefile.old
	mv Makefile.new Makefile

lint:	$(CFILES) pattern.c
	$(LINT) $(LINTFLAGS) $(CFILES) pattern.c $(UTIL_HOME)/lib.bin/$(LINTPREF)em_data.$(LINTSUF)

opr:
	make pr | opr

pr:
	@pr -n $(SRC_DIR)/proto.make $(SRC_DIR)/*.h $(CFILES) $(SRC_DIR)/mktab.y $(SRC_DIR)/scan.l $(SRC_DIR)/patterns

clean:
	rm -f *.$(SUF) opt mktab mktab.c scan.c pattern.c opt2 Out \
		pop_push.c regglob.c regnoglob.c *.old

scan.c:	$(SRC_DIR)/scan.l
	flex -st $(SRC_DIR)/scan.l > scan.c

# the next lines are generated automatically
#DEPENDENCIES
main.$(SUF):	$(SRC_DIR)/main.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/main.c
main.$(SUF):	$(SRC_DIR)/ext.h
main.$(SUF):	$(TARGET_HOME)/h/em_spec.h
main.$(SUF):	$(SRC_DIR)/alloc.h
main.$(SUF):	$(SRC_DIR)/tes.h
main.$(SUF):	$(SRC_DIR)/types.h
main.$(SUF):	$(SRC_DIR)/param.h
getline.$(SUF):	$(SRC_DIR)/getline.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/getline.c
getline.$(SUF):	$(SRC_DIR)/ext.h
getline.$(SUF):	$(TARGET_HOME)/h/em_mes.h
getline.$(SUF):	$(TARGET_HOME)/h/em_flag.h
getline.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
getline.$(SUF):	$(TARGET_HOME)/h/em_spec.h
getline.$(SUF):	$(SRC_DIR)/proinf.h
getline.$(SUF):	$(SRC_DIR)/alloc.h
getline.$(SUF):	$(SRC_DIR)/lookup.h
getline.$(SUF):	$(SRC_DIR)/line.h
getline.$(SUF):	$(SRC_DIR)/tes.h
getline.$(SUF):	$(SRC_DIR)/types.h
getline.$(SUF):	$(SRC_DIR)/param.h
lookup.$(SUF):	$(SRC_DIR)/lookup.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/lookup.c
lookup.$(SUF):	$(SRC_DIR)/proinf.h
lookup.$(SUF):	$(SRC_DIR)/alloc.h
lookup.$(SUF):	$(SRC_DIR)/lookup.h
lookup.$(SUF):	$(SRC_DIR)/tes.h
lookup.$(SUF):	$(SRC_DIR)/types.h
lookup.$(SUF):	$(SRC_DIR)/param.h
var.$(SUF):	$(SRC_DIR)/var.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/var.c
var.$(SUF):	$(SRC_DIR)/proinf.h
var.$(SUF):	$(SRC_DIR)/lookup.h
var.$(SUF):	$(SRC_DIR)/tes.h
var.$(SUF):	$(SRC_DIR)/types.h
var.$(SUF):	$(SRC_DIR)/param.h
process.$(SUF):	$(SRC_DIR)/process.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/process.c
process.$(SUF):	$(SRC_DIR)/ext.h
process.$(SUF):	$(SRC_DIR)/proinf.h
process.$(SUF):	$(SRC_DIR)/lookup.h
process.$(SUF):	$(SRC_DIR)/line.h
process.$(SUF):	$(SRC_DIR)/alloc.h
process.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
process.$(SUF):	$(TARGET_HOME)/h/em_spec.h
process.$(SUF):	$(SRC_DIR)/assert.h
process.$(SUF):	$(SRC_DIR)/tes.h
process.$(SUF):	$(SRC_DIR)/types.h
process.$(SUF):	$(SRC_DIR)/param.h
backward.$(SUF):	$(SRC_DIR)/backward.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/backward.c
backward.$(SUF):	$(SRC_DIR)/ext.h
backward.$(SUF):	$(TARGET_HOME)/h/em_mes.h
backward.$(SUF):	$(TARGET_HOME)/h/em_mnem.h
backward.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
backward.$(SUF):	$(TARGET_HOME)/h/em_spec.h
backward.$(SUF):	$(SRC_DIR)/proinf.h
backward.$(SUF):	$(SRC_DIR)/alloc.h
backward.$(SUF):	$(SRC_DIR)/lookup.h
backward.$(SUF):	$(SRC_DIR)/line.h
backward.$(SUF):	$(SRC_DIR)/assert.h
backward.$(SUF):	$(SRC_DIR)/tes.h
backward.$(SUF):	$(SRC_DIR)/types.h
backward.$(SUF):	$(SRC_DIR)/param.h
util.$(SUF):	$(SRC_DIR)/util.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/util.c
util.$(SUF):	$(SRC_DIR)/ext.h
util.$(SUF):	$(SRC_DIR)/optim.h
util.$(SUF):	$(SRC_DIR)/proinf.h
util.$(SUF):	$(SRC_DIR)/lookup.h
util.$(SUF):	$(SRC_DIR)/assert.h
util.$(SUF):	$(SRC_DIR)/tes.h
util.$(SUF):	$(SRC_DIR)/types.h
util.$(SUF):	$(SRC_DIR)/param.h
alloc.$(SUF):	$(SRC_DIR)/alloc.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/alloc.c
alloc.$(SUF):	$(SRC_DIR)/proinf.h
alloc.$(SUF):	$(SRC_DIR)/lookup.h
alloc.$(SUF):	$(SRC_DIR)/line.h
alloc.$(SUF):	$(SRC_DIR)/alloc.h
alloc.$(SUF):	$(SRC_DIR)/assert.h
alloc.$(SUF):	$(SRC_DIR)/tes.h
alloc.$(SUF):	$(SRC_DIR)/types.h
alloc.$(SUF):	$(SRC_DIR)/param.h
putline.$(SUF):	$(SRC_DIR)/putline.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/putline.c
putline.$(SUF):	$(SRC_DIR)/ext.h
putline.$(SUF):	$(SRC_DIR)/optim.h
putline.$(SUF):	$(SRC_DIR)/proinf.h
putline.$(SUF):	$(SRC_DIR)/lookup.h
putline.$(SUF):	$(SRC_DIR)/line.h
putline.$(SUF):	$(SRC_DIR)/alloc.h
putline.$(SUF):	$(TARGET_HOME)/h/em_flag.h
putline.$(SUF):	$(TARGET_HOME)/h/em_mnem.h
putline.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
putline.$(SUF):	$(TARGET_HOME)/h/em_spec.h
putline.$(SUF):	$(SRC_DIR)/assert.h
putline.$(SUF):	$(SRC_DIR)/tes.h
putline.$(SUF):	$(SRC_DIR)/types.h
putline.$(SUF):	$(SRC_DIR)/param.h
cleanup.$(SUF):	$(SRC_DIR)/cleanup.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/cleanup.c
cleanup.$(SUF):	$(SRC_DIR)/ext.h
cleanup.$(SUF):	$(SRC_DIR)/lookup.h
cleanup.$(SUF):	$(TARGET_HOME)/h/em_mes.h
cleanup.$(SUF):	$(TARGET_HOME)/h/em_spec.h
cleanup.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
cleanup.$(SUF):	$(SRC_DIR)/assert.h
cleanup.$(SUF):	$(SRC_DIR)/types.h
cleanup.$(SUF):	$(SRC_DIR)/param.h
peephole.$(SUF):	$(SRC_DIR)/peephole.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/peephole.c
peephole.$(SUF):	$(SRC_DIR)/ext.h
peephole.$(SUF):	$(SRC_DIR)/optim.h
peephole.$(SUF):	$(TARGET_HOME)/h/em_mnem.h
peephole.$(SUF):	$(TARGET_HOME)/h/em_spec.h
peephole.$(SUF):	$(SRC_DIR)/pattern.h
peephole.$(SUF):	$(SRC_DIR)/alloc.h
peephole.$(SUF):	$(SRC_DIR)/proinf.h
peephole.$(SUF):	$(SRC_DIR)/lookup.h
peephole.$(SUF):	$(SRC_DIR)/line.h
peephole.$(SUF):	$(SRC_DIR)/assert.h
peephole.$(SUF):	$(SRC_DIR)/tes.h
peephole.$(SUF):	$(SRC_DIR)/types.h
peephole.$(SUF):	$(SRC_DIR)/param.h
flow.$(SUF):	$(SRC_DIR)/flow.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/flow.c
flow.$(SUF):	$(SRC_DIR)/ext.h
flow.$(SUF):	$(SRC_DIR)/optim.h
flow.$(SUF):	$(SRC_DIR)/proinf.h
flow.$(SUF):	$(SRC_DIR)/line.h
flow.$(SUF):	$(SRC_DIR)/alloc.h
flow.$(SUF):	$(TARGET_HOME)/h/em_mnem.h
flow.$(SUF):	$(TARGET_HOME)/h/em_spec.h
flow.$(SUF):	$(TARGET_HOME)/h/em_flag.h
flow.$(SUF):	$(SRC_DIR)/tes.h
flow.$(SUF):	$(SRC_DIR)/types.h
flow.$(SUF):	$(SRC_DIR)/param.h
reg.$(SUF):	$(SRC_DIR)/reg.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/reg.c
reg.$(SUF):	$(SRC_DIR)/ext.h
reg.$(SUF):	$(TARGET_HOME)/h/em_mes.h
reg.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
reg.$(SUF):	$(TARGET_HOME)/h/em_spec.h
reg.$(SUF):	$(SRC_DIR)/alloc.h
reg.$(SUF):	$(SRC_DIR)/proinf.h
reg.$(SUF):	$(SRC_DIR)/tes.h
reg.$(SUF):	$(SRC_DIR)/line.h
reg.$(SUF):	$(SRC_DIR)/types.h
reg.$(SUF):	$(SRC_DIR)/param.h
reg.$(SUF):	$(SRC_DIR)/assert.h
tes.$(SUF):	$(SRC_DIR)/tes.c
	$(CC) -c $(CFLAGS) $(SRC_DIR)/tes.c
tes.$(SUF):	$(SRC_DIR)/pop_push.h
tes.$(SUF):	$(SRC_DIR)/ext.h
tes.$(SUF):	$(SRC_DIR)/line.h
tes.$(SUF):	$(SRC_DIR)/proinf.h
tes.$(SUF):	$(SRC_DIR)/alloc.h
tes.$(SUF):	$(SRC_DIR)/tes.h
tes.$(SUF):	$(SRC_DIR)/types.h
tes.$(SUF):	$(SRC_DIR)/assert.h
tes.$(SUF):	$(SRC_DIR)/param.h
tes.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
tes.$(SUF):	$(TARGET_HOME)/h/em_mnem.h
tes.$(SUF):	$(TARGET_HOME)/h/em_spec.h
pop_push.$(SUF):	pop_push.c
	$(CC) -c $(CFLAGS) pop_push.c
pop_push.$(SUF):	$(SRC_DIR)/pop_push.h
pattern.$(SUF):	pattern.c
	$(CC) -c $(CFLAGS) pattern.c
pattern.$(SUF):	$(SRC_DIR)/pattern.h
pattern.$(SUF):	$(SRC_DIR)/types.h
pattern.$(SUF):	$(SRC_DIR)/param.h
regglob.$(SUF):	regglob.c
	$(CC) -c $(CFLAGS) regglob.c
regglob.$(SUF):	$(SRC_DIR)/ext.h
regglob.$(SUF):	$(TARGET_HOME)/h/em_mes.h
regglob.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
regglob.$(SUF):	$(TARGET_HOME)/h/em_spec.h
regglob.$(SUF):	$(SRC_DIR)/alloc.h
regglob.$(SUF):	$(SRC_DIR)/proinf.h
regglob.$(SUF):	$(SRC_DIR)/tes.h
regglob.$(SUF):	$(SRC_DIR)/line.h
regglob.$(SUF):	$(SRC_DIR)/types.h
regglob.$(SUF):	$(SRC_DIR)/param.h
regglob.$(SUF):	$(SRC_DIR)/assert.h
regnoglob.$(SUF):	regnoglob.c
	$(CC) -c $(CFLAGS) regnoglob.c
regnoglob.$(SUF):	$(SRC_DIR)/ext.h
regnoglob.$(SUF):	$(TARGET_HOME)/h/em_mes.h
regnoglob.$(SUF):	$(TARGET_HOME)/h/em_pseu.h
regnoglob.$(SUF):	$(TARGET_HOME)/h/em_spec.h
regnoglob.$(SUF):	$(SRC_DIR)/alloc.h
regnoglob.$(SUF):	$(SRC_DIR)/proinf.h
regnoglob.$(SUF):	$(SRC_DIR)/tes.h
regnoglob.$(SUF):	$(SRC_DIR)/line.h
regnoglob.$(SUF):	$(SRC_DIR)/types.h
regnoglob.$(SUF):	$(SRC_DIR)/param.h
regnoglob.$(SUF):	$(SRC_DIR)/assert.h