# Makefile for RISC OS
# Adapted from LCC for Unix makefile by Reuben Thomas

# Options for compilation with gcc
CC=gcc
CFLAGS=$(UCFLAGS) -mlibscl  -D__UNAME 
LDFLAGS=-mlibscl
UCFLAGS= -fomit-frame-pointer -mno-poke-function-name 
LBCFLAGS=$(CFLAGS)
LBLDFLAGS=$(LDFLAGS)
BUILDDIR=.
BINDIR=../bin

# Options for compilation with lcc
CC=lcc
CFLAGS=-D__UNAME
LDFLAGS=
UCFLAGS=-Bunix
ULDFLAGS=-Bunix
LBCFLAGS=$(UCFLAGS)
LBLDFLAGS=$(ULDFLAGS)
BUILDDIR=build
BINDIR=../bin2

HOSTFILE=etc/arm/riscos.c

all:	rcc lburg cpp lcc bprint liblcc

rcc:		$(BINDIR)/rcc
lburg:		$(BINDIR)/lburg
cpp:		$(BINDIR)/cpp
lcc:		$(BINDIR)/lcc
bprint:		$(BINDIR)/bprint
liblcc:		$(BINDIR)/../liblcc.o

.PHONY: rcc lburg cpp lcc bprint liblcc


# rcc

RCCOBJS=$(BUILDDIR)/alloc.o \
	$(BUILDDIR)/bind.o \
	$(BUILDDIR)/dag.o \
	$(BUILDDIR)/decl.o \
	$(BUILDDIR)/enode.o \
	$(BUILDDIR)/error.o \
	$(BUILDDIR)/expr.o \
	$(BUILDDIR)/event.o \
	$(BUILDDIR)/init.o \
	$(BUILDDIR)/inits.o \
	$(BUILDDIR)/input.o \
	$(BUILDDIR)/lex.o \
	$(BUILDDIR)/list.o \
	$(BUILDDIR)/main.o \
	$(BUILDDIR)/output.o \
	$(BUILDDIR)/prof.o \
	$(BUILDDIR)/profio.o \
	$(BUILDDIR)/simp.o \
	$(BUILDDIR)/stmt.o \
	$(BUILDDIR)/string.o \
	$(BUILDDIR)/sym.o \
	$(BUILDDIR)/trace.o \
	$(BUILDDIR)/tree.o \
	$(BUILDDIR)/types.o \
	$(BUILDDIR)/gen.o \
	$(BUILDDIR)/arm.o \

$(BINDIR)/rcc:	$(RCCOBJS)
	$(CC) -o $@ $(LDFLAGS) $(RCCOBJS)

$(RCCOBJS):	src/c.h src/token.h src/config.h

$(BUILDDIR)/alloc.o:	src/alloc.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/alloc.c
$(BUILDDIR)/bind.o:	src/bind.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/bind.c
$(BUILDDIR)/dag.o:	src/dag.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/dag.c
$(BUILDDIR)/decl.o:	src/decl.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/decl.c
$(BUILDDIR)/enode.o:	src/enode.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/enode.c
$(BUILDDIR)/error.o:	src/error.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/error.c
$(BUILDDIR)/event.o:	src/event.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/event.c
$(BUILDDIR)/expr.o:	src/expr.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/expr.c
$(BUILDDIR)/gen.o:	src/gen.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/gen.c
$(BUILDDIR)/init.o:	src/init.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/init.c
$(BUILDDIR)/inits.o:	src/inits.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/inits.c
$(BUILDDIR)/input.o:	src/input.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/input.c
$(BUILDDIR)/lex.o:	src/lex.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/lex.c
$(BUILDDIR)/list.o:	src/list.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/list.c
$(BUILDDIR)/main.o:	src/main.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/main.c
$(BUILDDIR)/output.o:	src/output.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/output.c
$(BUILDDIR)/prof.o:	src/prof.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/prof.c
$(BUILDDIR)/profio.o:	src/profio.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/profio.c
$(BUILDDIR)/simp.o:	src/simp.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/simp.c
$(BUILDDIR)/stmt.o:	src/stmt.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/stmt.c
$(BUILDDIR)/string.o:	src/string.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/string.c
$(BUILDDIR)/sym.o:	src/sym.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/sym.c
$(BUILDDIR)/trace.o:	src/trace.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/trace.c
$(BUILDDIR)/tree.o:	src/tree.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/tree.c
$(BUILDDIR)/types.o:	src/types.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/types.c

$(BUILDDIR)/arm.o:	src/arm.c
	$(CC) -c $(CFLAGS) -Isrc -o $@ src/arm.c

src/arm.c:		$(BINDIR)/lburg src/arm.md
	lburg src/arm.md src/arm.c


# lburg

$(BINDIR)/lburg:	$(BUILDDIR)/lburg.o $(BUILDDIR)/gram.o
	$(CC) -Ilburg -o $@ $(LBLDFLAGS) $(BUILDDIR)/lburg.o $(BUILDDIR)/gram.o

$(BUILDDIR)/lburg.o:	lburg/lburg.c lburg/lburg.h
	$(CC) -c $(LBCFLAGS) $(CFLAGS) -Ilburg -o $@ lburg/lburg.c
$(BUILDDIR)/gram.o:	lburg/gram.c lburg/lburg.h
	$(CC) -c $(LBCFLAGS) $(CFLAGS) -Ilburg -o $@ lburg/gram.c
lburg/gram.c:		lburg/gram.y
	bison -o $@ lburg/gram.y


# cpp

CPPOBJS=$(BUILDDIR)/cpp.o \
	$(BUILDDIR)/lexer.o \
	$(BUILDDIR)/nlist.o \
	$(BUILDDIR)/tokens.o \
	$(BUILDDIR)/macro.o \
	$(BUILDDIR)/eval.o \
	$(BUILDDIR)/include.o \
	$(BUILDDIR)/hideset.o \
	$(BUILDDIR)/unix.o \
	$(BUILDDIR)/getopt.o

$(BINDIR)/cpp:	$(CPPOBJS)
			$(CC) $(ULDFLAGS) -o $@ $(CPPOBJS)

$(CPPOBJS):	cpp/cpp.h

$(BUILDDIR)/cpp.o:	cpp/cpp.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/cpp.c
$(BUILDDIR)/lexer.o:	cpp/lex.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/lex.c
$(BUILDDIR)/nlist.o:	cpp/nlist.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/nlist.c
$(BUILDDIR)/tokens.o:	cpp/tokens.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/tokens.c
$(BUILDDIR)/macro.o:	cpp/macro.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/macro.c
$(BUILDDIR)/eval.o:	cpp/eval.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/eval.c
$(BUILDDIR)/include.o:	cpp/include.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/include.c
$(BUILDDIR)/hideset.o:	cpp/hideset.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/hideset.c
$(BUILDDIR)/unix.o:	cpp/unix.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/unix.c
$(BUILDDIR)/getopt.o:	cpp/getopt.c
	$(CC) -c $(UCFLAGS) -Icpp -o $@ cpp/getopt.c


# bprint

$(BINDIR)/bprint:	etc/bprint.c
	$(CC)    $(CFLAGS) $(LDFLAGS) -o $@ etc/bprint.c


# liblcc

LIBOBJS=$(BUILDDIR)/assert.o $(BUILDDIR)/bbexit.o $(BUILDDIR)/yynull.o

$(BINDIR)/../liblcc.o:	$(LIBOBJS)
	libfile	-c -o ^.liblcc.o assert.o bbexit.o yynull.o
#	$(AR.a)	-o ^.liblcc.o assert.o bbexit.o yynull.o
# Line above dependent on $(BINDIR)

$(BUILDDIR)/assert.o:	lib/assert.c
	$(CC)	$(CFLAGS) -c -o $@ lib/assert.c
$(BUILDDIR)/yynull.o:	lib/yynull.c
	$(CC)	$(CFLAGS) -c -o $@ lib/yynull.c
$(BUILDDIR)/bbexit.o:	lib/bbexit.c
	$(CC)	$(CFLAGS) -c -o $@ lib/bbexit.c


# lcc

$(BINDIR)/lcc:	$(BUILDDIR)/lcc.o $(BUILDDIR)/host.o
	$(CC) $(ULDFLAGS) -o $@ $(BUILDDIR)/lcc.o $(BUILDDIR)/host.o

$(BUILDDIR)/lcc.o:	etc/lcc.c
	$(CC) -c $(UCFLAGS) -DPIPE=0 -o $@ etc/lcc.c
$(BUILDDIR)/host.o:	$(HOSTFILE)
	$(CC) -c $(UCFLAGS) -o $@ $(HOSTFILE)



clean:
	wipe o.* ~c
# Line above dependent on $(BUILDDIR)

veryclean:		clean
	rm -f src/arm.c
	rm -f lburg/gram.y
