#******************************************************************************
#
#   Copyright (C) 1998-2000, International Business Machines
#   Corporation and others.  All Rights Reserved.
#
#******************************************************************************
## Top-level Makefile.in for ICU
## Stephen F. Booth

## Shell to use
SHELL = @SHELL@

## Install directory information
srcdir = @srcdir@
top_srcdir = @top_srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@

bindir = @bindir@
sbindir = @sbindir@
datadir = @datadir@
libdir = @libdir@
includedir = @includedir@

pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@

## Build directory information
top_builddir = .

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

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

AUTOCONF = @AUTOCONF@

## Pacakge information
PACKAGE = @PACKAGE@
VERSION = @VERSION@
UNICODE_VERSION = @UNICODE_VERSION@

## Optional directory setup
@EXTRAS_TRUE@EXTRA = extra
@EXTRAS_FALSE@EXTRA = 
@TESTS_TRUE@TEST = test
@TESTS_FALSE@TEST = 
@SAMPLES_TRUE@SAMPLE = samples
@SAMPLES_FALSE@SAMPLE = 

## Files to remove for 'make clean'
CLEANFILES = *~ 

DOCDIRS = common i18n
SUBDIRS = common i18n $(EXTRA) tools $(TEST) $(SAMPLE)

## Extra files to install
EXTRA_DATA = convrtrs.txt UnicodeData-$(UNICODE_VERSION).txt

## List of phony targets
.PHONY : all all-local all-recursive install install-local install-udata install-udata-files install-udata-dlls		\
install-recursive clean clean-local clean-recursive distclean		\
distclean-local distclean-recursive doc dist dist-local dist-recursive	\
check check-local check-recursive builddata

## Clear suffix list
.SUFFIXES :

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

## 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 1; \
	fi

all-local: $(srcdir)/configure builddata

install-local:
	@for file in $(EXTRA_DATA); do \
	  echo $(INSTALL_DATA) $(top_srcdir)/../data/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/$$file; \
	  $(INSTALL_DATA) $(top_srcdir)/../data/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/$$file || exit; \
	done
	$(INSTALL_DATA) $(top_builddir)/config/Makefile $(DESTDIR)$(pkgdatadir)/Makefile.inc
	$(INSTALL_SCRIPT) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(sbindir)/mkinstalldirs

## Generate HTML documentation
doc:
	@uniq=`date '+%y%m%d9/30/99M%S'`; \
	tmpdir="/tmp/icu-$$uniq"; \
	list='$(DOCDIRS)'; for subdir in $$list; do \
	  echo "Making install-headers in $$subdir"; \
	  (cd $$subdir && \
		$(MAKE) includedir=$$tmpdir/include install-headers); \
	done; \
	echo "Generating html documentation..."; \
	doc++ -H -d $$tmpdir/html $$tmpdir/include/*.h > /dev/null 2>&1; \
	rm -rf $$tmpdir

dist-local:

clean-local:
	test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)

distclean-local:
	rm -f Makefile config.cache config.log config.status config/Makefile
	rm -f common/unicode/platform.h common/icucfg.h

check-local:

#$(srcdir)/configure : $(srcdir)/configure.in $(top_srcdir)/aclocal.m4
#	cd $(srcdir) && $(AUTOCONF)

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

config.status: $(srcdir)/configure
	$(SHELL) ./config.status --recheck

builddata: @DATABUILDDIR@/UnicodeData-$(UNICODE_VERSION).txt @DATABUILDDIR@/thaidict.brk @DATABUILDDIR@/../source/test/testdata/default.goo

@DATABUILDDIR@/UnicodeData-$(UNICODE_VERSION).txt: $(srcdir)/../data/UnicodeData-$(UNICODE_VERSION).txt
	ln -s `pwd`/$< @DATABUILDDIR@

@DATABUILDDIR@/thaidict.brk: $(srcdir)/../data/thaidict.brk
	ln -s `pwd`/$< @DATABUILDDIR@

@DATABUILDDIR@/../source/test/testdata/default.goo: $(srcdir)/test/testdata/default.goo
	ln -s `pwd`/$(srcdir)/test/testdata/*.goo `pwd`/$(srcdir)/test/testdata/*.txt `pwd`/$(srcdir)/test/testdata/*.uni  @DATABUILDDIR@/../source/test/testdata/


