# Makefile for libcharset

#### Start of system configuration section. ####


# Directories used by "make":
srcdir = @srcdir@

# Directories used by "make install":
prefix = @prefix@
local_prefix = /usr/local
exec_prefix = @exec_prefix@
datarootdir = @datarootdir@
datadir = @datadir@
libdir = @libdir@
includedir = @includedir@
mandir = @mandir@

# Programs used by "make":
CP = cp
RM = rm -f
@SET_MAKE@

# Programs used by "make install":
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
mkinstalldirs = $(SHELL) @top_srcdir@/build-aux/mkinstalldirs

#### End of system configuration section. ####

SHELL = /bin/sh

all : include/libcharset.h force
	cd lib && $(MAKE) all

include/libcharset.h :
	if [ ! -d include ] ; then mkdir include ; fi
	$(CP) $(srcdir)/include/libcharset.h.in include/libcharset.h

# Installs the library and include files only. Typically called with only
# $(libdir) and $(includedir) - don't use $(prefix) and $(exec_prefix) here.
install-lib : all force
	cd lib && $(MAKE) install-lib libdir='$(libdir)' includedir='$(includedir)'
	$(mkinstalldirs) $(includedir)
	$(INSTALL_DATA) include/libcharset.h $(includedir)/libcharset.h
	$(INSTALL_DATA) include/localcharset.h.inst $(includedir)/localcharset.h

install : include/libcharset.h include/localcharset.h force
	cd lib && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(mkinstalldirs) $(DESTDIR)$(includedir)
	$(INSTALL_DATA) include/libcharset.h $(DESTDIR)$(includedir)/libcharset.h
	$(INSTALL_DATA) include/localcharset.h.inst $(DESTDIR)$(includedir)/localcharset.h

install-strip : install

installdirs : force
	cd lib && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(mkinstalldirs) $(DESTDIR)$(includedir)

uninstall : force
	cd lib && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(RM) $(DESTDIR)$(includedir)/libcharset.h
	$(RM) $(DESTDIR)$(includedir)/localcharset.h

check : force
	cd lib && $(MAKE) check

mostlyclean : force
	cd lib && $(MAKE) mostlyclean

clean : force
	cd lib && $(MAKE) clean

distclean : force
	cd lib && if test -f Makefile; then $(MAKE) distclean; fi
	$(RM) include/libcharset.h include/localcharset.h include/localcharset.h.inst
	$(RM) config.status config.log config.cache Makefile config.h libtool

maintainer-clean : force
	cd lib && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	$(RM) include/libcharset.h include/localcharset.h include/localcharset.h.inst
	$(RM) config.status config.log config.cache Makefile config.h libtool

# List of source files.
SOURCE_FILES = \
  README README.windows DEPENDENCIES HACKING INTEGRATE AUTHORS NEWS \
  ChangeLog Makefile.devel configure.ac Makefile.in \
  include/export.h include/libcharset.h.in include/localcharset.h.in \
  tools/README \
  tools/all-charsets tools/all-charsets-X11 tools/all-locales \
  tools/locale_charmap \
  tools/locale_charset.c \
  tools/locale_codeset.c \
  tools/locale_monthnames.c \
  tools/locale_x11encoding.c \
  tools/aix-3.2.5 tools/aix-4.1.5 tools/aix-4.2.0 tools/aix-4.3.2 \
  tools/beos-5 \
  tools/cygwin-1.7.2 \
  tools/darwin-6.8 tools/darwin-7.5 tools/darwin-9.5 \
  tools/freebsd-3.3 \
  tools/glibc-2.1.3 tools/glibc-2.1.90 tools/glibc-2.2 \
  tools/glibc-2.2-XF86-3.3.6 tools/glibc-2.2-XF86-4.0.1f \
  tools/hpux-10.01 tools/hpux-10.20 tools/hpux-11.00 \
  tools/irix-6.5 \
  tools/netbsd-3.0 \
  tools/openbsd-4.1 \
  tools/osf1-4.0a tools/osf1-4.0d tools/osf1-5.1 \
  tools/solaris-2.4 tools/solaris-2.5.1 tools/solaris-2.6 tools/solaris-2.6-cjk tools/solaris-2.7 \
  tools/sunos-4.1.4 \
  tools/win32 \
  README.djgpp \
  djgpp/config.bat djgpp/config.sed djgpp/config.site \
  djgpp/fnchange.in djgpp/fnchange.lst \
  djgpp/Makefile.maint \
  djgpp/README djgpp/README.in
# List of distributed files imported from other packages.
LIBTOOL_IMPORTED_FILES = \
  build-aux/ltmain.sh \
  m4/libtool.m4 \
  m4/lt~obsolete.m4 \
  m4/ltoptions.m4 \
  m4/ltsugar.m4 \
  m4/ltversion.m4
PARENT_IMPORTED_FILES = \
  INSTALL.generic \
  build-aux/config.guess \
  build-aux/config.libpath \
  build-aux/config.sub \
  build-aux/install-sh \
  build-aux/mkinstalldirs \
  m4/codeset.m4 \
  m4/fcntl-o.m4 \
  m4/glibc21.m4 \
  m4/relocatable-lib.m4 \
  m4/visibility.m4
IMPORTED_FILES = \
  COPYING.LIB \
  $(LIBTOOL_IMPORTED_FILES) $(PARENT_IMPORTED_FILES)
# List of distributed files generated by autotools or Makefile.devel.
GENERATED_FILES = \
  autoconf/aclocal.m4 configure config.h.in \
  include/localcharset.h.build.in
# List of distributed files generated by "make".
DISTRIBUTED_BUILT_FILES =
# List of distributed files.
DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES)

distdir : $(DISTFILES)
	for file in $(DISTFILES); do \
	  if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \
	  destdir=`echo '$(distdir)'/$$file | sed -e 's|//*[^/]*$$||'`; \
	  test -d "$$destdir" || mkdir "$$destdir"; \
	  cp -p "$$dir/$$file" '$(distdir)'/$$file || exit 1; \
	done
	test -d '$(distdir)'/lib || mkdir '$(distdir)'/lib; cd lib && $(MAKE) distdir distdir='$(distdir)'/lib

force :

