###############################################################################
#
#
# Filename: Makefile
#
# Author:   Robert Thornburrow
# Project:  JavaVM
# Created:  19th January 1998
#
# Purpose:  Makefile for JavaVM.
#
# (c) Copyright R.H.Thornburrow, 2002
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
#
###############################################################################
#
# Set OUTDIR and JAVAVM to suit your platform.
#
###############################################################################

OUTDIR=cygwin32
#OUTDIR=linux-i386

JAVAVM=javavm.exe
#JAVAVM=javavm


## Debug build
#CFLAGS=-ansi -D_DEBUG -D_GNU_SOURCE
CFLAGS=-O1 -D_DEBUG

## Release build
#CFLAGS=-O2

SRC=main/main.c main/native-io.c \
	engine/disasm.c       engine/engine.c \
	engine/instructions.c engine/linker.c \
	engine/loader.c       engine/native.c \
	engine/util.c         engine/verifier.c \
	engine/memory.c \
	native/java_lang_Class.c   native/java_lang_ClassLoader.c \
	native/java_lang_Math.c    native/java_lang_Object.c \
	native/java_lang_Runtime.c native/java_lang_SecurityManager.c \
	native/java_lang_System.c  native/java_lang_Throwable.c \
	native/java_lang_Thread.c \
	native/java_io_File.c               native/java_io_FileDescriptor.c \
	native/java_io_FileInputStream.c    native/java_io_FileOutputStream.c \
	native/java_io_ObjectStreamClass.c  native/java_io_ObjectInputStream.c \
	native/java_io_ObjectOutputStream.c

OBJ=$(OUTDIR)/main.o         $(OUTDIR)/native-io.o \
	$(OUTDIR)/disasm.o       $(OUTDIR)/engine.o \
	$(OUTDIR)/instructions.o $(OUTDIR)/linker.o \
	$(OUTDIR)/loader.o       $(OUTDIR)/native.o \
	$(OUTDIR)/util.o         $(OUTDIR)/verifier.o \
	$(OUTDIR)/memory.o \
	$(OUTDIR)/java_lang_Class.o   $(OUTDIR)/java_lang_ClassLoader.o \
	$(OUTDIR)/java_lang_Math.o    $(OUTDIR)/java_lang_Object.o \
	$(OUTDIR)/java_lang_Runtime.o $(OUTDIR)/java_lang_SecurityManager.o \
	$(OUTDIR)/java_lang_System.o  $(OUTDIR)/java_lang_Throwable.o \
	$(OUTDIR)/java_lang_Thread.o \
	$(OUTDIR)/java_io_File.o               $(OUTDIR)/java_io_FileDescriptor.o \
	$(OUTDIR)/java_io_FileInputStream.o    $(OUTDIR)/java_io_FileOutputStream.o \
	$(OUTDIR)/java_io_ObjectStreamClass.o  $(OUTDIR)/java_io_ObjectInputStream.o \
	$(OUTDIR)/java_io_ObjectOutputStream.o


TEST=lib\test\TestSuite.class lib\test\Test.class \
    lib\test\ByteTest.class lib\test\ShortTest.class \
    lib\test\IntTest.class lib\test\LongTest.class \
    lib\test\FloatTest.class lib\test\DoubleTest.class \
    lib\test\ExceptionTest.class lib\test\ArrayTest.class \
    lib\test\LoopTest.class


.SUFFIXES: .c .o .java .class

all: $(OUTDIR) $(OUTDIR)/$(JAVAVM)

$(OUTDIR):
	if [ ! -d $(OUTDIR) ] ; then mkdir $(OUTDIR); fi

$(OUTDIR)/$(JAVAVM): $(OBJ)
	gcc -O1 -o $(OUTDIR)/$(JAVAVM) $(OBJ)


#######################
# only run under Cygwin

#RELEASE=Debug
RELEASE=Release

testsuite: $(TEST)
	-cd lib; ../win32/Debug/javavm.exe test/TestSuite

test-win32:
	./testheader java > test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe Hello >> ../test-win32.log 2>&1
	./testheader javac >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/javac/Main Hello.java >> ../test-win32.log 2>&1
	./testheader appletviewer >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/applet/AppletViewer Hello.html >> ../test-win32.log 2>&1
	./testheader jar >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/jar/Main cvf Hello.jar Hello.class >> ../test-win32.log 2>&1
	./testheader javap >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/javap/JavaP Hello >> ../test-win32.log 2>&1
	./testheader javadoc >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/javadoc/Main Hello.java >> ../test-win32.log 2>&1
	./testheader rmic >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/rmi/rmic/Main RMITest >> ../test-win32.log 2>&1
	./testheader rmiregistry >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/rmi/registry/RegistryImpl >> ../test-win32.log 2>&1
	./testheader serialver >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/serialver/SerialVer SerializationTest >> ../test-win32.log 2>&1
	./testheader javakey >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/security/provider/Main l >> ../test-win32.log 2>&1
	./testheader jdb >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/ttydebug/TTY Hello >> ../test-win32.log 2>&1
	./testheader native2ascii >> test-win32.log
	-cd lib; ../win32/$(RELEASE)/javavm.exe sun/tools/native2ascii/Main test.properties >> ../test-win32.log 2>&1
	-diff test-win32.log test-win32.ref > test-win32-new.dif


#######################
# only run under Cygwin

testsuite-cygwin32: $(TEST)
	@echo Testing Taurus JavaVM...
	bin/java test/TestSuite

test-cygwin32: $(OUTDIR) $(OUTDIR)/$(JAVAVM)
	./testheader java > test-cygwin32.log
	-bin/java Hello >> test-cygwin32.log 2>&1
	./testheader javac >> test-cygwin32.log
	-bin/javac Hello.java >> test-cygwin32.log 2>&1
	./testheader appletviewer >> test-cygwin32.log
	-bin/appletviewer Hello.html >> test-cygwin32.log 2>&1
	./testheader jar >> test-cygwin32.log
	-bin/jar cvf Hello.jar Hello.class >> test-cygwin32.log 2>&1
	./testheader javadoc >> test-cygwin32.log
	-bin/javadoc Hello.java >> test-cygwin32.log 2>&1
	./testheader javap >> test-cygwin32.log
	-bin/javap Hello >> test-cygwin32.log 2>&1
	./testheader rmic >> test-cygwin32.log
	-bin/rmic RMITest >> test-cygwin32.log 2>&1
	./testheader rmiregistry >> test-cygwin32.log
	-bin/rmiregistry >> test-cygwin32.log 2>&1
	./testheader serialver >> test-cygwin32.log
	-bin/serialver SerializationTest >> test-cygwin32.log 2>&1
	./testheader javakey >> test-cygwin32.log
	-bin/javakey l >> test-cygwin32.log 2>&1
	./testheader jdb >> test-cygwin32.log
	-bin/jdb Hello >> test-cygwin32.log 2>&1
	./testheader native2ascii >> test-cygwin32.log
	-bin/native2ascii test.properties >> test-cygwin32.log 2>&1
	diff test-cygwin32.log test-cygwin32.ref > test-cygwin32.dif

clean:
	rm $(OBJ)

###############################
# Generic rules (GNU make only)

$(OUTDIR)/%.o: main/%.c
	gcc -c $(CFLAGS) -o $@ $<

$(OUTDIR)/%.o: engine/%.c
	gcc -c $(CFLAGS) -o $@ $<

$(OUTDIR)/%.o: native/%.c
	gcc -c $(CFLAGS) -o $@ $<

#########################
# Build .o's for cygwin32

$(OUTDIR)/main.o: main/main.c engine/config.h
$(OUTDIR)/native-io.o: main/native-io.c engine/config.h
$(OUTDIR)/disasm.o: engine/disasm.c engine/config.h
$(OUTDIR)/engine.o: engine/engine.c engine/boolean.c engine/char.c \
                    engine/double.c engine/float.c engine/integer.c \
                    engine/long.c engine/object.c engine/short.c \
                    engine/if.c engine/config.h
$(OUTDIR)/instructions.o: engine/instructions.c engine/config.h
$(OUTDIR)/linker.o: engine/linker.c engine/config.h
$(OUTDIR)/loader.o: engine/loader.c engine/config.h
$(OUTDIR)/native.o: engine/native.c engine/config.h
$(OUTDIR)/util.o:   engine/util.c engine/config.h
$(OUTDIR)/verifier.o: engine/verifier.c engine/config.h
$(OUTDIR)/memory.o: engine/memory.c engine/config.h

$(OUTDIR)/java_lang_Class.o:           native/java_lang_Class.c engine/config.h
$(OUTDIR)/java_lang_ClassLoader.o:     native/java_lang_ClassLoader.c engine/config.h
$(OUTDIR)/java_lang_Math.o:            native/java_lang_Math.c engine/config.h
$(OUTDIR)/java_lang_Object.o:          native/java_lang_Object.c engine/config.h
$(OUTDIR)/java_lang_Runtime.o:         native/java_lang_Runtime.c engine/config.h
$(OUTDIR)/java_lang_SecurityManager.o: native/java_lang_SecurityManager.c engine/config.h
$(OUTDIR)/java_lang_System.o:          native/java_lang_System.c engine/config.h
$(OUTDIR)/java_io_File.o:              native/java_io_File.c engine/config.h
$(OUTDIR)/java_io_FileDescriptor.o:    native/java_io_FileDescriptor.c engine/config.h
$(OUTDIR)/java_io_FileInputStream.o:   native/java_io_FileInputStream.c engine/config.h
$(OUTDIR)/java_io_FileOutputStream.o:  native/java_io_FileOutputStream.c engine/config.h
$(OUTDIR)/java_io_ObjectStreamClass.o: native/java_io_ObjectStreamClass.c engine/config.h
$(OUTDIR)/java_io_ObjectInputStream.o: native/java_io_ObjectInputStream.c engine/config.h
$(OUTDIR)/java_io_ObjectOutputStream.o: native/java_io_ObjectOutputStream.c engine/config.h

#################
# Build TestSuite

{lib\test\}.java{lib\test\}.class:
	cd lib
	javac test\TestSuite.java
	cd ..
