## Makefile.in for ICU - icu-i18n.so
## 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@

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

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

## Compiler/tools information
CC = @CC@
CXX = @CXX@
PACKAGE = @PACKAGE@
VERSION = @VERSION@

## Platform-specific setup
@host_frag@

## Build directory information
top_builddir = ..
subdir = i18n

## Extra files to remove for 'make clean'
CLEANFILES = *~

## Target information
TARGET = $(LIBICU)i18n.$(SO)

DEFS = @DEFS@
CPPFLAGS = @CPPFLAGS@ -I$(srcdir) -I$(top_builddir)/common -I$(top_srcdir)/common
CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@
LDFLAGS = @LDFLAGS@ $(LD_RPATH)$(LD_RPATH_PRE)$(libdir)
LIBS = $(LIBICU-UC) @LIBS@

OBJECTS = brkiter.o calendar.o chbkdat.o choicfmt.o colcache.o \
coleitr.o coll.o colrules.o cpdtrans.o datefmt.o dcfmtsym.o decimfmt.o \
dtfmtsym.o fmtable.o format.o gregocal.o hextouni.o lnbkdat.o \
mergecol.o msgfmt.o numfmt.o ptnentry.o rbt.o rbt_data.o rbt_pars.o \
rbt_rule.o rbt_set.o simpletz.o smpdtfmt.o snbkdat.o \
sortkey.o tables.o tblcoll.o tcoldata.o timezone.o translit.o \
txtbdat.o txtbdry.o ubrk.o ucal.o ucol.o udat.o umsg.o unicdcm.o \
unifltlg.o unirange.o uniset.o unitohex.o unum.o wdbkdat.o wdbktbl.o \
dbbi.o dbbi_tbl.o rbbi.o rbbi_tbl.o brkdict.o nultrans.o jamohang.o hangjamo.o

DEPS = $(OBJECTS:.o=.d)

## Header files to install
HEADERS= $(srcdir)/unicode/*.h

## List of phony targets
.PHONY : all all-local install install-local clean clean-local	\
distclean distclean-local install-library install-headers dist	\
dist-local check check-local

## Clear suffix list
.SUFFIXES :

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

all-local: $(TARGET)

install-local: install-headers install-library 

install-library: all-local
	$(mkinstalldirs) $(DESTDIR)$(libdir)
	$(INSTALL-S) $(TARGET) $(DESTDIR)$(libdir)/$(TARGET)

install-headers:
	$(mkinstalldirs) $(DESTDIR)$(includedir)/unicode
	@for file in $(HEADERS); do \
	 echo " $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/unicode"; \
	 $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/unicode || exit; \
	done

dist-local:

clean-local:
	test -z "$(CLEANFILES)" || $(RMV) $(CLEANFILES)
	$(RMV) $(OBJECTS) $(TARGET)

distclean-local: clean-local
	$(RMV) Makefile $(DEPS)

check-local:

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

$(TARGET) : $(OBJECTS)
	$(SHLIB.cc) -o $@ $^ $(LIBS)

ifeq (,$(MAKECMDGOALS))
-include $(DEPS)
else
ifneq ($(patsubst %clean,,$(MAKECMDGOALS)),)
-include $(DEPS)
endif
endif
