# 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 = @SHELL@

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

# 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.inst $(includedir)/libcharset.h
	$(INSTALL_DATA) include/localcharset.h.inst $(includedir)/localcharset.h

install : all force
	cd lib && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(mkinstalldirs) $(DESTDIR)$(includedir)
	$(INSTALL_DATA) include/libcharset.h.inst $(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 DEPENDENCIES INSTALL.windows 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
# 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/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/libcharset.h.build.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 :

