
# used to create vbcc, vc and vcpp
CC = vc -DAMIGA
LDFLAGS = -lmieee -lextra

# native version; used to create dtgen
NCC = $(CC)
NLDFLAGS = $(LDFLAGS)

all: bin/vcpp bin/vc bin/vprof bin/vbcc$(TARGET)

vbccs: bin/vbccs$(TARGET)

bin/vc: frontend/vc.c
	$(CC) frontend/vc.c -o bin/vc $(LDFLAGS)

bin/vprof: vprof/vprof.c
	$(CC) vprof/vprof.c -o bin/vprof $(LDFLAGS)

vcppobjs = vcpp/cpp.o vcpp/eval.o vcpp/getopt.o vcpp/hideset.o vcpp/include.o \
	   vcpp/lex.o vcpp/macro.o vcpp/nlist.o vcpp/tokens.o vcpp/unix.o

bin/vcpp: $(vcppobjs)
	$(CC) $(LDFLAGS) $(vcppobjs) -o bin/vcpp

vcpp/cpp.o: vcpp/cpp.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/cpp.c -o vcpp/cpp.o

vcpp/eval.o: vcpp/eval.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/eval.c -o vcpp/eval.o

vcpp/getopt.o: vcpp/getopt.c
	$(CC) -c -Ivcpp vcpp/getopt.c -o vcpp/getopt.o

vcpp/hideset.o: vcpp/hideset.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/hideset.c -o vcpp/hideset.o

vcpp/include.o: vcpp/include.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/include.c -o vcpp/include.o

vcpp/lex.o: vcpp/lex.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/lex.c -o vcpp/lex.o

vcpp/macro.o: vcpp/macro.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/macro.c -o vcpp/macro.o

vcpp/nlist.o: vcpp/nlist.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/nlist.c -o vcpp/nlist.o

vcpp/tokens.o: vcpp/tokens.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/tokens.c -o vcpp/tokens.o

vcpp/unix.o: vcpp/unix.c vcpp/cpp.h
	$(CC) -c -Ivcpp vcpp/unix.c -o vcpp/unix.o

TRGDIR = machines/$(TARGET)

bobjects = $(TRGDIR)/main.o $(TRGDIR)/vars.o $(TRGDIR)/declaration.o \
	   $(TRGDIR)/parse_expr.o $(TRGDIR)/type_expr.o $(TRGDIR)/ic.o \
	   $(TRGDIR)/machine.o $(TRGDIR)/statements.o $(TRGDIR)/preproc.o \
	   $(TRGDIR)/supp.o $(TRGDIR)/dt.o

fobjects = $(TRGDIR)/opt.o $(TRGDIR)/av.o $(TRGDIR)/rd.o $(TRGDIR)/regs.o \
	   $(TRGDIR)/flow.o $(TRGDIR)/cse.o $(TRGDIR)/cp.o $(TRGDIR)/loop.o \
	   $(TRGDIR)/alias.o $(bobjects)

sobjects = $(TRGDIR)/opts.o $(TRGDIR)/regss.o $(bobjects)

tasm	 = $(TRGDIR)/supp.o $(TRGDIR)/tasm.o $(TRGDIR)/dt.o \
	   $(TRGDIR)/opt.o $(TRGDIR)/av.o $(TRGDIR)/rd.o $(TRGDIR)/regs.o \
	   $(TRGDIR)/flow.o $(TRGDIR)/cse.o $(TRGDIR)/cp.o $(TRGDIR)/loop.o \
	   $(TRGDIR)/alias.o $(TRGDIR)/machine.o

mbasic	 = $(TRGDIR)/supp.o $(TRGDIR)/mbasic.o $(TRGDIR)/dt.o \
	   $(TRGDIR)/opt.o $(TRGDIR)/av.o $(TRGDIR)/rd.o $(TRGDIR)/regs.o \
	   $(TRGDIR)/flow.o $(TRGDIR)/cse.o $(TRGDIR)/cp.o $(TRGDIR)/loop.o \
	   $(TRGDIR)/alias.o $(TRGDIR)/machine.o

vscobjects = $(TRGDIR)/vsc.o $(TRGDIR)/schedule.o

bin/vbcc$(TARGET): $(fobjects)
	$(CC) $(LDFLAGS) $(fobjects) -o bin/vbcc$(TARGET)

bin/vbccs$(TARGET): $(sobjects)
	$(CC) $(LDFLAGS) $(sobjects) -o bin/vbccs$(TARGET)

bin/vsc$(TARGET): $(vscobjects)
	$(CC) $(LDFLAGS) $(vscobjects) -o bin/vsc$(TARGET)

bin/tasm$(TARGET): $(tasm)
	$(CC) $(LDFLAGS) $(tasm) -o bin/tasm$(TARGET)

bin/mbasic$(TARGET): $(mbasic)
	$(CC) $(LDFLAGS) $(mbasic) -o bin/mbasic$(TARGET)

bin/dtgen: datatypes/dtgen.c datatypes/datatypes.h datatypes/dtconv.h
	$(NCC) datatypes/dtgen.c -o bin/dtgen -Idatatypes $(NLDFLAGS)

$(TRGDIR)/dt.h: bin/dtgen $(TRGDIR)/machine.dt
	bin/dtgen $(TRGDIR)/machine.dt $(TRGDIR)/dt.h $(TRGDIR)/dt.c

$(TRGDIR)/dt.c: bin/dtgen $(TRGDIR)/machine.dt
	bin/dtgen $(TRGDIR)/machine.dt $(TRGDIR)/dt.h $(TRGDIR)/dt.c

$(TRGDIR)/dt.o: $(TRGDIR)/dt.h $(TRGDIR)/dt.c
	$(CC) -c $(TRGDIR)/dt.c -o $(TRGDIR)/dt.o -I$(TRGDIR) -Idatatypes

$(TRGDIR)/tasm.o: tasm.c supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c tasm.c -o $(TRGDIR)/tasm.o -I$(TRGDIR)

$(TRGDIR)/mbasic.o: mbasic.c supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c mbasic.c -o $(TRGDIR)/mbasic.o -I$(TRGDIR)

$(TRGDIR)/supp.o: supp.c supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c supp.c -o $(TRGDIR)/supp.o -I$(TRGDIR)

$(TRGDIR)/main.o: main.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c main.c -o $(TRGDIR)/main.o -I$(TRGDIR)

$(TRGDIR)/vars.o: vars.c vbc.h supp.h $(TRGDIR)/machine.h errors.h $(TRGDIR)/dt.h
	$(CC) -c vars.c -o $(TRGDIR)/vars.o -I$(TRGDIR)

$(TRGDIR)/declaration.o: declaration.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c declaration.c -o $(TRGDIR)/declaration.o -I$(TRGDIR)

$(TRGDIR)/parse_expr.o: parse_expr.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c parse_expr.c -o $(TRGDIR)/parse_expr.o -I$(TRGDIR)

$(TRGDIR)/type_expr.o: type_expr.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c type_expr.c -o $(TRGDIR)/type_expr.o -I$(TRGDIR)

$(TRGDIR)/ic.o: ic.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c ic.c -o $(TRGDIR)/ic.o -I$(TRGDIR)

$(TRGDIR)/statements.o: statements.c vbc.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c statements.c -o $(TRGDIR)/statements.o -I$(TRGDIR)

$(TRGDIR)/opt.o: opt.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c opt.c -o $(TRGDIR)/opt.o -I$(TRGDIR)

$(TRGDIR)/av.o: av.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c av.c -o $(TRGDIR)/av.o -I$(TRGDIR)

$(TRGDIR)/rd.o: rd.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c rd.c -o $(TRGDIR)/rd.o -I$(TRGDIR)

$(TRGDIR)/regs.o: regs.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c regs.c -o $(TRGDIR)/regs.o -I$(TRGDIR)

$(TRGDIR)/flow.o: flow.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c flow.c -o $(TRGDIR)/flow.o -I$(TRGDIR)

$(TRGDIR)/cse.o: cse.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c cse.c -o $(TRGDIR)/cse.o -I$(TRGDIR)

$(TRGDIR)/cp.o: cp.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c cp.c -o $(TRGDIR)/cp.o -I$(TRGDIR)

$(TRGDIR)/loop.o: loop.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c loop.c -o $(TRGDIR)/loop.o -I$(TRGDIR)

$(TRGDIR)/alias.o: alias.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c alias.c -o $(TRGDIR)/alias.o -I$(TRGDIR)

$(TRGDIR)/preproc.o: preproc.c vbpp.h supp.h vbc.h $(TRGDIR)/dt.h
	$(CC) -c preproc.c -o $(TRGDIR)/preproc.o -I$(TRGDIR)

$(TRGDIR)/machine.o: $(TRGDIR)/machine.c supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c $(TRGDIR)/machine.c -o $(TRGDIR)/machine.o -I$(TRGDIR) -I.

$(TRGDIR)/opts.o: opt.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c -DNO_OPTIMIZER opt.c -o $(TRGDIR)/opts.o -I$(TRGDIR)

$(TRGDIR)/regss.o: regs.c opt.h supp.h $(TRGDIR)/machine.h $(TRGDIR)/dt.h
	$(CC) -c -DNO_OPTIMIZER regs.c -o $(TRGDIR)/regss.o -I$(TRGDIR)

$(TRGDIR)/vsc.o: vsc/vsc.h vsc/vsc.c $(TRGDIR)/schedule.h
	$(CC) -c vsc/vsc.c -o $(TRGDIR)/vsc.o -I$(TRGDIR)

$(TRGDIR)/schedule.o: vsc/vsc.h $(TRGDIR)/schedule.h $(TRGDIR)/schedule.c
	$(CC) -c $(TRGDIR)/schedule.c -o $(TRGDIR)/schedule.o -I$(TRGDIR) -Ivsc

