## Makefile.in for ICU - tools/genrb
## 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/genrb

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

## Target information
TARGET = genrb

DEFS = @DEFS@
CPPFLAGS = @CPPFLAGS@ -I$(top_builddir)/common -I$(top_srcdir)/common -I$(top_srcdir)/i18n -I$(top_srcdir)/extra/ustdio -I$(srcdir)/../toolutil
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@ld_rpath_suf@$(LD_RPATH_PRE)$(top_builddir)/tools/toolutil@ld_rpath_suf@$(LD_RPATH_PRE)$(top_builddir)/extra/ustdio
LIBS = $(LIBICU-UC) $(LIBICU-I18N) @LIBS@ @LIB_M@  $(LIBICU-TOOLUTIL) -L$(top_builddir)/extra/ustdio -lustdio

OBJECTS = error.o genrb.o ustr.o parse.o read.o write.o list.o	\
rblist.o  util.o

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

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

TRANSLIT_SOURCE = kbdescl1.txt larabic.txt ldevan.txt \
lgreek.txt fullhalf.txt lhebrew.txt lkana.txt lcyril.txt       \
quotes.txt ucname.txt index.txt ljamo.txt

TXT_FILES = $(TXT_SOURCE:%=$(top_srcdir)/../data/%)
RES_FILES = $(TXT_FILES:$(top_srcdir)/../data/%.txt=@DATABUILDDIR@/%.res)
TRANSLIT_FILES = $(TRANSLIT_SOURCE:%=$(top_srcdir)/../data/translit/%)
TRANSLIT_RES = $(TRANSLIT_SOURCE:%.txt=@DATABUILDDIR@/translit/%.res)
TEST_FILES = @DATABUILDDIR@/../source/test/testdata/default.res \
@DATABUILDDIR@/../source/test/testdata/te.res \
@DATABUILDDIR@/../source/test/testdata/te_IN.res

## List of phony targets
.PHONY : all all-local install install-local clean clean-local		\
distclean distclean-local 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) $(RES_FILES) $(TRANSLIT_RES) $(TEST_FILES)

install-local: all-local
	$(mkinstalldirs) $(DESTDIR)$(sbindir)
	$(INSTALL) $(TARGET) $(DESTDIR)$(sbindir)/$(TARGET)
	$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/$(VERSION)
	@list='$(notdir $(RES_FILES))'; for file in $$list; do \
		echo $(INSTALL_DATA) @DATABUILDDIR@/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/$$file; \
		$(INSTALL_DATA) @DATABUILDDIR@/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/$$file; \
	done
	$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/$(VERSION)/translit
	@list='$(notdir $(TRANSLIT_RES))'; for file in $$list; do \
		echo $(INSTALL_DATA) @DATABUILDDIR@/translit/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/translit/$$file; \
		$(INSTALL_DATA) @DATABUILDDIR@/translit/$$file $(DESTDIR)$(pkgdatadir)/$(VERSION)/translit/$$file; \
	done

dist-local:

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

distclean-local: clean-local
	rm -f Makefile $(DEPS) $(RES_FILES) $(TEST_FILES)

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) 

## Rule to build a compiled res file.
## Note the order of the next three rules here is important!

@DATABUILDDIR@/../source/test/testdata/%.res : $(top_srcdir)/test/testdata/%.txt
	@echo "Creating testdata resource file for $<"
	@ICU_DATA=@DATABUILDDIR@ ./genrb -D@DATABUILDDIR@/../source/test/testdata/ $<

@DATABUILDDIR@/translit/%.res : $(top_srcdir)/../data/translit/%.txt
	@echo "Creating translit resource file for $<"
	@ICU_DATA=@DATABUILDDIR@ ./genrb -D@DATABUILDDIR@/translit/ $<

@DATABUILDDIR@/%.res : $(top_srcdir)/../data/%.txt
	@echo "Creating compiled resource file for $<"
	@ICU_DATA=@DATABUILDDIR@ ./genrb -D@DATABUILDDIR@/ $<


# the 'mv' will always fail if you are building in the source dir


ifneq ($(MAKECMDGOALS),distclean)
-include $(DEPS)
endif


all-local:
install-local:



