COMMON_TARGETS = HelloWorld/HelloWorld.exe \
    DNull/DNull.exe \
    DriveC/DriveC.exe \
    ExactCase/MyTest.exe \
    FileTest/FileTest.exe \
    GUIToConsole/ConsoleLauncher.exe \
    HelloWorldC/HelloWorld.exe \
    HelloWorldCPP/HelloWorld.exe \
    InterruptTest/InterruptTest.exe \
    JNITest/sample.exe \
    JVMTest/ProgC.exe \
    NetTest/NetTest.exe \
    NetworkInterface/NetworkInterfaceTest.exe \
    NewStuff/NewStuff.exe \
    PrintArgs/PrintArgsTest.exe \
    RAFileTest/RandomAccessFileTest.exe \
    TempUTFStrTest/TempUTFStrTest.exe \
    ThreadTests/Thread_Alive.exe \
    ThreadTests/Thread_Interrupt.exe \
    ThreadTests/Thread_Join.exe \
    ThreadTests/Thread_Monitor.exe \
    ThreadTests/Thread_Sleep.exe \
    ThreadTests/Thread_Wait.exe \
    ThreadTests/Thread_Wait_2.exe \
    ThreadTests/Thread_Wait_Interrupt.exe \
    ZeroTest/Test.exe

TEST_TARGETS = $(COMMON_TARGETS) \
    ExactCaseFooTest/ExactCaseFooTest.built

SWT_TARGETS = \
    GUIToConsole/GUILauncher.exe \
    HelloSWT/HelloSWT.exe \

ALL_TARGETS = $(COMMON_TARGETS) $(SWT_TARGETS)
    
all: $(ALL_TARGETS)

tests: $(TEST_TARGETS)

ExactCase/MyTest.exe: 
	cd ExactCase/ && $(GCC_PREFIX)gcj --main=mytest.MyTest --classpath . -o MyTest.exe mytest/MyTest.java
	
ExactCaseFooTest/ExactCaseFooTest.built: ExactCaseFooTest/Foo.java ExactCaseFooTest/foo/Bar.java
	cd ExactCaseFooTest/ && $(GCC_PREFIX)gcj -C foo/Bar.java
	cd ExactCaseFooTest/ && rm -f foo/Bar.class
	cd ExactCaseFooTest/ && $(GCC_PREFIX)gcj -C Foo.java
	cd ExactCaseFooTest/ && $(GCC_PREFIX)gcj -C foo/Bar.java
	cd ExactCaseFooTest/ && rm -f foo/Bar.class
	cd ExactCaseFooTest/ && rm -f Foo.class
	touch ExactCaseFooTest/ExactCaseFooTest.built
	
FileExistsTest/FileExistsTest.exe: FileExistsTest/FileExistsTest.java FileExistsTest/sampNat.c
	cd $(dir $@) && $(GCC_PREFIX)gcj -C FileExistsTest.java
	cd $(dir $@) && $(GCC_GCJH) -jni FileExistsTest
	cd $(dir $@) && $(GCC_PREFIX)gcc -c sampNat.c
	cd $(dir $@) && $(GCC_PREFIX)gcc -shared -o $(JNITEST_SO_NAME) sampNat.o
	cd $(dir $@) && $(GCC_PREFIX)gcj -fjni -o FileExistsTest.exe FileExistsTest.class sampNat.o --main=FileExistsTest

GUIToConsole/ConsoleLauncher.exe: GUIToConsole/src/com/thisiscool/gcj/tests/guiconsole/ConsoleLauncher.java \
    GUIToConsole/src/com/thisiscool/gcj/tests/guiconsole/Launcher.java \
    GUIToConsole/HelloWorld.c
	cd $(dir $@) && $(GCC_PREFIX)gcc -o HelloWorld.exe HelloWorld.c
	cd $(dir $@) && $(GCC_PREFIX)gcj -C --classpath=src src/com/thisiscool/gcj/tests/guiconsole/Launcher.java
	cd $(dir $@) && $(GCC_PREFIX)gcj -c --classpath=src -o Launcher.o src/com/thisiscool/gcj/tests/guiconsole/Launcher.java
	cd $(dir $@) && $(GCC_PREFIX)gcj -c --classpath=src -o ConsoleLauncher.o src/com/thisiscool/gcj/tests/guiconsole/ConsoleLauncher.java
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=com.thisiscool.gcj.tests.guiconsole.ConsoleLauncher -s -o ConsoleLauncher.exe ConsoleLauncher.o Launcher.o

GUIToConsole/GUILauncher.exe: GUIToConsole/ConsoleLauncher.exe \
    GUIToConsole/src/com/thisiscool/gcj/tests/guiconsole/Launcher.java \
    GUIToConsole/src/com/thisiscool/gcj/tests/guiconsole/GUILauncher.java
	cp "$(SWT_JAVA_LIB_DIR)/swt.jar" $(dir $@)
	cd $(dir $@) && $(GCC_PREFIX)gcj -C --classpath "swt.jar$(FILE_SEPARATOR)src" src/com/thisiscool/gcj/tests/guiconsole/GUILauncher.java
	cd $(dir $@) && $(GCC_PREFIX)gcj -c --classpath "swt.jar$(FILE_SEPARATOR)src" -o GUILauncher.o src/com/thisiscool/gcj/tests/guiconsole/GUILauncher.java
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=com.thisiscool.gcj.tests.guiconsole.GUILauncher --classpath=swt.jar -s -o GUILauncher.exe GUILauncher.o Launcher.o "$(SWT_GCJ_LIB_DIR)/SWTMessages.o" "$(SWT_GCJ_LIB_DIR)/SWTImageLoaders.o" -L "$(SWT_GCJ_LIB_DIR)" -lswt -mwindows
	rm -f "$(dir $@)/swt.jar"

HelloWorldC/HelloWorld.exe: HelloWorldC/HelloWorld.c
	cd $(dir $@) && $(GCC_PREFIX)gcc -o $(notdir $(basename $@)).exe $(notdir $<)

HelloWorldCPP/HelloWorld.exe: HelloWorldCPP/HelloWorld.cpp
	cd $(dir $@) && $(GCC_PREFIX)g++ -o $(notdir $(basename $@)).exe $(notdir $<) -Wno-deprecated -lstdc++

HelloSWT/HelloSWT.exe: HelloSWT/HelloSWT.java
	cp "$(SWT_JAVA_LIB_DIR)/swt.jar" $(dir $@)
	cd $(dir $@) && $(GCC_PREFIX)gcj -fjni --main=$(notdir $(basename $@)) --classpath=swt.jar -s -o $(notdir $(basename $@)).exe $(notdir $<) "$(SWT_GCJ_LIB_DIR)/SWTMessages.o" "$(SWT_GCJ_LIB_DIR)/SWTImageLoaders.o" -L "$(SWT_GCJ_LIB_DIR)" -lswt
	rm -f "$(dir $@)/swt.jar"

InterruptTest/InterruptTest.exe: InterruptTest/InterruptTest.java
	cd $(dir $@) && chmod +x hang_posix.exe
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=$(notdir $(basename $@)) -o $(notdir $(basename $@)).exe $(notdir $<) ../ClientServer/*.java

NetTest/NetTest.exe: NetTest/NetTest.java
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=$(notdir $(basename $@)) -o $(notdir $(basename $@)).exe $(notdir $<) ../ClientServer/*.java

JVMTest/ProgC.exe: JVMTest/Prog.java JVMTest/invoke.c
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=Prog -o ProgJ.exe Prog.java
	cd $(dir $@) && $(GCC_PREFIX)gcj -c -fjni Prog.java -o prog.o
	cd $(dir $@) && $(GCC_PREFIX)gcc -c invoke.c -o invoke.o
	cd $(dir $@) && $(GCC_PREFIX)gcj -o ProgC.exe prog.o invoke.o
	
JNITest/sample.exe: JNITest/sample.java JNITest/sampNat.c
	cd $(dir $@) && $(MAKE)

TempUTFStrTest/TempUTFStrTest.exe: TempUTFStrTest/TempUTFStrTest.java
	cd $(dir $@) && rm -f *.class *.out TempUTFStrTest.h TempUTFStrTest TempUTFStrTest.exe
	cd $(dir $@) && $(GCC_PREFIX)gcj -C TempUTFStrTest.java
	cd $(dir $@) && $(GCC_GCJH) TempUTFStrTest
	cd $(dir $@) && $(GCC_PREFIX)gcj -o TempUTFStrTest.exe -isystem . -Wl,--noinhibit-exec -D$(GCC_HOST) --main=TempUTFStrTest TempUTFStrTest.java natTempUTFStrTest.cc

%.exe: %.java
	cd $(dir $@) && $(GCC_PREFIX)gcj --main=$(notdir $(basename $@)) -o $(notdir $(basename $@)).exe $(notdir $<)

clean:
	find . | grep -E '.*\.class|.*\.out|.*\.exe|.*\.built|.*\.o' | grep -E -v 'hang_.*|PrintArgs\.exe' | xargs rm -f
	cd JNITest && $(MAKE) clean

run:
	-@rm -f tests.out
	-@rm -Rf /tmp/thisiscool/gcjfiletest
	@for target in $(COMMON_TARGETS); do \
     (cd `dirname $$target` && echo `basename $$target`... && \
     echo `basename $$target` >> ../tests.out && \
     ./`basename $$target` >> ../tests.out && \
     echo '' >> ../tests.out); \
   done

# Native compiler?
# Delete build[x].bat/.sh
