# 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
# Here, use the include file that contains LIBCHARSET_DLL_EXPORTED annotations.
	$(INSTALL_DATA) include/localcharset.h $(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/libtool-reloc \
  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 :

