# -*- makefile -*-
# Copyright (C) 2012 IBM Corporation and Others. All Rights Reserved.
## Name of the app

TARGET=icu4jscan

all:
	@echo To build and list "'" $(OUTFILES) "'"  in "'" $(J_GOOD) "'" use "$(MAKE) check"

## Setup multicu
MULTICU_ROOT=../../
include $(MULTICU_ROOT)/j/Makefile-j.inc


## The output files.  Will result in:   out/3_8.txt  out/4_0.txt  etc.
OUT=jxml
OUTFILES=$(J_GOOD:%=$(OUT)/%.txt)

.PRECIOUS: $(C_CLEAN_TARGET)

## Generate a file
$(OUT)/%.txt: $(OUT) $(C_INS)/%/bin/$(TARGET)
	$(shell $(C_INS)/$*/bin/icu-config --invoke) $(C_INS)/$*/bin/$(TARGET)  > $@

## clean
clean:
	-rm -f $(C_CLEAN_TARGET)
	-rm -f ./$(OUT)/*
	-rmdir $(OUT)


## Test: generate out files, and print them.
check: $(OUTFILES)
	@for file in $(OUTFILES); \
	do \
		echo; \
		sed -e "s%^%$$file: %g" < $$file; \
	done

MULTICU_ROOT=../../
include $(MULTICU_ROOT)/common/Makefile-multi.inc

XML=./xml

JVMXML=./jvmxml
JVM=$(MULTICU_ROOT)/j/jvm
JVM_CFG=.sh
JVMSH:=$(wildcard $(JVM)/[0-9]*$(JVM_CFG))

ALLICUS=$(ICUVERS:%=$(BLD)/%/$(S_BLD))
IICUS=$(ICUVERS:%=$(INS)/%/$(S_INS))
ALLAPPS=$(ICUVERS:%=$(INS)/%/bin/$(TARGET))
ALLXMLS=$(ICUVERS:%=$(XML)/%.xml)
COOKED=cooked
INPUT=input
INTROXMLS=$(wildcard $(INPUT)/*-introduction.xml)
FEATXMLS=$(INTROXMLS:$(INPUT)/%-introduction.xml=$(COOKED)/%-cooked.xml) $(COOKED)/characters.xml
ALLCOOKED=cooked/features.xml

JXML=./jxml
#ICU4JVERS
ALLICU4JS=$(ICU4JVERS:%=$(ICUS)/icu4j-%.jar)
ALLJXMLS=$(J_GOOD:%=$(JXML)/%.xml)
JSCAN=ScanICU
alljxmls: $(JXML) $(ALLJXMLS)
JSCANDIR=../icu4jscan
JCLASSFILE=$(JSCANDIR)/bin/com/ibm/icu/dev/scan/$(JSCAN).class
JScanPackage=com.ibm.icu.dev.scan
ALLJVM=$(JVMSH:$(JVM)/%$(JVM_CFG)=%)
ALLJVMXMLS=$(ALLJVM:%=$(JVMXML)/%.xml)
JVMSCAN=ScanJava
alljvmxmls: $(JVMXML) $(ALLJVMXMLS)
JVMCLASSFILE=$(JSCANDIR)/bin/com/ibm/icu/dev/scan/$(JVMSCAN).class


# java stuff
JAVA=java
MergerName=Merger
PropagateName=PropagateFeatures
PropagateCharsName=PropagateCharacters
MergerPackage=com.ibm.icu.dev.meta
MergerPackageSlash=$(subst .,/,$(MergerPackage))
## ICUMETA=/xsrl/E/data/meta  (in Makefile.local)
MergerLib=$(ICUMETA)/lib
MergerJar=$(ICUMETA)/icumeta.jar
#was: $(ICUMETA)/classes
MergerClassPath=$(shell ls $(MergerLib)/*.jar | tr '\n' ':')$(MergerJar):$(OTHERJARS)
include Makefile.local
MergerBuild=$(ICUMETA)/build.xml
#MergerClass=$(ICUMETA)/classes/$(MergerPackageSlash)/$(MergerName).class
#MergerJava=$(ICUMETA)/src/$(MergerPackageSlash)/$(MergerName).java
#BASEXMLS=$(ICUMETA)/xml/icumeta.xml
BASEXMLS=$(ICUMETA)/input/versions.xml


APRECIOUS=$(ICUVERS:%=$(BLD)/%/$(S_SRC)) $(ICUVERS:%=$(BLD)/%/$(S_BLD)) $(ICUVERS:%=$(INS)/%/$(S_INS))

.PRECIOUS: $(APRECIOUS)

tehprecious:
	echo $(APRECIOUS)

$(MergerJar):
	( cd $(ICUMETA)  ; ant jar )

$(BLD):
	-mkdir $(BLD)

$(INS)/%/$(S_INS): $(BLD)/%/$(S_BLD)
	@if [ -f $(BLD)/$*/build.err ]; then echo Error for $* stored in $(BLD)/$*/build.err; false;  fi
	( make $(MAKE_OPTS) -C $(BLD)/$*/icu/source 2>&1 all install | tee $(BLD)/$*/build.log ) || ( mv $(BLD)/$*/build.log $(BLD)/$*/build.err ; false )
	touch -c $@

$(BLD)/%/$(S_SRC): $(ICUS)/icu4c-%-src.tgz
	-mv $(BLD)/$* $(BLD)/$*.old
	-( rm -rf ./$(BLD)/$*.old& )
	mkdir -p $(BLD)/$*
	( cd $(BLD)/$* ; tar xfpz $(DOT)/$^ )
	([ -f patch/$* ] && patch -d $(BLD)/$* -p1 < $(DOT)/patch/$*) || true
	touch -c $@

$(BLD)/%/$(S_BLD): $(BLD)/%/$(S_SRC)
	-mkdir -p $(INS)
	( cd $(BLD)/$*/icu/source ; ./configure --disable-renaming --enable-shared --disable-static --enable-release --disable-debug --prefix=$(DOT)/$(INS)/$* )
	touch -c $@

$(INS)/%/bin/$(TARGET): $(INS)/%/$(S_INS) $(SRCS)
	-rm -rf ./$(BLD)/$*/tmp
	mkdir ./$(BLD)/$*/tmp
	@for file in $(OBJECTS); \
	do \
		what=`basename $$file .o` ; \
		echo compiling $*/$$what ; \
		$(CXX) -c -o ./$(BLD)/$*/tmp/$$what.o $$what.cpp -I $(INS)/$*/include -I $(BLD)/$*/icu/source/tools/toolutil ; \
	done
	$(CXX) -o $@ $(OBJECTS:%.o=./$(BLD)/$*/tmp/%.o)  -licudata -licuuc -licutu -licui18n -L$(INS)/$*/lib 

$(XML):
	mkdir $(XML)

$(JXML):
	mkdir $(JXML)

ifeq ($(JVMSH),)
JVMSH_WARN=warn-jvmsh
warn-jvmsh:
	@echo "Note: No $(JVM)/*$(JVM_CFG) files found, see $(JVM)/readme.txt"
endif


$(JVMXML):
	mkdir $(JVMXML)

$(XML)/%.xml: $(INS)/%/bin/$(TARGET) $(XML)
	$(shell $(INS)/$*/bin/icu-config --invoke) $(INS)/$*/bin/$(TARGET)  > $@

allxmls: $(ALLXMLS) | $(OUT)

alljvmxmls:  $(ALLJVMXMLS) $(JVMSH_WARN)  | $(JVMXML)

allapps: $(BLD) $(ALLAPPS)

allicus: $(BLD) $(ALLICUS)

clean-allapps:
	-rm -f $(ALLAPPS)

iicus: $(BLD) $(IICUS)

DTDCACHE=$(shell pwd)/dtdcache
DTDTMP=$(shell pwd)/dtdtmp
DTDOVR=$(ICUMETA)/dtd
JAVADEBUG=-DCLDR_DTD_CACHE_DEBUG=n -DCLDR_DTD_CACHE_ADEBUG=n 
JAVAPROPS= -DCLDR_DTD_CACHE=$(DTDCACHE) -DCLDR_DTD_OVERRIDE=$(DTDOVR) -DICU_DTD_CACHE=$(DTDCACHE) -DICU_DTD_OVERRIDE=$DTDOVR 

#//$(DTD)/Makefile: $(ICUMETA)/dtd/Makfile
#//	ln -s $^ $@
#//
#//dtd/icucaps.dtd: $(DTD)/Makefile dtd/icucaps.rnc
#//	make -C $(DTD)

ICUMETA_XML=$(ICUMETA)/xml/icumeta.xml

#$(ICUMETA)/xml/icumeta.xml: $(MergerBuild)
#	( cd $(ICUMETA) ; ant xml )	

featxmls: $(FEATXMLS)

allcooked: $(ALLCOOKED)

$(ALLCOOKED): $(FEATXMLS) $(MergerJar)
	-rm -rf ./dtdcache
	mkdir dtdcache
	$(JAVA) $(JAVAPROPS) -classpath $(MergerClassPath) $(MergerPackage).$(MergerName) -v  -o:$@ $(FEATXMLS)

$(COOKED)/%-cooked.xml: $(ICUMETA_XML) $(INPUT)/%-introduction.xml $(MergerJar)
	-rm -rf ./dtdcache
	mkdir dtdcache
	$(JAVA) $(JAVAPROPS) -classpath $(MergerClassPath) $(MergerPackage).$(PropagateName) $(ICUMETA_XML) $(INPUT)/$*-introduction.xml > $(COOKED)/$*-cooked.xml

$(COOKED)/characters.xml: $(ALLJXMLS) $(ALLXMLS) $(MergerJar)
	$(JAVA) $(JAVAPROPS) -classpath $(MergerClassPath) $(MergerPackage).$(PropagateCharsName) > $@ $(ALLJXMLS) $(ALLXMLS) || (rm ./$@ ; false)


icucaps.xml: $(BASEXMLS) $(ALLJXMLS) $(ALLXMLS) $(MergerJar) $(ALLCOOKED)
	-rm -rf ./dtdcache
	mkdir dtdcache
#	-rm -rf ./dtdtmp
#	mkdir dtdtmp
#	ln -s $(ICUMETA)/dtd/*.dtd ./dtdtmp/
#	ln -s ./dtd/*.dtd ./dtdtmp/
	$(JAVA) $(JAVAPROPS) -classpath $(MergerClassPath) $(MergerPackage).$(MergerName) -v  -o:$@ $(BASEXMLS)  $(ALLXMLS) $(ALLJXMLS) $(ALLCOOKED)

# --- J 

$(JXML)/%.xml: $(JCLASSFILE) $(ICUS)/icu4j-%.jar | $(JXML)
	$(JAVA) -classpath $(JSCANDIR)/bin:$(ICUS)/icu4j-$*.jar:$(JSCANDIR)/lib/icumeta.jar:$(JSCANDIR)/lib/xalan.jar:$(JSCANDIR)/lib/cldr.jar:$(JSCANDIR)/lib/utilities.jar:$(MergerJar):$(MergerLib)/utilities.jar:$(MergerLib)/cldr.jar:$(JSCANDIR)/lib/xerces.jar:$(OTHERJARS) $(JScanPackage).$(JSCAN) > $@ || (rm -f ./$@ ; false)

$(JVMXML)/%.xml: $(JVMCLASSFILE) $(JVM)/%$(JVM_CFG) | $(JVMXML)
	$(JVM)/invoke.sh $(JVM)/$*$(JVM_CFG) $(JSCANDIR)/bin:$(ICUS)/icu4j-$*.jar:$(JSCANDIR)/lib/icumeta.jar:$(JSCANDIR)/lib/xalan.jar:$(JSCANDIR)/lib/cldr.jar:$(MergerJar):$(MergerJar):$(MergerLib)/utilities.jar:$(MergerLib)/cldr.jar:$(JSCANDIR)/lib/utilities.jar:$(JSCANDIR)/lib/xerces.jar:$(OTHERJARS) $(JScanPackage).$(JVMSCAN) > $@ || (rm ./$@ ; false)

## Just generate
outfiles: $(XML) $(JXML) $(ALLJXMLS) $(ALLJVMXMLS)
