all : testenv  tools java2 devdoc module_test

testenv	:
	@if  test -z $JDK2PATH ; then echo "You must specify the environment variable JDK2PATH. It must point to the root path of the Java2 directory."; fi


ifndef PATHSEPARATOR
PATHSEPARATOR = \\
endif

ifeq ($(OSTYPE),cygwin32)
CC = gcc
else
CC = cc
endif

java2 : java2_debug java2_release;

#Root for all source directories:

##############################################################################
#Read packages:
##############################################################################

ROOT_PACKAGE =de/jbible
BASE_PACKAGE =$(ROOT_PACKAGE)
OUTDIR_ROOT = build
TOOLS = $(OUTDIR_ROOT)/tools

# Create targets:
PACKAGE = $(BASE_PACKAGE)
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/core
include $(PACKAGE)/filelist.mak

#Bible package and subpackages
PACKAGE = $(BASE_PACKAGE)/bible
include $(PACKAGE)/filelist.mak


#Create targets for tools
BASE_PACKAGE = $(ROOT_PACKAGE)/tool
PACKAGE = $(BASE_PACKAGE)/swinglang
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/swingmisc
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/misc
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/bibleimport
include $(PACKAGE)/filelist.mak

# Create targets for services:
BASE_PACKAGE =$(ROOT_PACKAGE)/service
PACKAGE = $(BASE_PACKAGE)/AboutBox
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/DebugWindow
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/MainWindow
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/ImportDBG
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/ImportDialog
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/JBibleTextProvider
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/PalmTextProvider
include $(PACKAGE)/filelist.mak

# Create module test targets:
BASE_PACKAGE =$(ROOT_PACKAGE)/test
PACKAGE = $(BASE_PACKAGE)
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/bible
include $(PACKAGE)/filelist.mak
PACKAGE = $(BASE_PACKAGE)/tool/bibleimport
include $(PACKAGE)/filelist.mak


##############################################################################
# Global used Variables
##############################################################################

ALL_MODULES = 	    $(MAIN_FILES) \
                    $(CORE_FILES) 	\
                    $(BIBLE_FILES)  \
				    $(SERVICE_ABOUTBOX_FILES)	\
                    $(SERVICE_DEBUG_WINDOW_FILES)	\
                    $(SERVICE_IMPORT_DBG_FILES)\
                    $(SERVICE_IMPORT_DIALOG_FILES)\
				    $(SERVICE_MAINWINDOW_FILES)	\
                    $(SERVICE_JBIBLETEXTPROVIDER_FILES) \
                    $(SERVICE_PALMTEXTPROVIDER_FILES) \
				    $(TOOL_SWINGLANG_FILES)	\
                    $(TOOL_SWINGMISC_FILES) \
                    $(TOOL_BIBLEIMPORT_FILES) \
                    $(TOOL_MISC_FILES) \
                    Makefile


TEST_MODULES = 	$(TEST_FILES)	\
				$(TEST_BIBLE_FILES)	\
                $(TEST_TOOL_BIBLEIMPORT_FILES)


DEB_OUTDIR=$(OUTDIR_ROOT)/debug
REL_OUTDIR=$(OUTDIR_ROOT)/release
DEVDOC_OUTDIR=$(OUTDIR_ROOT)/devdoc
MODULE_TEST_OUTDIR = $(OUTDIR_ROOT)/modtest

MANIFEST = $(filter %.mf,$(ALL_MODULES))


##############################################################################
#Debug Rules java2
##############################################################################

DEB_JAR = jbible_debug.jar
DEB_TARGET = $(filter-out %.doc.gif, $(patsubst %,$(DEB_OUTDIR)/%,$(ALL_MODULES)))


java2_debug : $(DEB_OUTDIR)/$(DEB_JAR)

$(DEB_OUTDIR)/%.jar : $(DEB_OUTDIR) $(filter %.class,$(DEB_TARGET)) $(filter %.gif,$(DEB_TARGET)) $(filter %.prop,$(DEB_TARGET))
	cd $(DEB_OUTDIR); $(JDK2PATH)/bin/jar cmf ../../$(MANIFEST) $(notdir $@) de

$(DEB_OUTDIR) :
	mkdir -p $(DEB_OUTDIR)

$(filter %.class,$(DEB_TARGET)): $(DEB_OUTDIR)/%.class : %.java
	$(JDK2PATH)/bin/javac -g -deprecation -classpath . -d $(DEB_OUTDIR) $<

$(filter %.gif,$(DEB_TARGET)): $(DEB_OUTDIR)/%.gif: %.gif
	cp $< $@

$(filter %.prop,$(DEB_TARGET)): $(DEB_OUTDIR)/%.prop: %.prop
	cp $< $@


##############################################################################
# Release Rules java2
##############################################################################

REL_JAR = jbible.jar
REL_TARGET = $(filter-out %.doc.gif, $(patsubst %,$(REL_OUTDIR)/%,$(ALL_MODULES)))

java2_release: $(REL_OUTDIR)/$(REL_JAR)

$(REL_OUTDIR)/$(REL_JAR) : $(REL_OUTDIR) $(filter %.class,$(REL_TARGET)) $(filter %.gif,$(REL_TARGET)) $(filter %.prop,$(REL_TARGET))
	cd $(REL_OUTDIR); $(JDK2PATH)/bin/jar cmf ../../$(MANIFEST) $(notdir $@) de

$(REL_OUTDIR) :
	mkdir -p $(REL_OUTDIR)

$(filter %.class,$(REL_TARGET)): $(REL_OUTDIR)/%.class : %.java
	$(JDK2PATH)/bin/javac  -target 1.2 -g:none -O -deprecation -classpath . -d $(REL_OUTDIR) $<


$(filter %.gif,$(REL_TARGET)): $(REL_OUTDIR)/%.gif: %.gif
	cp $< $@

$(filter %.prop,$(REL_TARGET)): $(REL_OUTDIR)/%.prop: %.prop
	cp $< $@


##############################################################################
#Developer Documentation Rules:
##############################################################################
DOC_MODULES = $(TEST_MODULES) $(ALL_MODULES)

DEVDOC_TARGET =	$(patsubst %.class,$(DEVDOC_OUTDIR)/api/%.html,$(filter %.class,$(DOC_MODULES) )) \
						$(patsubst %,$(DEVDOC_OUTDIR)/%,$(filter %.html,$(DOC_MODULES))) \
						$(patsubst %,$(DEVDOC_OUTDIR)/%,$(filter %.doc.gif,$(DOC_MODULES)))

devdoc : $(DEVDOC_OUTDIR)/api	 $(DEVDOC_OUTDIR)/api/index.html

$(DEVDOC_OUTDIR)/api :
	mkdir -p $(DEVDOC_OUTDIR)/api

$(DEVDOC_OUTDIR)/api/index.html : $(patsubst %.class,%.java,$(filter %.class, $(DOC_MODULES)))
	$(JDK2PATH)/bin/javadoc \
    -classpath \;./tools/junit/junit.jar \
   	-sourcepath . -overview $(filter %overview.html,$(DOC_MODULES))  \
   	-doctitle 'JBIBLE API Documentation' -private \
		-bottom 'Questions, Suggestions: Mail to: <a href=\"mailto:suggestions@jbible.de\">Suggestions @ JBible</a>' \
		-header '<p><a target = \"null\" href="../index.html\"><strong>Home</strong></a></p>' \
		-windowtitle 'JBIBLE: Java Bible' \
		-d $(DEVDOC_OUTDIR)/api -use 	-version -author \
		$(sort $(subst /,.,$(patsubst %/,%,$(dir $(filter %.class,$(DOC_MODULES)))))) \
        1> $(OUTDIR_ROOT)/javadoc_proceeding.txt 2> $(OUTDIR_ROOT)/javadoc_errors.txt


##############################################################################
# Testing rules
##############################################################################
test : module_test test_pure_java2 test_pure_java1


##############################################################################
# Rules for testing java2
##############################################################################
test_pure_java2 : $(OUTDIR_ROOT)/jdk12_debug.100percent.jpc $(OUTDIR_ROOT)/jdk12_release.100percent.jpc

$(OUTDIR_ROOT)/jdk12_debug.100percent.jpc : $(DEB_OUTDIR)/$(DEB_JAR)
	$(JDK2PATH)/jre/bin/java -classpath javapurecheck.jar JavaPureCheck -bypass -d jdk12 -o $(OUTDIR_ROOT)/jdk12_debug.100percent $<

$(OUTDIR_ROOT)/jdk12_release.100percent.jpc : $(REL_OUTDIR)/$(REL_JAR)
	$(JDK2PATH)/jre/bin/java -classpath javapurecheck.jar JavaPureCheck -bypass -d jdk12 -o $(OUTDIR_ROOT)/jdk12_release.100percent $<



##############################################################################
# Create all tools that we need for building
##############################################################################
tools : $(TOOLS) jlex  $(TOOLS)/jay.exe


jlex : $(TOOLS)/jlex/Main.class


$(TOOLS)/%.class : 
	$(JDK2PATH)/bin/javac -g -target 1.2 -deprecation -classpath . -d $(TOOLS) $(patsubst $(TOOLS)/%.class,tools/%.java,$@)

$(TOOLS) :
	mkdir -p $(TOOLS)

jay_files	= closure.o error.o lalr.o lr0.o main.o mkpar.o output.o reader.o \
			  symtab.o verbose.o warshall.o
jay_files := $(patsubst %,tools/jay/%,$(jay_files))

$(TOOLS)/jay.exe: $(jay_files)
	$(CC) -o $(TOOLS)/jay.exe $(jay_files)




#depend:	*.[ch]		; $(CC) -MM $(CFLAGS) $c > $@
#-include depend


#############################################################################
# Generate source files with jlex/jay
#############################################################################
%Yylex.java : %Yylex
	$(JDK2PATH)/bin/java -classpath $(TOOLS) jlex.Main $<

%Parser.java : %Parser.jay
	$(TOOLS)/jay.exe < tools/jay/skeleton -v $< > $@

##############################################################################
# Module testing:
##############################################################################

module_test : $(MODULE_TEST_OUTDIR)


$(MODULE_TEST_OUTDIR) : $(patsubst %.class,%.java,$(filter %.class, $(DOC_MODULES)))
	mkdir -p $(MODULE_TEST_OUTDIR)
	$(JDK2PATH)/bin/javac -g -deprecation -classpath .\;./tools/junit/junit.jar -d $(MODULE_TEST_OUTDIR) de/jbible/test/StartTest.java
	$(JDK2PATH)/bin/java -classpath $(MODULE_TEST_OUTDIR)\;tools/junit/junit.jar de.jbible.test.StartTest	


