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

## 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 = tools/gencol

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

## Target information
TARGET = gencol

DEFS = @DEFS@
CPPFLAGS = @CPPFLAGS@ -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n
CFLAGS = @CFLAGS@
CXXFLAGS = @CXXFLAGS@
LDFLAGS = @LDFLAGS@ \
$(LD_RPATH)$(LD_RPATH_PRE)$(libdir)@ld_rpath_suf@$(LD_RPATH_PRE)$(top_builddir)/common@ld_rpath_suf@$(LD_RPATH_PRE)$(top_builddir)/i18n
LIBS = $(LIBICU-UC) $(LIBICU-I18N) @LIBS@ @LIB_M@

OBJECTS = gencol.o

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

## List of phony targets
.PHONY : all all-local install install-local clean clean-local		\
distclean distclean-local clean-sentinel force-build-data 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) build-data

## only rebuild if ANY .RES FILES CHANGE

## List of resource bundles to build
RES_BUNDLES = ar.res ar_AE.res ar_BH.res ar_DZ.res ar_EG.res ar_IQ.res  \
ar_JO.res ar_KW.res ar_LB.res ar_LY.res ar_MA.res ar_OM.res ar_QA.res   \
ar_SA.res ar_SD.res ar_SY.res ar_TN.res ar_YE.res be.res be_BY.res      \
bg.res bg_BG.res ca.res ca_ES.res ca_ES_EURO.res cs.res cs_CZ.res       \
da.res da_DK.res de.res de_AT.res de_AT_EURO.res de_CH.res de_DE.res    \
de_DE_EURO.res de_LU.res de_LU_EURO.res el.res el_GR.res en.res         \
en_AU.res en_BE.res en_CA.res en_GB.res en_IE.res en_IE_EURO.res        \
en_NZ.res en_US.res en_ZA.res es.res es_AR.res es_BO.res es_CL.res      \
es_CO.res es_CR.res es_DO.res es_EC.res es_ES.res es_ES_EURO.res        \
es_GT.res es_HN.res es_MX.res es_NI.res es_PA.res es_PE.res es_PR.res   \
es_PY.res es_SV.res es_UY.res es_VE.res et.res et_EE.res fi.res         \
fi_FI.res fi_FI_EURO.res fr.res fr_BE.res fr_BE_EURO.res fr_CA.res      \
fr_CH.res fr_FR.res fr_FR_EURO.res fr_LU.res fr_LU_EURO.res hr.res      \
hr_HR.res hu.res hu_HU.res is.res is_IS.res it.res it_CH.res it_IT.res  \
it_IT_EURO.res iw.res iw_IL.res ja.res ja_JP.res ko.res ko_KR.res       \
lt.res lt_LT.res lv.res lv_LV.res mk.res mk_MK.res nl.res nl_BE.res     \
nl_BE_EURO.res nl_NL.res nl_NL_EURO.res no.res no_NO.res no_NO_NY.res   \
pl.res pl_PL.res pt.res pt_BR.res pt_PT.res pt_PT_EURO.res ro.res       \
ro_RO.res ru.res ru_RU.res sh.res sh_YU.res sk.res sk_SK.res sl.res     \
sl_SI.res sq.res sq_AL.res sr.res sr_YU.res sv.res sv_SE.res th.res     \
th_TH.res tr.res tr_TR.res uk.res uk_UA.res vi.res vi_VN.res zh.res     \
zh_CN.res zh_HK.res zh_TW.res root.res index.res

RES_FILES = $(RES_BUNDLES:%=@DATABUILDDIR@/%)

build-data: .sentinel

.sentinel: $(RES_FILES)
	@echo "Creating binary collation files (may take a while)"
	@ICU_DATA=@DATABUILDDIR@/ ./$(TARGET) > /dev/null 2>&1	
	@touch .sentinel

force-build-data: clean-sentinel build-data
clean-sentinel:
	$(RMV) .sentinel

install-local: all-local
#	$(mkinstalldirs) $(DESTDIR)$(sbindir)
#	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET)
	$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/$(VERSION)
	cp @DATABUILDDIR@/*.col $(DESTDIR)$(pkgdatadir)/$(VERSION)

dist-local:

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

distclean-local: clean-local clean-sentinel
	$(RMV) Makefile $(DEPS) $(CNV_FILES)
	$(RMV) @DATABUILDDIR@/*.col

check-local:

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

$(TARGET) : $(OBJECTS)
	$(LINK.c) -o $@ $^ $(LIBS)

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