DYNAMIC_LINK = ON
#DYNAMIC_LINK = OFF
#VERILOG_PARSER = ON
VERILOG_PARSER = OFF
#OPTIMIZATION = ON
OPTIMIZATION = OFF
#DEBUGGING = FULL
#DEBUGGING = ON
DEBUGGING = OFF
#INTERRUPTS = ON
INTERRUPTS = OFF
#PROFILING = ON
PROFILING = OFF
#WARNINGS = MORE
WARNINGS = ON
#WARNINGS = OFF
MACHINE = ORDINARY
#MACHINE = EXOTIC
MATH = ON
#MATH = OFF
NO_IDIV = ON
#NO_IDIV = OFF
#SAFE = ON
SAFE = OFF

DL_LIB_ON = -ldl
DL_LIB_OFF =
DL_CFLAG_ON = -rdynamic
DL_CFLAG_OFF =
DL_SRC_ON = sim_dl.c
DL_SRC_OFF =

OPT_CFLAG_ON = -O9
OPT_CFLAG_OFF = -g

DEBUG_CFLAG_FULL = -DCOUNT_REFS -DSHOW_DEREF
DEBUG_CFLAG_ON = -DCOUNT_REFS
DEBUG_CFLAG_OFF =

INT_CFLAG_ON = -DCATCH_INTERRUPTS # for interrupt handling
INT_CFLAG_OFF =

PROF_CFLAG_ON = -p
PROF_CFLAG_OFF =

WARN_CFLAG_MORE = -Wall -Werror -pedantic -ansi
WARN_CFLAG_ON = -Wall -Werror
WARN_CFLAG_OFF =

MACH_CFLAG_ORDINARY = -DHASH_POINTER
MACH_CFLAG_EXOTIC = -DHASH_POINTER

MATH_LIB_ON = -lm
MATH_LIB_OFF =
MATH_CFLAG_ON = -DMATH
MATH_CFLAG_OFF =

NO_IDIV_CFLAG_ON = -DNO_IDIV
NO_IDIV_CFLAG_OFF =

SAFE_CFLAG_ON = -DSAFE
SAFE_CFLAG_OFF =
SAFE_SRC_ON = sim_lib.c
SAFE_SRC_OFF = sim_crypto.c sim_sys.c

# -DVPARSER to set up the vparser package
# -DCATCH_INTERRUPTS for interrupt handling
# -DCOUNT_REFS for memory debugging
# -DSHOW_DEREF to show name lookups
# -p for profiling
# -rdynamic for dynamic linking functionality

CFLAGS = $(DL_CFLAG_$(DYNAMIC_LINK))	$(OPT_CFLAG_$(OPTIMIZATION))	\
	 $(DEBUG_CFLAG_$(DEBUGGING))	$(INT_CFLAG_$(INTERRUPTS))	\
	 $(PROF_CFLAG_$(PROFILING))	$(WARN_CFLAG_$(WARNINGS))	\
	 $(MACH_CFLAG_$(MACHINE))	$(MATH_CFLAG_$(MATH))		\
	 $(NO_IDIV_CFLAG_$(NO_IDIV))	$(SAFE_CFLAG_$(SAFE))		\
	 $(EXTRA_CFLAGS)

LIBS= $(DL_LIB_$(DYNAMIC_LINK))	$(MATH_LIB_$(MATH))
CC=gcc
YFLAGS=-d
SIM_SRCS=sim_string.c	\
	 sim_numeric.c	\
	 sim_build.c	\
	 $(DL_SRC_$(DYNAMIC_LINK))
SRCS=$(SIM_SRCS) $(SAFE_SRC_$(SAFE))	\
	 values.c util.c functions.c string_eval.c boot.c
OBJECTS=$(SRCS:.c=.o)

%.dlo: %.c Makefile
	$(CC) $(CFLAGS) -rdynamic $(TARGET_ARCH) -c $< -o $@

%.so: %.dlo
	$(CC) $(CFLAGS) -shared $(TARGET_ARCH) $< -o $@

kria:: $(OBJECTS)
	$(CC) $(CFLAGS) -o $@ $(OBJECTS) $(LIBS)

$(OBJECTS): Makefile

lexical.o: y.tab.h

y.tab.h: lang.y

environment:
	cd .. && make environment

depend: $(SRCS)
	makedepend $(SRCS)

clean:
	rm -f *.o core y.tab.h lang.c *.so

spotless: clean
	rm -f kria Makefile.bak

checks: makechecks headerchecks

makechecks:
	localdepend

headerchecks: $(OBJECTS)
	@echo headerlist
	@headerlist $(SRCS)

boot.o: string_eval.h util.h
functions.o: functions.h sim.h util.h values.h
lang.o: functions.h lang.h sim.h util.h values.h
lexical.o: functions.h lang.h sim.h util.h values.h y.tab.h
sim_build.o: functions.h sim.h sim_build.h sim_string.h util.h values.h
sim_crypto.o: functions.h sim.h sim_crypto.h util.h values.h
sim_dl.o: functions.h sim.h sim_dl.h util.h values.h
sim_lib.o: functions.h sim.h sim_lib.h util.h values.h
sim_numeric.o: functions.h sim.h sim_numeric.h util.h values.h
sim_proto.o: functions.h sim.h sim_proto.h util.h values.h
sim_string.o: functions.h sim.h sim_string.h util.h values.h
sim_sys.o: functions.h sim.h sim_sys.h util.h values.h
string_eval.o: functions.h lang.h sim_build.h sim_crypto.h sim_dl.h sim_lib.h sim_numeric.h sim_string.h sim_sys.h string_eval.h values.h
values.o: functions.h util.h values.h
util.o: util.h
