TEMPDIR="\"/tmp\""

#Change this to suit your installation
LCCDIR=/home/tawarien/bin/

BUILDDIR=./build
B=$(BUILDDIR)/
T=$(TSTDIR)/A=.a
E=
CC=cc
CFLAGS= -O2 -g -Wimplicit-function-declaration -DTEMPDIR=$(TEMPDIR) -DLCCDIR="\""$(LCCDIR)"\""
L=$(LCCDIR)/
LDFLAGS=-g
LD=$(CC)
AR=ar ruv
RANLIB=ranlib
DIFF=diff
RM=rm -f
TSTDIR=$(BUILDDIR)/tst
T=$(TSTDIR)/
HOSTFILE=etc/linux.c

what:
	-@echo make all scc lburg cpp lcc bprint liblcc triple clean clobber cpp

all::	scc lburg cpp lcc bprint liblcc cpp

cpp:	$Lcpp$E
scc:	$Lscc$E
lburg:	$Blburg$E
lcc:	$Llcc-ufo$E $Llcc-utsa$E $Llcc-mcore$E
bprint:	$Bbprint$E
liblcc:	$Bliblcc$A

RCCOBJS=$Balloc.o \
	$Bbind.o \
	$Bdag.o \
	$Bdagcheck.o \
	$Bdecl.o \
	$Benode.o \
	$Berror.o \
	$Bexpr.o \
	$Bevent.o \
	$Binit.o \
	$Binits.o \
	$Binput.o \
	$Blex.o \
	$Blist.o \
	$Bmain.o \
	$Boutput.o \
	$Bprof.o \
	$Bprofio.o \
	$Bsimp.o \
	$Bstmt.o \
	$Bstring.o \
	$Bsym.o \
	$Btrace.o \
	$Btree.o \
	$Btypes.o \
	$Bnull.o \
	$Bsymbolic.o \
	$Bemit.o \
	$Bblocks.o \
	$Bcollections.o \
	$Boptimise.o \
	$Bstack_gen.o \
	$Bx_stack.o \
	$Bcleanup.o \
	$Bverify.o \
	$Bflow.o \
	$Bgraph.o \
	$Bpairwise.o \
	$Bbailey.o \
	$Bglobal.o \
	$Bchains.o \
	$Bnodes.o \
	$Bdead.o \
	$Blabel.o \
	$Boptimist.o \
	$Butsa.o \
	$Bmcore.o \
	$Babstract.o \
	$Bufo.o \
    $Bsvg.o

$Lscc$E::	$Bmain.o $Blibscc$A $(EXTRAOBJS)
		$(LD) $(LDFLAGS) -o $@ $Bmain.o $(EXTRAOBJS) $Blibscc$A $(EXTRALIBS)

$Blibscc$A:	$(RCCOBJS)
		$(AR) $@ $(RCCOBJS); $(RANLIB) $@ || true

$(RCCOBJS):	src/common/c.h src/common/ops.h src/common/token.h

$Balloc.o:	src/front/alloc.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/alloc.c
$Bbind.o:	src/back/bind.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/back/bind.c
$Bdag.o:	src/front/dag.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/dag.c
$Bdecl.o:	src/front/decl.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/decl.c
$Benode.o:	src/front/enode.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/enode.c
$Berror.o:	src/front/error.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/error.c
$Bevent.o:	src/front/event.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/event.c
$Bexpr.o:	src/front/expr.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/expr.c
$Binit.o:	src/front/init.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/init.c
$Binits.o:	src/front/inits.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/inits.c
$Binput.o:	src/front/input.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/input.c
$Blex.o:	src/front/lex.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/lex.c
$Blist.o:	src/front/list.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/list.c
$Bmain.o:	src/front/main.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/main.c
$Bnull.o:	src/front/null.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/null.c
$Boutput.o:	src/front/output.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/output.c
$Bprof.o:	src/front/prof.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/prof.c
$Bprofio.o:	src/front/profio.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/profio.c
$Bsimp.o:	src/front/simp.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/simp.c
$Bstmt.o:	src/front/stmt.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/stmt.c
$Bstring.o:	src/front/string.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/string.c
$Bsym.o:	src/front/sym.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/sym.c
$Bsymbolic.o:	src/front/symbolic.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/symbolic.c
$Btrace.o:	src/front/trace.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/trace.c
$Btree.o:	src/front/tree.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/tree.c
$Btypes.o:	src/front/types.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ src/front/types.c
$Bflow.o:	src/back/flow.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/flow.c
$Bgraph.o:	src/back/graph.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/graph.c
$Bemit.o:	src/back/emit.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/emit.c
$Bsvg.o:	src/back/svg.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/svg.c
$Boptimise.o:	src/back/optimise.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/optimise.c
$Bblocks.o:	src/back/blocks.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/blocks.c
$Bcollections.o:	src/back/collections.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/collections.c
$Bstack_gen.o:	src/back/stack_gen.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/back/stack_gen.c
$Bx_stack.o:	src/back/x_stack.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -Isrc/optimise -o $@ src/back/x_stack.c
$Bcleanup.o:  src/optimise/cleanup.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/cleanup.c
$Bdead.o:  src/optimise/dead.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/dead.c
$Bverify.o:  src/optimise/verify.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/verify.c
$Bintra2.o:  src/optimise/intra2.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/intra2.c
$Blabel.o:  src/optimise/label.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/label.c
$Bintra3.o:  src/optimise/intra3.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/intra3.c
$Bpairwise.o:  src/optimise/pairwise.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/pairwise.c
$Bchains.o:  src/optimise/chains.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/chains.c
$Bnodes.o:  src/optimise/nodes.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/nodes.c
$Bbailey.o:  src/optimise/bailey.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/bailey.c
$Bglobal.o:  src/optimise/global.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/global.c
$Boptimist.o:  src/optimise/optimist.c;  $(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ src/optimise/optimist.c

$Bdagcheck.o:	$Bdagcheck.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ $Bdagcheck.c
$Bufo.o:	$Bufo.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ $Bufo.c
$Babstract.o:	$Babstract.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ $Babstract.c
$Butsa.o:	$Butsa.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ $Butsa.c
$Bmcore.o:	$Bmcore.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/back -o $@ $Bmcore.c

$Bdagcheck.c:	$Blburg$E src/front/dagcheck.md; $Blburg src/front/dagcheck.md $@
$Bufo.c:	$Blburg$E src/back/ufo.md;    $Blburg src/back/ufo.md    $@
$Babstract.c:	$Blburg$E src/back/abstract.md;    $Blburg src/back/abstract.md    $@
$Butsa.c:	$Blburg$E src/back/utsa_word_address.md;    $Blburg src/back/utsa_word_address.md    $@
$Bmcore.c:	$Blburg$E src/back/mcore.md;    $Blburg src/back/mcore.md    $@

$Bbprint$E:	$Bbprint.o;		$(LD) $(LDFLAGS) -o $@ $Bbprint.o
$Bops$E:	$Bops.o;		$(LD) $(LDFLAGS) -o $@ $Bops.o

$Bbprint.o:	etc/bprint.c src/front/profio.c;	$(CC) $(CFLAGS) -c -Isrc/common/ -Isrc/front/ -o $@ etc/bprint.c
$Bops.o:	etc/ops.c src/front/ops.h;		$(CC) $(CFLAGS) -c -Isrc/common/ -o $@ etc/ops.c

$Llcc-ufo$E:	$Blcc.o $Bhost-ufo.o;	$(LD) $(LDFLAGS) -o $@ $Blcc.o $Bhost-ufo.o

$Llcc-utsa$E:	$Blcc.o $Bhost-utsa.o;	$(LD) $(LDFLAGS) -o $@ $Blcc.o $Bhost-utsa.o

$Llcc-mcore$E:	$Blcc.o $Bhost-mcore.o;	$(LD) $(LDFLAGS) -o $@ $Blcc.o $Bhost-mcore.o

$Blcc.o:	etc/lcc.c;		$(CC) $(CFLAGS) -c -o $@ etc/lcc.c
$Bhost-ufo.o:	$(HOSTFILE);	$(CC) $(CFLAGS) -DTARGET=ufo -c -o $@ $(HOSTFILE)
$Bhost-utsa.o:	$(HOSTFILE);	$(CC) $(CFLAGS) -DTARGET=utsa -c -o $@ $(HOSTFILE)
$Bhost-mcore.o:	$(HOSTFILE);	$(CC) $(CFLAGS) -DTARGET=mcore -c -o $@ $(HOSTFILE)

LIBOBJS=$Bassert.o $Bbbexit.o $Byynull.o

$Bliblcc$A:	$(LIBOBJS);	$(AR) $@ $Bassert.o $Bbbexit.o $Byynull.o; $(RANLIB) $@ || true

$Bassert.o:	lib/assert.c;	$(CC) $(CFLAGS) -c -o $@ lib/assert.c
$Byynull.o:	lib/yynull.c;	$(CC) $(CFLAGS) -c -o $@ lib/yynull.c
$Bbbexit.o:	lib/bbexit.c;	$(CC) $(CFLAGS) -c -o $@ lib/bbexit.c

$Blburg$E:	$Blburg.o $Bgram.o;	$(LD) $(LDFLAGS) -o $@ $Blburg.o $Bgram.o

$Blburg.o $Bgram.o:	lburg/lburg.h

$Blburg.o:	lburg/lburg.c;	$(CC) $(CFLAGS) -c -Ilburg -o $@ lburg/lburg.c
$Bgram.o:	lburg/gram.c;	$(CC) $(CFLAGS) -c -Ilburg -o $@ lburg/gram.c

CPPOBJS=$Bcpp.o $Blexer.o $Bnlist.o $Btokens.o $Bmacro.o $Beval.o \
	$Binclude.o $Bhideset.o $Bgetopt.o $Bunix.o

$Lcpp$E:	$(CPPOBJS)
		$(LD) $(LDFLAGS) -o $@ $(CPPOBJS)

$(CPPOBJS):	cpp/cpp.h

$Bcpp.o:	cpp/cpp.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/cpp.c
$Blexer.o:	cpp/lex.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/lex.c
$Bnlist.o:	cpp/nlist.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/nlist.c
$Btokens.o:	cpp/tokens.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/tokens.c
$Bmacro.o:	cpp/macro.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/macro.c
$Beval.o:	cpp/eval.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/eval.c
$Binclude.o:	cpp/include.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/include.c
$Bhideset.o:	cpp/hideset.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/hideset.c
$Bgetopt.o:	cpp/getopt.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/getopt.c
$Bunix.o:	cpp/unix.c;	$(CC) $(CFLAGS) -c -Icpp -o $@ cpp/unix.c

test:	$T8q.s \
	$Tarray.s \
	$Tcf.s \
	$Tcq.s \
	$Tcvt.s \
	$Tfields.s \
	$Tfront.s \
	$Tincr.s \
	$Tinit.s \
	$Tlimits.s \
	$Tparanoia.s \
	$Tsort.s \
	$Tspill.s \
	$Tstdarg.s \
	$Tstruct.s \
	$Tswitch.s \
	$Twf1.s \
	$Tyacc.s

$T8q.s:	tst/8q.c tst/8q.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tarray.s:	tst/array.c tst/array.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tcf.s:	tst/cf.c tst/cf.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tcq.s:	tst/cq.c tst/cq.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tcvt.s:	tst/cvt.c tst/cvt.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tfields.s:	tst/fields.c tst/fields.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tfront.s:	tst/front.c tst/front.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tincr.s:	tst/incr.c tst/incr.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tinit.s:	tst/init.c tst/init.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tlimits.s:	tst/limits.c tst/limits.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tparanoia.s:	tst/paranoia.c tst/paranoia.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tsort.s:	tst/sort.c tst/sort.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tspill.s:	tst/spill.c tst/spill.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tstdarg.s:	tst/stdarg.c tst/stdarg.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tstruct.s:	tst/struct.c tst/struct.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tswitch.s:	tst/switch.c tst/switch.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Twf1.s:	tst/wf1.c tst/wf1.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@
$Tyacc.s:	tst/yacc.c tst/yacc.0 all;	@env BUILDDIR=$(BUILDDIR) TSTDIR=$(TSTDIR) src/front/run.sh $@

testclean:
	$(RM) $T8q$E $T8q.s $T8q.2 $T8q.1
	$(RM) $Tarray$E $Tarray.s $Tarray.2 $Tarray.1
	$(RM) $Tcf$E $Tcf.s $Tcf.2 $Tcf.1
	$(RM) $Tcq$E $Tcq.s $Tcq.2 $Tcq.1
	$(RM) $Tcvt$E $Tcvt.s $Tcvt.2 $Tcvt.1
	$(RM) $Tfields$E $Tfields.s $Tfields.2 $Tfields.1
	$(RM) $Tfront$E $Tfront.s $Tfront.2 $Tfront.1
	$(RM) $Tincr$E $Tincr.s $Tincr.2 $Tincr.1
	$(RM) $Tinit$E $Tinit.s $Tinit.2 $Tinit.1
	$(RM) $Tlimits$E $Tlimits.s $Tlimits.2 $Tlimits.1
	$(RM) $Tparanoia$E $Tparanoia.s $Tparanoia.2 $Tparanoia.1
	$(RM) $Tsort$E $Tsort.s $Tsort.2 $Tsort.1
	$(RM) $Tspill$E $Tspill.s $Tspill.2 $Tspill.1
	$(RM) $Tstdarg$E $Tstdarg.s $Tstdarg.2 $Tstdarg.1
	$(RM) $Tstruct$E $Tstruct.s $Tstruct.2 $Tstruct.1
	$(RM) $Tswitch$E $Tswitch.s $Tswitch.2 $Tswitch.1
	$(RM) $Twf1$E $Twf1.s $Twf1.2 $Twf1.1
	$(RM) $Tyacc$E $Tyacc.s $Tyacc.2 $Tyacc.1

clean::		testclean
		$(RM) $B*.o
		$(RM) $Bdagcheck.c $Balpha.c $Bmips.c $Bx86.c $Bsparc.c $Bx86linux.c $Bstack.c
		$(RM) $Bscc1$E $Bscc1$E $B1scc$E $B2scc$E
		$(RM) $B*.ilk

clobber::	clean
		$(RM) $Bscc$E $Blburg$E $Bcpp$E $Blcc$E $Bcp$E $Bbprint$E $B*$A
		$(RM) $B*.pdb $B*.pch

RCCSRCS=src/front/alloc.c \
	src/front/bind.c \
	src/front/dag.c \
	src/front/decl.c \
	src/front/enode.c \
	src/front/error.c \
	src/front/expr.c \
	src/front/event.c \
	src/front/init.c \
	src/front/inits.c \
	src/front/input.c \
	src/front/lex.c \
	src/front/list.c \
	src/front/main.c \
	src/front/output.c \
	src/front/prof.c \
	src/front/profio.c \
	src/front/simp.c \
	src/front/stmt.c \
	src/front/string.c \
	src/front/sym.c \
	src/front/trace.c \
	src/front/tree.c \
	src/front/types.c \
	src/front/null.c \
	src/front/symbolic.c \
	src/front/bytecode.c \
	src/front/svg.c \
	src/front/optimise.c \
	src/front/gen.c \
	src/front/stab.c \
	$Bdagcheck.c \
	$Butsa.c \
	$Bmcore.c \
	$Bufo.c \
	$Babstract.c

LCC=/usr/marks/bin/lcc-ufo -Isrc/common/ -Iufo/include -I/src/back -I/src/optimise
triple:	$B2scc$E
	strip $B1scc$E $B2scc$E
	dd if=$B1scc$E of=$Bscc1$E bs=512 skip=1
	dd if=$B2scc$E of=$Bscc2$E bs=512 skip=1
	if cmp $Bscc1$E $Bscc2$E; then \
		mv $B2scc$E $Bscc$E; \
		$(RM) $B1scc$E $Bscc[12]$E; fi

$B1scc$E:
		$(LCC) -o $@  $(RCCSRCS)

$B2scc$E:	$B1scc$E
		$(LCC) -o $@ $(RCCSRCS)