CFLAGS := -O2 -g -Wall

MODULE_CC := ../cparser/build/debug/cparser
MODULE_CCFLAGS := -O2 -Wall 
MODULE_ASFLAGS := -Wa,--no-pad-sections

LDSCRIPT := ldscript
MODULE_LDFLAGS := -static -nostdlib -nostartfiles \
                  -Wl,--build-id=none -Wl,-T,$(LDSCRIPT)

.PHONY: default clean modclean spotless
default: target demo-runner

target: target.o sfi.o riscv-disas.o
	$(CC) target.o sfi.o riscv-disas.o -lelf -o target

target.o: target.c sfi.h
	$(CC) -c $(CFLAGS) target.c -o target.o

demo-runner: demo-runner.o sfi.o riscv-disas.o
	$(CC) demo-runner.o sfi.o riscv-disas.o -lelf -o demo-runner

demo-runner.o: demo-runner.c sfi.h
	$(CC) -c $(CFLAGS) demo-runner.c -o demo-runner.o

sfi.o: sfi.c sfi.h riscv-disas.h
	$(CC) -c $(CFLAGS) sfi.c -o sfi.o

riscv-disas.o: riscv-disas.c riscv-disas.h
	$(CC) -c $(CFLAGS) riscv-disas.c -o riscv-disas.o

#
# pattern rules for building SFI modules
#

.PRECIOUS: modules/%.s0 modules/%.s

modules/%.sfi: modules/%.s ldscript
	$(CC) $(MODULE_ASFLAGS) $(MODULE_LDFLAGS) $< -o $@

modules/%.s: modules/%.c modules/trampoline.h
	$(MODULE_CC) -S $(MODULE_CCFLAGS) $< -o $@

#
# cleaning rules.
#
# WARNING: if you edited a .s file by hand, running `make spotless`
# or `make modclean` could delete your work!
#

spotless: clean modclean

clean:
	-rm -f demo-runner.o target.o sfi.o riscv-disas.o
	-rm -f demo-runner target demo-runner.core target.core

modclean:
	-rm -f modules/*.s modules/*.sfi
