#
# Copyright (C) 2010-2012 IBM Corporation and Others, All Rights Reserved.
#
all: glurens ii plugs testprog

# extra files that need generation.
PLUG_EXTRA_DEPS=
UNAME=$(shell uname)

SOBJ=ao
ifeq ($(UNAME),Linux)
LIBPATH_VAR=LD_LIBRARY_PATH
PLUG_EXTRA_LDFLAGS=-fPIC
PBLD_EXTRA_FLAGS=-fPIC
GLUE_EXTRA_CFLAGS= -fPIC
PLUGLIB_SO=so
else
ifeq ($(UNAME),Darwin)
LIBPATH_VAR=DYLD_LIBRARY_PATH
PLUG_EXTRA_LDFLAGS=-exported_symbols_list $(GLUE_EXPORT) -dynamiclib -dynamic
PLUG_EXTRA_DEPS+=$(GLUE_EXPORT)
PLUGLIB_SO=dylib
else
ifeq ($(UNAME),AIX)
LIBPATH_VAR=LIBPATH
#PLUG_EXTRA_LDFLAGS=-exported_symbols_list $(GLUE_EXPORT) -dynamiclib -dynamic
PLUG_EXTRA_DEPS+=$(GLUE_EXPORT)
PLUGLIB_SO=a
SOBJ=o
else
$(warning **********************************)
$(warning this script may not know how to handle your $(UNAME) system)
endif
endif
endif

srcdir=$(shell pwd)

PROVIDER=provider
LIBPROVIDER=lib$(PROVIDER).a

#libs: $(ICU_TARBALLS_VERS:%=$(OUT)/%/lib/$(LIBPROVIDER))

PLUGLIB_INST=$(C_INS)/r$(PLUGLIB)
PLUGLIB_ICU_CONFIG=$(PLUGLIB_INST)/bin/icu-config
#PLUGLIB_SO=$(shell $(PLUGLIB_ICU_CONFIG) --so 2>/dev/null )
PLUGLIB_NAME=libicuprov.$(PLUGLIB_MAJ).$(PLUGLIB_SO)
#PLUGLIB_MAJ=$(echo $(PLUGLIB) | cut -d_ -f-1 | tr -d _ )
#GLOUT_ICU=$(ICU_TARBALLS_VERS:%=$(GLOUT)/%/$(OK))
PLUGLIB_AVAILABLE=$(shell echo $(PROVIDER_AVAILABLE) | tr '.' '_')
PLUGLIB_AVAILABLE_DATA=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/data/out/tmp/*.o)
PLUGLIB_AVAILABLE_STATICS=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/[ci]*/*.$(SOBJ))
PLUGLIB_OUTLIBS=$(PLUGLIB:%=$(OUT)/%/lib/$(PLUGLIB_NAME))



## configuration
# Absolute path to this dir. 
# dir holding ICUs to be built
MULTICU_ROOT=../..
include $(MULTICU_ROOT)/c/Makefile-c.inc
ICU_CONFIG=icu-config-nosanity
ICU_CONFIG_ORIG=icu-config

# subdirs...
# prefix to distinguish it from non-provider builds
P_PREFIX=p
BUILD=$(M_TMP)/$(P_PREFIX)bld
INST=$(M_TMP)/$(P_PREFIX)ins
SRC=$(M_TMP)/$(P_PREFIX)src
OUT=$(TOP)/out
SOURCE=$(S_SRCDIR)
GLUE=glue
GLUE_EXPORT=$(GLUE)/export.txt
GLOUT=$(M_TMP)/$(P_PREFIX)glout
# header locations
INCGLUE=$(TOP)/$(GLUE)/include
# relative path to icuglue within glout
GLUREN=gluren/include/icuglue
# relative path to gluren.h
GLUREN_H=$(GLUREN)/gluren.h
# Special 'configure' caller
SUPERCONF=$(TOP)/$(MULTICU_ROOT)/c/superconf.sh
# options to compilation (such as, debug)
XOPTS=$(EXTRA_COMPILE_OPTS)
OK=ok
MOPTS=

# directories that need to be built
ALLDIRS=$(INST) $(BUILD) $(SRC) $(GLOUT) $(OUT)
# The 'ok' flag file for installations
INST_ICU=$(PLUGLIB_AVAILABLE:%=$(INST)/%/$(OK))
BUILD_ICU=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/$(OK))
# this has to do with the pluglib
GLOUT_ICU=$(PLUGLIB:%=$(GLOUT)/%/obj-$(OK))
#SRC_ICU=$(ICU_TARBALLS_VERS:%=$(SRC)/%/$(OK))
# gluren.h files for each version
GLUREN_ICU=$(PLUGLIB_AVAILABLE:%=$(BUILD)/%/$(GLUREN_H))
#?
CONFIGURE_CMD=
# Options passed to configure
CONFIGURE_OPTS=--enable-static --disable-shared --with-data-packaging=static --disable-extras --disable-icuio --disable-layout --disable-tests --disable-samples  $(EXTRA_CONFIGURE_OPTS) 
# additional options passed to make
MAKE_XTRA_OPTS="PKGDATA_MODE=static"
# additional options passed to make install
MAKE_INSTALL_XTRA_OPTS=$(MAKE_XTRA_OPTS)

# Munged source names: list of C++, O etc files for Frontend
PARTSUFF=_fe
GL_FE_CXX=$(notdir $(wildcard $(GLUE)/*$(PARTSUFF).cpp))
GL_FE_FILES=$(GL_FE_CXX:%.cpp=$(GLUE)/%.cpp)
GL_FE_O=$(GL_FE_CPP:%.cpp=%.o)
GL_PARTS=$(GL_FE_CXX:%$(PARTSUFF).cpp=%)
# C flags used in Glue compilation
GLUE_CFLAGS=-I$(INCGLUE) $(GLUE_EXTRA_CFLAGS)

# icu-config switches for compiling: C and C++
ICU_CONFIG_COMMON=--cppflags
# icu-config switches for C
ICU_CONFIG_CC=--cc $(ICU_CONFIG_COMMON) --cflags 
# icu-config switches for C++
ICU_CONFIG_CXX=--cxx $(ICU_CONFIG_COMMON) --cxxflags

include Makefile.local


# Usage:  $(call SILENT_COMPILE,logfile,cmd)
ifndef VERBOSE
	LOG_COMPILE=echo build with VERBOSE=1 to unhide compile ;  ($(2) 2>&1 > $(1) || (echo "Compile failed, see logfile in $(1) for details." ;false))
else
	LOG_COMPILE=$(2) 2>&1 | tee $(1)
endif

PLUGLIB=$(shell echo $(PROVIDER_TARGET)  | tr '.' '_' )
PLUGLIB_MAJ=$(shell  ./icu2symver.sh $(PLUGLIB))

## @build All installed ICUs
ii: $(GLOUT_ICU)

# Don't delete these files
.PRECIOUS: (INST_ICU) $(BUILD_ICU) $(SRC_ICU) $(ICU_TARBALLS_VERS:%=$(BUILD)/%/config.status) $(ICU_TARBALLS_VERS:%=$(GLOUT)/%/obj-$(OK))  $(ICU_TARBALLS_VERS:%=$(BUILD)/%/config/$(ICU_CONFIG)) $(PLUGLIB_ICU_CONFIG)

# cleanup
clean:
	-rm -rf $(ALLDIRS)
	-$(MAKE) -C ../.. clean

# create all empty work dirs
$(ALLDIRS):
	-mkdir -p $(@)

# Build r$(PLUGLIB) from ../../c
$(PLUGLIB_ICU_CONFIG):
	@echo ICU $(PLUGLIB) "(plugin) building..."
	$(call LOG_COMPILE,../../c/ricus$(PLUGLIB).log,$(MAKE) -C ../../c ICUVERS=$(PLUGLIB) ricus)

# build the glue objects for TARGET
# used to be %/* instead of $(PLUGLIB) - now, wire it down to pluglib.
$(GLOUT)/$(PLUGLIB)/obj-$(OK): $(GLOUT) glurens  $(PLUGLIB_ICU_CONFIG) $(GL_FE_FILES)
	@echo ICU $* "(plugin) building glue.."
	-mkdir $(GLOUT)/$(PLUGLIB)
#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CC)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_c_$(PLUGLIB).o $(GL_BE_C:%.c=$(GLUE)/%.c)
#	$(shell $(BUILD)/$(PLUGLIB)/config/$(ICU_CONFIG) $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -DICUGLUE_VER=$(PLUGLIB) -o $(GLOUT)/$(PLUGLIB)/gl_be_cxx_$(PLUGLIB).o $(GL_BE_CXX:%.cpp=$(GLUE)/%.cpp)
	-rm -rf $(GLOUT)/$(PLUGLIB)/include
	mkdir -p $(GLOUT)/$(PLUGLIB)/include/icuglue/include
# for each version..  build all OTHER FE files
# TODO: check is unnecessary, not permitted.
# TODO: change to depend instead of for list. 
#	@echo GL_PARTS=$(GL_PARTS)
#	@echo GL_FE_CXX=$(GL_FE_CXX)
#	@echo PARTSUFF=$(PARTSUFF)
	@for ver in $(PLUGLIB_AVAILABLE) ; \
	do \
		echo building $$ver for $(PLUGLIB) ; \
		if [ ! "$$ver" = "$(PLUGLIB)" ]; \
		then \
			for part in $(GL_PARTS) ; \
			do \
				echo $(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -I$(TOP)/$(BUILD)/$$ver/gluren/include -DICUGLUE_VER=$$ver "-DICUGLUE_VER_STR=\"$$ver\"" "-DGLUE_SYM(x)=glue ## x ## $$ver" -o $(GLOUT)/$(PLUGLIB)/$${part}_$${ver}_for_$(PLUGLIB).o $(GLUE)/$${part}$(PARTSUFF).cpp $(XOPTS) ; \
				$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -c -I$(TOP)/$(BUILD)/$$ver/gluren/include -DICUGLUE_VER=$$ver "-DICUGLUE_VER_STR=\"$$ver\"" "-DGLUE_SYM(x)=glue ## x ## $$ver" -o $(GLOUT)/$(PLUGLIB)/$${part}_$${ver}_for_$(PLUGLIB).o $(GLUE)/$${part}$(PARTSUFF).cpp $(XOPTS) || exit 1; \
			done ; \
			echo " GLUE_VER( $$ver ) " >> $(GLOUT)/$(PLUGLIB)/include/icuglue/glver.h; \
		fi \
	done
# build 'this version' FE files
	@echo Building FE for $(PLUGLIB)
	@for part in $(GL_PARTS) ; \
	do \
		echo $(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -I$(GLOUT)/$(PLUGLIB)/include -c -o $(GLOUT)/$(PLUGLIB)/$${part}_$(PLUGLIB).o $(GLUE)/$${part}$(PARTSUFF).cpp $(XOPTS) ; \
		$(shell $(PLUGLIB_ICU_CONFIG) --noverify $(ICU_CONFIG_CXX)) $(GLUE_CFLAGS) -I$(GLOUT)/$(PLUGLIB)/include -c -o $(GLOUT)/$(PLUGLIB)/$${part}_$(PLUGLIB).o $(GLUE)/$${part}$(PARTSUFF).cpp $(XOPTS) || exit 1; \
	done
	touch $@

plugs: $(PLUGLIB_OUTLIBS) $(OUT)/$(PLUGLIB_MAJ:%=icuplugins%.txt)

install-plugs: $(PLUGLIB_INST)/lib/$(PLUGLIB_NAME) $(PLUGLIB_INST)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt
	echo "Plugins installed for testing."

#TODO: should be 'install' not 'cp'
$(PLUGLIB_INST)/lib/$(PLUGLIB_NAME) $(PLUGLIB_INST)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt: $(PLUGLIB_OUTLIBS)
	cp $(PLUGLIB_OUTLIBS) $(PLUGLIB_INST)/lib
	echo "# Generated. " > $(PLUGLIB_INST)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt
	@for part in $(GL_PARTS) ; \
	do \
		echo "$(PLUGLIB_NAME)	$${part}_provider_plugin" >> $(PLUGLIB_INST)/lib/icu/icuplugins$(PLUGLIB_MAJ).txt ; \
		echo " $${part}_provider_plugin" ; \
	done

$(GLUE_EXPORT): Makefile $(GL_FE_FILES)
	echo "# Generated for installation. " > $@
	@for part in $(GL_PARTS) ; \
	do \
		echo "_$${part}_provider_plugin" >> $@ ; \
		echo " _$${part}_provider_plugin" ; \
	done

$(OUT)/icuplugins$(PLUGLIB_MAJ).txt: $(PLUGLIB_OUTLIBS) Makefile
	echo "# Generated for testing." > $@
	@for part in $(GL_PARTS) ; \
	do \
		echo "$(PLUGLIB_NAME)	$${part}_provider_plugin" >> $@ ; \
		echo " $${part}_provider_plugin" ; \
	done

TESTPROG=coldiff datediff

testprog: $(PLUGLIB:%=$(OUT)/%/bin/$(TESTPROG)) 

check-icu2symver:
	./check-icu2symver.sh

check: check-icu2symver all testprog $(OUT)/icuplugins$(PLUGLIB_MAJ).txt
	ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(PLUGLIB_INST)/lib:out/$(PLUGLIB)/lib $(PLUGLIB_INST)/bin/icuinfo || ( echo "ICU broken." ; /bin/false )
	ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(PLUGLIB_INST)/lib:out/$(PLUGLIB)/lib $(PLUGLIB_INST)/bin/icuinfo -L || ( echo "Plugin broken." ; /bin/false )
	@for prog in $(TESTPROG) ; \
	do \
		echo "# ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(PLUGLIB_INST)/lib:out/$(PLUGLIB)/lib out/$(PLUGLIB)/bin/$${prog}" ; \
		ICU_PLUGINS=$(OUT) $(LIBPATH_VAR)=$(PLUGLIB_INST)/lib:out/$(PLUGLIB)/lib out/$(PLUGLIB)/bin/$${prog} || ( echo "$${prog} failed." ; /bin/false ) ; \
	done

install-check: install-plugs
	$(LIBPATH_VAR)=$(PLUGLIB_INST)/lib $(PLUGLIB_INST)/bin/icuinfo -L || ( echo "Plugin broken." ; /bin/false )
	@for prog in $(TESTPROG) ; \
	do \
		echo "# $${prog}" ; \
		$(LIBPATH_VAR)=$(PLUGLIB_INST)/lib out/$(PLUGLIB)/bin/$${prog} || ( echo "$${prog} against installed failed." ; /bin/false ) ; \
	done

$(OUT)/$(PLUGLIB)/bin/$(TESTPROG):  $(GLOUT)/$(PLUGLIB)/obj-$(OK) $(OUT)/$(PLUGLIB)/provider_version.h
	-mkdir -p $(OUT)/$(PLUGLIB)/bin
	@for prog in $(TESTPROG) ; \
	do \
		$(shell $(PLUGLIB_ICU_CONFIG) --cxx --cxxflags --cppflags --ldflags) -o $(OUT)/$(PLUGLIB)/bin/$${prog} -I$(OUT)/$(PLUGLIB) $(srcdir)/$${prog}.cpp ; \
	done

$(OUT)/%/lib/$(PLUGLIB_NAME):  $(GLOUT)/%/obj-$(OK) $(PLUG_EXTRA_DEPS)
	-mkdir -p $(OUT)/$*/lib
	$(shell $(PLUGLIB_ICU_CONFIG) --cxx --cxxflags --cppflags --ldflags) $(PLUG_EXTRA_LDFLAGS) -shared -o $@ $(GLOUT)/$*/*.o $(PLUGLIB_AVAILABLE_DATA) $(PLUGLIB_AVAILABLE_STATICS)

#	cp $@ $(C_INS)/r$*/lib/

$(OUT)/%/lib/$(LIBPROVIDER):  $(GLOUT)/%/obj-$(OK)
	-mkdir -p $(OUT)/$*/lib
	echo copy includes
	ar -rv $@ $(GLOUT)/$*/*.o
	ranlib $@

## @@ build glu rename files
glurens: $(GLUREN_ICU)

# build single gluren.h 
$(BUILD)/%/$(GLUREN_H): $(BUILD)/%/ok Makefile makegluren.sh
	-mkdir -p $(BUILD)/$*/$(GLUREN)
	env SRC="$(SRC)" SOURCE="$(SOURCE)" GLUE="$(GLUE)" ./makegluren.sh $@ $*
	@fgrep -q OICU_ $@ || ( echo "Error: $@: no OICU_ symbols found. Removing gluren.h " ; rm -f $@ ; exit 1)

$(BUILD)/%/config/$(ICU_CONFIG): $(BUILD)/%/config/$(ICU_CONFIG_ORIG) icu-config.sed $(BUILD)/%/ok 
	sed -f icu-config.sed < $(BUILD)/$*/config/$(ICU_CONFIG_ORIG) >  $(BUILD)/$*/config/$(ICU_CONFIG) && chmod a+rx  $(BUILD)/$*/config/$(ICU_CONFIG)

# perform installation
$(INST)/%/ok: $(BUILD)/%/ok
	echo ICU $* "(backend) installing..."
	echo "INST " "[" $* "]"
	mkdir -p $(INST)/$*
	-$(call LOG_COMPILE,$(BUILD)$*/ok.log,$(MAKE) $(MOPTS) -C $(BUILD)/$* install $(MAKE_INSTALL_XTRA_OPTS))
	touch $@

# unpack ICU and patch
$(SRC)/%/ok: $(ICUS)/icu4c-%-src.tgz
	-[ -d $(SRC)/$* ] && rm -rf $(SRC)/$*
	@echo ICU $* "(backend) unpacking..."
	mkdir -p $(SRC)/$*
	$(call LOG_COMPILE,$(SRC)/$*/unpack.log,( cd $(SRC)/$* && gunzip -d < $(TOP)/$(ICUS)/icu4c-$*-src.tgz | tar xvfp - ))
	@echo Should patch $* here
	touch $@

# config 
$(BUILD)/%/config.status: $(SRC)/%/ok
	@echo ICU $* "(backend) configuring..."
	-[ -d $(BUILD)/$* ] && rm -rf $(BUILD)/$*
	mkdir -p $(BUILD)/$*
	( cd $(BUILD)/$* && env CFLAGS="$(CFLAGS) $(PBLD_EXTRA_FLAGS)" CXXFLAGS="$(CXXFLAGS) $(PBLD_EXTRA_FLAGS)" $(shell $(SUPERCONF) $(TOP)/$(SRC)/$*/$(SOURCE) $*) $(CONFIGURE_OPTS) --srcdir=$(TOP)/$(SRC)/$*/$(SOURCE) --prefix=$(TOP)/$(INST)/$* )

# build 
# note: regex had renaming problems, and spoof depends on regex. Nuke them.
$(BUILD)/%/ok: $(BUILD)/%/config.status
	@echo ICU $* "(backend) building.."
	$(call LOG_COMPILE,$(BUILD)/$*/ok2.log,( $(MAKE)  $(MOPTS) -C $(BUILD)/$* all $(MAKE_XTRA_OPTS) ))
	@if [ ! -f $(BUILD)/$*/common/putil.$(SOBJ) ]; \
	then \
		echo re-unpacking $(BUILD)/$*/common ; \
		( cd $(BUILD)/$*/common && ar xf ../lib/libsicuuc.a || echo could not unpack ../lib/libsicuuc.a ) ; \
		echo re-unpacking $(BUILD)/$*/i18n ; \
		( cd $(BUILD)/$*/i18n && ar xf ../lib/libsicui18n.a || echo could not unpack ../lib/libsicui18n.a ) ; \
	fi
	@if [ ! -f $(BUILD)/$*/common/putil.$(SOBJ) ]; \
	then \
		echo ERROR: still could not find $(BUILD)/$*/common/putil.$(SOBJ) - build may fail.; \
	fi
	-rm -f $(BUILD)/$*/i18n/uregex*.* $(BUILD)/$*/i18n/uspoof*.*o*
	touch $@

info help:
	@echo ICU Provider Build
	@echo "Targetting Provider against ICU $(PROVIDER_TARGET) ($(PLUGLIB), major $(PLUGLIB_MAJ))"
	@echo "Available plugins: $(PROVIDER_AVAILABLE) ($(PLUGLIB_AVAILABLE))"
	@echo "Available keywords:"
	@for ver in $(PROVIDER_AVAILABLE); do \
		echo "   ...@provider=icu"`echo $$ver | ./icu2symver.sh`; \
	done
	@echo "Plugin library will be $(PLUGLIB_NAME)"
	@echo
	@echo Available ICU tarballs:  $(ICU_TARBALLS)
	@echo Available ICU versions: $(shell echo $(ICU_TARBALLS_VERS) | tr '_' '.')

$(OUT)/$(PLUGLIB)/provider_version.h: Makefile.local Makefile
	@echo Generating $@ ..
	@echo "/* Generated file. */" > $@
	@echo "const char *provider_version[] = {" >> $@
	@for ver in $(PROVIDER_AVAILABLE); do \
		echo VER $$ver ; \
		sym=`echo $$ver | ./icu2symver.sh` ; \
		echo SYM $$sym ; \
		echo "\"$$sym\"",  >> $@ ; \
	done
	@echo " }; " >> $@
	@echo "#define PROVIDER_COUNT (sizeof(provider_version)/sizeof(provider_version[0]))" >> $@
	@echo >> $@

#-- for the prototype
