# $Id$

# feature

CODE_DB = yes
GDBM = yes

METAVM = 
METAVM_NO_ARRAY = 

# environment

JDK_VER = 12
J_INCDIR = /usr/local/java/include-old

GCC27 = 

# command


CC = /usr/local/bin/gcc
LD_DYNAMIC = ${CC} -shared#	for GCC and GNU binutils
#LD_DYNAMIC = ld -Bdynamic#	for SunOS 4
ASFLAGS = 
OBJDUMP = /usr/bin/objdump
RUBY = /usr/local/bin/ruby
CI = /usr/bin/ci
CO = /usr/bin/co
RM = /bin/rm
WC = /usr/bin/wc
ETAGS = /usr/bin/etags
JAVA = /usr/local/java/bin/java
JAVAC = /usr/local/java/bin/javac
JAVAH = /usr/local/java/bin/javah
ifeq (${JDK_VER}, 11)
JAVAH_OLD = ${JAVAH}
JAVAH_JNI = ${JAVAH} -jni
else
JAVAH_OLD = ${JAVAH} -old
JAVAH_JNI = ${JAVAH}
endif
JAR = /usr/local/java/bin/jar
JAVADOC = /usr/local/java/bin/javadoc


GENCONST = gentable.rb
POSTPROC = postcmpl.rb

INCDIR = -I${J_INCDIR} -I${J_INCDIR}/genunix -I${J_INCDIR}/linux -I${J_INCDIR}/freebsd -I/usr/local/include

OPTFLAGS = -O2
CDEBUGFLAGS =# -g -DDEBUG -DCOMPILE_DEBUG# -DRUNTIME_DEBUG
NOOPTCFLAGS = -pipe -fPIC ${CDEBUGFLAGS} ${INCDIR}
CFLAGS = ${OPTFLAGS} ${NOOPTCFLAGS}
LIBS =

ifeq (${METAVM}, yes)
TARGET = libmetavm.so
else
TARGET = libshujit.so
endif
GENEDHDR = constants.h
GENEDOBJ = constants.o
TOOLS = codedbinfo
TOOLSOBJ = codedbinfo.o
# source code
HDR = compiler.h opcodes_internal.h code.h
OBJ = code.o compiler.o signal.o invoker.o computil.o opcodes.o compile.o\
	runtime.o optimize.o x86tsc.o
ifneq (${JDK_VER}, 11)
	OBJ += linker.o
endif

ifeq (${CODE_DB}, yes)
	OBJ += codedb.o
	CFLAGS += -I/usr/local/include
#	LIBS += -L/usr/local/lib
ifeq (${GDBM}, yes)
	DBLIBS = -lgdbm
else
	DBLIBS = -lndbm
endif
endif
# subdirectories
SUBDIR =

# for MetaVM
ifeq (${METAVM}, yes)
	SUBDIR += NET/shudo/metavm metavm
	OBJ += metavm/objectid.o metavm/vmop.o metavm/controller.o \
		metavm/proxy.o metavm/byvalue.o metavm/type.o
	JARFILE = MetaVM.jar
endif


#
# rules
#

all: ${TARGET}

${TARGET}: do_config subdir ${OBJ} ${GENEDOBJ}
	${LD_DYNAMIC} -o $@ ${OBJ} ${GENEDOBJ} ${LIBS}

do_config:
	@if [ ! -f config.h ]; then \
		(echo 'Type ./configure then make.'; false) \
	fi

subdir:
ifdef SUBDIR
	@for subdir in ${SUBDIR}; do \
		(cd $$subdir && ${MAKE} all CFLAGS="${CFLAGS}") \
	done
endif

tool: codedbinfo

jar: ${JARFILE}
${JARFILE}: NET/shudo/metavm/*.class
	${JAR} cvf ${JARFILE} NET/shudo/metavm/*.class


# generate code.o
ifeq (${GCC27}, yes)
tmp.s: code.c ${POSTPROC}
	${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} -o tmp.s $<
code.s: tmp.s
	${RUBY} ${POSTPROC} < $< > $@
#	${RM} -f $<
code.o: code.s
else
code.o: code.c
	${CC} -fno-omit-frame-pointer ${NOOPTCFLAGS} -c $<
code.s: code.c code.h
	${CC} -S -fno-omit-frame-pointer ${NOOPTCFLAGS} $<
endif


${GENEDHDR}: code.o ${GENCONST}
	${OBJDUMP} -dx $< | ${RUBY} ${GENCONST}
${GENEDOBJ:.o=.c}: code.o ${GENCONST}
	${OBJDUMP} -dx $< | ${RUBY} ${GENCONST}

compile.o: compiler.h ${GENEDHDR} ${GENEDOBJ:.o=.c}
compiler.o: compiler.c compiler.h
runtime.o: runtime.c compiler.h
computil.o: compiler.h
codedb.o: compiler.h

codedbinfo.o: compiler.h
codedbinfo: codedbinfo.o
	${CC} -o $@ $< ${DBLIBS}

# for JDK 1.2
linker.o: java_util_Vector.h java_lang_ClassLoader_NativeLibrary.h
java_util_Vector.h:
	$(JAVAH_OLD) java.util.Vector
java_lang_ClassLoader_NativeLibrary.h:
	$(JAVAH_OLD) java.lang.ClassLoader\$$NativeLibrary


distclean: clean
	${RM} -f config.h config.status config.log
	${RM} -f metavm/GNUmakefile NET/shudo/metavm/GNUmakefile

clean: subdirclean
	${RM} -f config.cache confdefs.h
	${RM} -f TAGS *~ ${TARGET} *.o ${GENEDHDR} ${GENEDOBJ} ${GENEDOBJ:.o=.c} *.s ${TOOLS} ${TOOLSOBJ} java_*.h
ifeq (${METAVM}, yes)
	${RM} -f ${JARFILE}
endif

subdirclean:
ifdef SUBDIR
	@for subdir in ${SUBDIR}; do \
		(cd $$subdir && ${MAKE} clean) \
	done
endif

objclean:
	${RM} -f `${FIND} . -name '*.o' -print`

tag:
	${ETAGS} *.[hc]

wc:
	${WC} ${OBJ:.o=.c} ${HDR} ${GENCONST} ${TOOLSOBJ:.o=.c}
