## Makefile.in for ICU tools
## Copyright (c) 1999-2000, International Business Machines Corporation and
## others. All Rights Reserved.

## Source directory information
srcdir = @srcdir@
top_srcdir = @top_srcdir@

top_builddir = ..

include $(top_builddir)/icudefs.mk

include @platform_make_fragment@

##

CPPFLAGS = @CPPFLAGS@ -I$(top_srcdir)/common -I$(top_builddir)/common
CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@

## Build directory information
subdir = tools

## Allow overriding of package build mode
ifeq ($(strip $(MODE)),)
  MODE=@DATA_PACKAGING_MODE@
endif

# OBJDATADIR must be a short path (with ..'s) to the data.

#SRCDATADIR=$(shell cd $(top_srcdir)/../data && /bin/pwd)
SRCDATADIR=$(top_srcdir)/../data

OBJDATADIR=$(shell cd $(top_builddir)/data && /bin/pwd)
# tmpdir is INSIDE pkgdata dir. if you change TMPDATADIR then the invokation
# of pkgdata will break...
TMPDATADIR=tmp

# DATABUILDDIR must be an absolute path because of the way pkgdata is invoked
# from the temporary directory.

DATABUILDDIR=$(shell cd $(OBJDATADIR) && /bin/pwd)
CURDIR=$(shell /bin/pwd)

# relative lib links from pkgdata are the same as for tmp
top_builddir_from_tmp = $(patsubst ..%,../..%,$(top_builddir))
INVOKE = $(LDLIBRARYPATH_ENVVAR)=$(top_builddir_from_tmp)/common:$(top_builddir_from_tmp)/tools/toolutil:$$$(LDLIBRARYPATH_ENVVAR)
PKGDATA = ../pkgdata/pkgdata -T . -s $(DATABUILDDIR) -O ./icupkg.inc -d $(DATABUILDDIR) -m $(MODE) 

## Install program information
MKINSTALLDIRS = $(SHELL) $(top_srcdir)/mkinstalldirs

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_SCRIPT = @INSTALL_SCRIPT@

## for cleaning up libraries
STRIP = @STRIP@

## Package information
PACKAGE = @PACKAGE@
VERSION = @VERSION@


SUBDIRS = ctestfw toolutil makeconv genrb \
genccode genprops gennames gencmn gencnval gentz gentest pkgdata

## List of phony targets
.PHONY : all all-local all-recursive install install-local install-files install-dlls build-cmnfile build-dll		\
install-recursive clean clean-local clean-recursive distclean		\
distclean-local distclean-recursive dist dist-local dist-recursive	\
check check-local check-recursive build-testdlls build-basetestdata build-local

## Clear suffix list
.SUFFIXES :

## List of standard targets
all: all-recursive
install: install-recursive
clean: clean-local clean-recursive
distclean : distclean-recursive
dist: dist-recursive 
check: all check-recursive

## Recursive targets
all-recursive install-recursive clean-recursive distclean-recursive dist-recursive check-recursive:
	@dot_seen=no; \
	target=`echo $@ | sed s/-recursive//`; \
	list='$(SUBDIRS)'; for subdir in $$list; do \
	  echo "Making $$target in $$subdir"; \
	  if test "$$subdir" = "."; then \
	    dot_seen=yes; \
	    local_target="$$target-local"; \
	  else \
	    local_target="$$target"; \
	  fi; \
	  (cd $$subdir && $(MAKE) $$local_target) || exit; \
	done; \
	if test "$$dot_seen" = "no"; then \
	  $(MAKE) "$$target-local" || exit; \
	fi

all-local: build-local

DAT_FILES=uprops.dat unames.dat cnvalias.dat tz.dat
# ALL of these files can be deleted (the following BRK files) - they are copied
BRK_FILES=char.brk line.brk line_th.brk sent.brk word.brk word_th.brk
# don't include thaidict.brk - it goes into a resource bundle - plus it isn't deleted

DATAFILESD=$(DAT_FILES:%=$(OBJDATADIR)/%)
DATAFILESB=$(BRK_FILES:%=$(OBJDATADIR)/%)

# copy the right endianness

ifeq (@U_IS_BIG_ENDIAN@,1)
$(OBJDATADIR)/%.brk: $(SRCDATADIR)/%BE.brk
	cp $< $@
else
$(OBJDATADIR)/%.brk: $(SRCDATADIR)/%LE.brk
	cp $< $@
endif

include $(srcdir)/makeconv/ucmfiles.mk
-include $(srcdir)/makeconv/ucmlocal.mk
ALL_UCM_SOURCE= $(UCM_SOURCE) $(UCM_SOURCE_LOCAL)

include $(srcdir)/genrb/genrbfiles.mk
-include $(srcdir)/genrb/reslocal.mk
ALL_RES_SOURCE= $(GENRB_SOURCE) $(TRANSLIT_SOURCE) $(RESOURCE_SRC) $(GENRB_SOURCE_LOCAL)

UCM_FILES = $(ALL_UCM_SOURCE:%=$(SRCDATADIR)/%)
CNV_FILES = $(ALL_UCM_SOURCE:%.ucm=$(OBJDATADIR)/%.cnv)
CNV_FILESL = $(ALL_UCM_SOURCE:%.ucm=%.cnv)

RES_SRC_FILES = $(ALL_RES_SOURCE:%=$(SRCDATADIR)/%)
RES_FILES = $(ALL_RES_SOURCE:%.txt=$(OBJDATADIR)/%.res)
RES_FILESL = $(ALL_RES_SOURCE:%.txt=%.res)

DATAFILESC=$(CNV_FILES)
DATAFILESR=$(RES_FILES)

DATAFILES=$(DATAFILESD) $(CNV_FILES) $(DATAFILESB) $(RES_FILES)
DATAFILESL=$(DAT_FILES) $(CNV_FILESL) $(BRK_FILES) $(RES_FILESL)


## Files to remove for 'make clean'
CLEANFILES = *~ $(BRK_FILES)

install-udata: install-pkgdata
	$(MKINSTALLDIRS) $(DESTDIR)$(pkgsysconfdir)
	$(INSTALL_DATA) $(top_srcdir)/../data/convrtrs.txt $(DESTDIR)$(pkgsysconfdir)

install-local: all-local install-udata

dist-local:

clean-local: clean-pkgdata
	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
	$(RMV) $(SRCDATAFILES)
	$(RMV) $(DATAFILES)
	$(RMV) icupkg.inc
	-@if [ -f $(TMPDATADIR)/icudata_dll.mak ]; then \
		(cd pkgdata ; $(INVOKE) ./pkgdata -T $(TMPDATADIR) -m dll -p icudata -O $(DATABUILDDIR)/icupkg.inc $(TMPDATADIR)/icudata.lst -d $(DATABUILDDIR) --clean ) \
	fi
	-@if [ -f $(TMPDATADIR)/icudata_common.mak ]; then \
		(cd pkgdata; $(INVOKE) ./pkgdata -T $(TMPDATADIR) -m common -p icudata -O $(DATABUILDDIR)/icupkg.inc $(TMPDATADIR)/icudata.lst -d $(DATABUILDDIR) --clean ) \
	fi
	-@$(RMV) $(TMPDATADIR) $(TMPDATADIR)2

# Clean up any old variations.. 
distclean-local: clean-local
	$(RMV) Makefile

$(TMPDATADIR)/icudata.lst: Makefile $(srcdir)/Makefile.in $(srcdir)/genrb/genrbfiles.mk $(srcdir)/makeconv/ucmfiles.mk
	@echo Generating $@ list of data files
	@$(MKINSTALLDIRS) $(TMPDATADIR)
	@-$(RMV) $(TMPDATADIR)/icudata.lst
	@for file in $(DATAFILESL); do \
	  echo $(OBJDATADIR)/$$file >> $(TMPDATADIR)/icudata.lst; \
	done;

$(TMPDATADIR)/testdata.lst: Makefile
	@$(MKINSTALLDIRS) $(TMPDATADIR)
	@echo $(DATABUILDDIR)/test.dat > $@

$(TMPDATADIR)2/testdata.lst: Makefile $(top_builddir)/test/testdata/root.res
	@$(MKINSTALLDIRS) $(TMPDATADIR)2
	@echo $(DATABUILDDIR)/test.dat > $@
	@echo $(DATABUILDDIR)/../test/testdata/root.res >> $@

$(TMPDATADIR)/icupkg.inc: pkgdata/icupkg.inc
	@$(MKINSTALLDIRS) $(TMPDATADIR)
	cp pkgdata/icupkg.inc $(TMPDATADIR)/icupkg.inc

$(TMPDATADIR)2/icupkg.inc: pkgdata/icupkg.inc
	@$(MKINSTALLDIRS) $(TMPDATADIR)2
	cp pkgdata/icupkg.inc $(TMPDATADIR)2/icupkg.inc

# build the ICU and test data

build-local build-pkgdata: $(TMPDATADIR)/icudata.lst $(TMPDATADIR)/testdata.lst  $(TMPDATADIR)/icupkg.inc $(TMPDATADIR)2/icupkg.inc $(TMPDATADIR)2/testdata.lst $(DATAFILES) $(top_builddir)/test/testdata/root.res
	@$(MKINSTALLDIRS) $(TMPDATADIR)
	@$(MKINSTALLDIRS) $(TMPDATADIR)2
	(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -p icudata ./icudata.lst   )
	(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -p testdat1  ./testdata.lst )
	(cd $(TMPDATADIR)2; $(INVOKE) $(PKGDATA) -p testdat2  ./testdata.lst )

install-pkgdata: $(TMPDATADIR)/icudata.lst $(TMPDATADIR)/icupkg.inc
	$(MKINSTALLDIRS) $(TMPDATADIR) $(DESTDIR)$(pkglibdir)/$(VERSION)
	(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -p icudata ./icudata.lst -I $(DESTDIR)$(pkglibdir)/$(VERSION))

clean-pkgdata:
	-(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -p icudata ./icudata.lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' )
	-(cd $(TMPDATADIR); $(INVOKE) $(PKGDATA) -p testdat1  ./testdata.lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' )
	-(cd $(TMPDATADIR)2; $(INVOKE) $(PKGDATA) -p testdat2  ./testdata.lst --clean || echo '### Warning, cannot clean up icu/data if pkgdata is already gone.' )
	-$(RMV) $(TMPDATADIR)/icudata.lst $(TMPDATADIR)/testdata.lst $(TMPDATADIR)/icupkg.inc $(TMPDATADIR)2/testdata.lst

check-local:

Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
	cd $(top_builddir) \
	&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status

