# @(#)Makefile	1.45 99/01/20
#
# Makefile for JVM DLL
#

BUILDDIR = ..\..
LIBRARY   = jvm
LOCATION  = java\jvm
!include $(BUILDDIR)\makefiles\defs.nmk

#
# Optional local flags with defaults: turn on from command line like
#
#   $ nmake PAGED_HEAPS=true
#

# By default turn on (win32) fast monitor implementation for test.
!ifndef FAST_MONITOR
FAST_MONITOR = false
!endif

!if "$(FAST_MONITOR)" == "true"
FAST_MONITOR_FLAG = -DFAST_MONITOR
!endif

# By default use a contiguous (memory mapped) heap
!ifndef PAGED_HEAPS
PAGED_HEAPS = false
!endif

!if "$(PAGED_HEAPS)" == "true"
PAGED_HEAPS_FLAG = -DPAGED_HEAPS
!endif

# By default build heap profiler
!ifndef HPROF
HPROF = true
!endif

!if "$(HPROF)" == "true"
HPROF_FLAG = -DHPROF
!endif

# by default enable JNI check support
CHECK_JNI = true
!if "$(CHECK_JNI)" == "true"
CHECK_JNI_FLAG = -DCHECK_JNI
!endif

# by default enable the delay JIT loading hack
DELAY_JIT_LOADING = false
!if "$(DELAY_JIT_LOADING)" == "true"
DELAY_JIT_LOADING_FLAG = -DDELAY_JIT_LOADING
!endif

!if "$(VARIANT)" == "DBG"
EXTRA_CFLAGS = $(EXTRA_CFLAGS) -DLOGGING -DTRACING -DJCOV -WX \
!else
OPT_OBJ =  $(CTARGDIR)runtimeHelper_p5.obj $(CTARGDIR)executeJava_p5.obj
EXTRA_CFLAGS = $(EXTRA_CFLAGS) -DTRIMMED -WX \
!endif
	$(PAGED_HEAPS_FLAG) \
	$(HPROF_FLAG) $(CHECK_JNI_FLAG) -DBREAKPTS \
	$(FAST_MONITOR_FLAG) $(DELAY_JIT_LOADING_FLAG)

!include $(MINCLUDES)\jvm.cmk

OTHER_JVM_c = \
	$(CTARGDIR)signals_md.c \
	$(CTARGDIR)gc_md.c \
	$(CTARGDIR)jmath_md.c \
	$(CTARGDIR)invokeNative_x86.c \
	$(CTARGDIR)monitor_cache_md.c \
	$(CTARGDIR)javai_md.c \
	$(OPT_OBJ)

FILES_c = $(FILES_c) $(OTHER_JVM_c)

#
# Includes for JVM only.
#
EXTRA_INCLUDES = $(EXTRA_INCLUDES) \
	-I$(PLATFORM_SRC)\javavm\include \
	-I$(PLATFORM_SRC)\hpi\export \
	-I$(SHARE_SRC)\javavm\include \
	-I$(SHARE_SRC)\hpi\export

#
# We haven't bootstrapped yet.
#
JAVAC_CMD = $(JAVAC_BOOT_CMD)
JAVAH_CMD = $(JAVAH_BOOT_CMD)

#
# Build CClassHeaders. First compile classes, and then unleash javah
# on them.
#
PKG  = java.lang
PKG2 = java.lang.reflect
PKG3 = java.lang.ref
PKG4 = java.io
PKG5 = java.security
PKG6 = java.util
PKG7 = sun.io
PKG8 = sun.misc
!include $(MINCLUDES)\jvm.jmk
# For jvm.dll, EXPORTED_CLASSES are == FILES_class. But nmake
# doesn't provide a clean way to remove $(CLASSBINDIR)\, so we hard
# code it.
_EXP = $(FILES_java:..\..\classes\=)
_EXP = $(_EXP:.java=)
_EXP = $(_EXP:/=.)
EXPORTED_CLASSES = $(_EXP)

#
# We can't link to ourselves, can we?
#
JVMLIB =
JAVALIB =
OTHER_LCF = @$(MINCLUDES)\jvmexp.lcf
EXTRA_LIBS =

#
# Install .lib file.
#
INSTALL_DOT_LIB = true

#
# We don't want a clobber in this directory nuking a lot of class
# files!
#
DONT_CLOBBER_CLASSES = true

JAVAHFLAGS = $(JAVAHFLAGS) -old

#
# Rules.
#
!include $(BUILDDIR)\makefiles\library.nmk

optimized.epilogue: mv.jvm.dll $(BINDIR)\classic\Xusage.txt

mv.jvm.dll:
	if not exist $(BINDIR)\classic mkdir $(BINDIR)\classic
	copy $(BINDIR)\$(LIBRARY).dll $(BINDIR)\classic
	$(DEL) $(BINDIR)\$(LIBRARY).dll

debug.epilogue: mv.jvm_g.dll $(BINDIR)\classic\Xusage.txt

mv.jvm_g.dll:
	if not exist $(BINDIR)\classic mkdir $(BINDIR)\classic
	copy $(BINDIR)\$(LIBRARY)_g.dll $(BINDIR)\classic
	$(DEL) $(BINDIR)\$(LIBRARY)_g.dll

$(BINDIR)\classic\Xusage.txt : $(SHARE_SRC)\javavm\include\Xusage.txt
	-$(DEL) $@
	copy $? $@

clobber: jvm.clean Xusage.txt.clean

jvm.clean: FORCE
	-$(DELTREE) $(BINDIR)\classic
	-$(DEL) includes.ilk includes.obj includes.pdb includes.exe opcodes.obj
	-$(DEL) *.class invokers.c invokeNative_x86.lst fjconst.inc
	-$(DEL) fjtables.inc executeJava_p5.asm executeJava_p5.lst

Xusage.txt.clean: FORCE
	-$(DEL) $(BINDIR)\classic\Xusage.txt

#
# Setup necessary m4 flags.  Consider that we might be using GNU m4.
#
!ifdef USE_GNU_M4
GNUM4FLAG = --traditional
!endif
M4FLAGS = $(FAST_MONITOR_FLAG) $(GNUM4FLAG)

#
# Build the main interpreter loop.
#
$(BUILDDIR)\java\jvm\includes.exe: $(BUILDDIR)\java\jvm\includes.c \
		$(SHARE_SRC)\javavm\runtime\opcodes.c
	$(CC) $(CFLAGS) -DTRACING $**

$(BUILDDIR)\java\jvm\executeJava_p5.asm: $(BUILDDIR)\java\jvm\includes.exe \
		$(SHARE_SRC)\javavm\runtime\executeJava_p5.m4 \
		$(SHARE_SRC)\javavm\runtime\executeJava_p5.inc
	rm -f $(BUILDDIR)\java\jvm\fjconst.inc
	rm -f $(BUILDDIR)\java\jvm\fjtables.inc
	rm -f $(BUILDDIR)\java\jvm\executeJava_p5.asm
	includes.exe $(BUILDDIR)\java\jvm
	m4 -DCPU=5 $(M4FLAGS) $(SHARE_SRC)\javavm\runtime\executeJava_p5.m4  >\
		$(BUILDDIR)\java\jvm\executeJava_p5.asm
	m4 -DCPU=6 $(M4FLAGS) $(SHARE_SRC)\javavm\runtime\executeJava_p5.m4 >>\
		$(BUILDDIR)\java\jvm\executeJava_p5.asm
	chmod a=rx $(BUILDDIR)\java\jvm\executeJava_p5.asm
	chmod a=rx $(BUILDDIR)\java\jvm\fjconst.inc
	chmod a=rx $(BUILDDIR)\java\jvm\fjtables.inc

$(OBJDIR)\executeJava_p5.obj: $(BUILDDIR)\java\jvm\executeJava_p5.asm
	ml -nologo -Fl -Zi -coff -c -Fo$(OBJDIR)\executeJava_p5.obj \
		$(BUILDDIR)\java\jvm\executeJava_p5.asm

$(OBJDIR)\invokeNative_x86.obj: \
		$(PLATFORM_SRC)\javavm\runtime\invokeNative_x86.asm
	ml -nologo -Fl -Zi -coff -c -Fo$(OBJDIR)\invokeNative_x86.obj \
		$(PLATFORM_SRC)\javavm\runtime\invokeNative_x86.asm

$(OBJDIR)\runtimeHelper_p5.obj: $(SHARE_SRC)\javavm\runtime\runtimeHelper_p5.c

#
# vpaths for the JVM (should not be seen by others)
#
{$(PLATFORM_SRC)\javavm\runtime}.c{$(OBJDIR)}.obj:
        $(CC) $(CFLAGS) -c -Fo$@ $<

{$(PLATFORM_SRC)\hpi\src}.c{$(OBJDIR)}.obj:
        $(CC) $(CFLAGS) -c -Fo$@ $<

{$(SHARE_SRC)\javavm\runtime}.c{$(OBJDIR)}.obj:
        $(CC) $(CFLAGS) -c -Fo$@ $<

#
# Custom invokers.
#
$(OBJDIR)\invokers.obj: invokers.c
        $(CC) $(CFLAGS) -c -Fo$@ $?

InvokerGen.class: $(SHARE_SRC)\javavm\runtime\InvokerGen.java
	$(JAVAC_CMD) -d . -nowarn \
		$(SHARE_SRC)\javavm\runtime\InvokerGen.java

invokers.c: $(SHARE_SRC)\javavm\include\invokers.txt InvokerGen.class
	$(BOOTDIR)\bin\java \
		-classpath $(BOOTDIR)\classes;$(BOOTDIR)\lib\classes.zip;. \
		InvokerGen < $(SHARE_SRC)\javavm\include\invokers.txt > $@

!ifndef JAE_ONLY
#
# Header files for the old style native method interface and for JNI.
#
optimized.epilogue debug.epilogue: install.headers

CH = $(BUILDDIR)\java\jvm\CClassHeaders\  # Trailing space is significant.
GENERATED_HEADERS = $(CH)java_lang_String.h \
	  	    $(CH)java_lang_ClassLoader.h \
	   	    $(CH)java_lang_Thread.h \
	   	    $(CH)java_lang_ThreadGroup.h

install.headers:
	-$(DELTREE) $(INCLUDEDIR)
	-$(DELTREE) $(INCLUDEDIR)-old
	@mkdir $(INCLUDEDIR)
	@mkdir $(INCLUDEDIR)\win32
	@mkdir $(INCLUDEDIR)-old
	@mkdir $(INCLUDEDIR)-old\win32
	copy $(SHARE_SRC)\hpi\export\*.h $(INCLUDEDIR)-old
	copy $(SHARE_SRC)\javavm\include\*.h $(INCLUDEDIR)-old
	copy $(SHARE_SRC)\javavm\export\*.h $(INCLUDEDIR)-old
	-$(DEL) $(INCLUDEDIR)-old\jni.h
	copy $(PLATFORM_SRC)\hpi\export\*.h $(INCLUDEDIR)-old\win32
	copy $(PLATFORM_SRC)\javavm\include\*.h $(INCLUDEDIR)-old\win32
	copy $(PLATFORM_SRC)\javavm\export\*.h $(INCLUDEDIR)-old\win32
	-$(DEL) $(INCLUDEDIR)-old\win32\jni_md.h
	copy $(SHARE_SRC)\javavm\export\jni.h $(INCLUDEDIR)
	copy $(SHARE_SRC)\javavm\export\jvmdi.h $(INCLUDEDIR)
	copy $(SHARE_SRC)\javavm\export\jvmpi.h $(INCLUDEDIR)
	copy $(PLATFORM_SRC)\javavm\export\jni_md.h $(INCLUDEDIR)\win32
	for %%i in ($(GENERATED_HEADERS)) do copy %%i $(INCLUDEDIR)-old
	@touch $@

clobber: headers.clobber

headers.clobber:
	-$(DELTREE) $(INCLUDEDIR)
	-$(DELTREE) $(INCLUDEDIR)-old
	-$(DEL) install.headers

!endif
