## pkgdataMakefile.in for ICU data
## Copyright (c) 2008-2012, International Business Machines Corporation and
## others. All Rights Reserved.

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

# So that you have $(top_builddir)/config.status
top_builddir = ../..

## All the flags and other definitions are included here.
include $(top_builddir)/icudefs.mk

MIDDLE_SO_TARGET=

OUTPUTFILE=pkgdata.inc

all : clean 
	@echo GENCCODE_ASSEMBLY_TYPE=$(GENCCODE_ASSEMBLY) >> $(OUTPUTFILE)
	@echo SO=$(SO) >> $(OUTPUTFILE)
	@echo SOBJ=$(SOBJ) >> $(OUTPUTFILE)
	@echo A=$(A) >> $(OUTPUTFILE)
	@echo LIBPREFIX=$(LIBPREFIX)$(STATIC_PREFIX_WHEN_USED) >> $(OUTPUTFILE)
	@echo LIB_EXT_ORDER=$(FINAL_SO_TARGET) >> $(OUTPUTFILE)
	@echo COMPILE="$(COMPILE.c)" >> $(OUTPUTFILE)
	@echo LIBFLAGS="-I$(top_srcdir)/common -I$(top_builddir)/common $(SHAREDLIBCPPFLAGS) $(SHAREDLIBCFLAGS)" >> $(OUTPUTFILE)
	@echo GENLIB="$(SHLIB.c)" >> $(OUTPUTFILE)
	@echo LDICUDTFLAGS=$(LDFLAGSICUDT) >> $(OUTPUTFILE)
	@echo LD_SONAME=$(LD_SONAME) >> $(OUTPUTFILE)
	@echo RPATH_FLAGS=$(RPATH_FLAGS) >> $(OUTPUTFILE)
	@echo BIR_LDFLAGS=$(BIR_LDFLAGS) >> $(OUTPUTFILE)
	@echo AR=$(AR) >> $(OUTPUTFILE)
	@echo ARFLAGS=$(ARFLAGS) >> $(OUTPUTFILE)
	@echo RANLIB=$(RANLIB) >> $(OUTPUTFILE)
	@echo INSTALL_CMD=$(INSTALL_DATA) >> $(OUTPUTFILE)

clean : 
	$(RMV) $(OUTPUTFILE)

