# Copyright (c) 2009-2010 IBM Corp. and Others. All Rights Reserved
# multicu/c makefile

all:
	@echo To build all ICUs:  $(MAKE) all-icus
	@echo "Using the -k option may be a good idea if some are not building properly."
	@echo ICUVERS: $(ICUVERS)

info:

#ICUCONF=sh ./configure
ICUCONF=$(MULTICU_ROOT)/c/superconf.sh
DOT=$(shell pwd)
MULTICU_ROOT=$(DOT)/..
include $(MULTICU_ROOT)/common/Makefile-multi.inc
-include Makefile.local

ICUVERS:=$(shell cd $(ICUS); ls icu4c*.tgz | cut -d- -f2 | sort | uniq | fgrep -v -f $(MULTICU_ROOT)/c/old-icu.txt)
ICU4JVERS:=$(shell cd $(ICUS); ls icu4j*.jar | cut -d- -f2 | cut -d. -f1 |  sort | uniq | fgrep -v -f $(MULTICU_ROOT)/j/old-icu4j.txt)

BLD=$(C_BLD)
INS=$(C_INS)
SRC=$(C_SRC)

ALLICUS=$(ICUVERS:%=$(BLD)/%/$(S_BLD)) $(ICUVERS:%=$(BLD)/r%/$(S_BLD))
RICUS=$(ICUVERS:%=$(INS)/r%/$(S_INS))
IICUS=$(ICUVERS:%=$(INS)/%/$(S_INS)) $(RICUS)


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

.PRECIOUS: $(APRECIOUS)

tehprecious:
	echo $(APRECIOUS)

$(M_TMP) $(BLD) $(INS):
	mkdir $(M_TMP)
	mkdir $(BLD) $(SRC)  $(INS)

$(INS)/%/$(S_INS): $(BLD)/%/$(S_BLD)
	@if [ -f $(BLD)/$*/build.err ]; then echo '###' Error for $* stored in $(BLD)/$*/build.err - remove if you want me to retry; 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 $@

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

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

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


$(BLD)/r%/$(S_BLD): $(BLD)/r%/$(S_SRC)
	-mkdir -p $(INS)
	-chmod a+rx $(BLD)/r$*/icu/source/configure $(BLD)/r$*/icu/source/runConfigureICU
	( cd $(BLD)/r$*/icu/source ; `$(ICUCONF) "$(BLD)/r$*/icu/source" "$*"` --enable-renaming --enable-shared --disable-static --enable-release --disable-debug --prefix=$(INS)/r$* )
	touch -c $@

$(BLD)/%/$(S_BLD): $(BLD)/%/$(S_SRC)
	-mkdir -p $(INS)
	-chmod a+rx $(BLD)/$*/icu/source/configure $(BLD)/$*/icu/source/runConfigureICU
	( cd $(BLD)/$*/icu/source ; `$(ICUCONF) "$(BLD)/$*/icu/source" "$*"` --disable-renaming --enable-shared --disable-static --enable-release --disable-debug --prefix=$(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 

foo:
	echo $(ALLICUS)

allicus: $(BLD) $(ALLICUS)


all-icus: iicus

iicus: $(BLD) $(IICUS)

ricus: $(RICUS)
