# Makefile for libiconv

#### 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@
datadir = @datadir@
libdir = @libdir@
includedir = @includedir@
mandir = @mandir@

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

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

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

SHELL = /bin/sh

all : lib/localcharset.h force
	cd lib && $(MAKE) all
	cd srclib && $(MAKE) all
	cd src && $(MAKE) all
	cd po && $(MAKE) all
	cd man && $(MAKE) all
	if test -d tests; then cd tests && $(MAKE) all; fi

lib/localcharset.h :
	builddir="`pwd`"; cd libcharset && $(MAKE) all && $(MAKE) install-lib libdir="$$builddir/lib" includedir="$$builddir/lib"

# 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)'
	if [ ! -d $(includedir) ] ; then $(mkinstalldirs) $(includedir) ; fi
	$(INSTALL_DATA) include/iconv.h $(includedir)/iconv.h

install : lib/localcharset.h force
	cd libcharset && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd lib && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd srclib && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd src && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	if [ ! -d $(DESTDIR)$(prefix) ] ; then $(mkinstalldirs) $(DESTDIR)$(prefix) ; fi
	if [ ! -d $(DESTDIR)$(exec_prefix) ] ; then $(mkinstalldirs) $(DESTDIR)$(exec_prefix) ; fi
	if [ ! -d $(DESTDIR)$(includedir) ] ; then $(mkinstalldirs) $(DESTDIR)$(includedir) ; fi
	$(INSTALL_DATA) include/iconv.h $(DESTDIR)$(includedir)/iconv.h
	cd po && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)'
	cd man && $(MAKE) install prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)' mandir='$(mandir)'

installdirs : force
	cd libcharset && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd lib && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd srclib && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd src && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	if [ ! -d $(DESTDIR)$(prefix) ] ; then $(mkinstalldirs) $(DESTDIR)$(prefix) ; fi
	if [ ! -d $(DESTDIR)$(exec_prefix) ] ; then $(mkinstalldirs) $(DESTDIR)$(exec_prefix) ; fi
	if [ ! -d $(DESTDIR)$(includedir) ] ; then $(mkinstalldirs) $(DESTDIR)$(includedir) ; fi
	cd po && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)'
	cd man && $(MAKE) installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)' mandir='$(mandir)'

uninstall : force
	cd libcharset && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd lib && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd srclib && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	cd src && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(RM) $(DESTDIR)$(includedir)/iconv.h
	cd po && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)'
	cd man && $(MAKE) uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' datadir='$(datadir)' mandir='$(mandir)'

check : all force
	cd libcharset && $(MAKE) check
	cd lib && $(MAKE) check
	cd srclib && $(MAKE) check
	cd src && $(MAKE) check
	cd po && $(MAKE) check
	cd man && $(MAKE) check
	if test -d tests; then cd tests && $(MAKE) check; fi

mostlyclean : force
	cd libcharset && $(MAKE) mostlyclean
	$(RM) lib/charset.alias lib/libcharset.* lib/localcharset.h
	cd lib && $(MAKE) mostlyclean
	cd srclib && $(MAKE) mostlyclean
	cd src && $(MAKE) mostlyclean
	cd po && $(MAKE) mostlyclean
	cd man && $(MAKE) mostlyclean
	if test -d tests; then cd tests && $(MAKE) mostlyclean; fi

clean : force
	cd libcharset && $(MAKE) clean
	$(RM) lib/charset.alias lib/libcharset.* lib/localcharset.h
	cd lib && $(MAKE) clean
	cd srclib && $(MAKE) clean
	cd src && $(MAKE) clean
	cd po && $(MAKE) clean
	cd man && $(MAKE) clean
	if test -d tests; then cd tests && $(MAKE) clean; fi

distclean : force
	cd libcharset && if test -f Makefile; then $(MAKE) distclean; fi
	$(RM) lib/charset.alias lib/libcharset.* lib/localcharset.h
	cd lib && if test -f Makefile; then $(MAKE) distclean; fi
	cd srclib && if test -f Makefile; then $(MAKE) distclean; fi
	cd src && if test -f Makefile; then $(MAKE) distclean; fi
	cd po && if test -f Makefile; then $(MAKE) distclean; fi
	cd man && if test -f Makefile; then $(MAKE) distclean; fi
	if test -d tests; then cd tests && if test -f Makefile; then $(MAKE) distclean; fi; fi
	$(RM) config.status config.log config.cache Makefile libtool
	$(RM) config.h stamp-h1 lib/stamp-h2
	$(RM) include/iconv.h

maintainer-clean : force
	cd libcharset && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	$(RM) lib/charset.alias lib/libcharset.* lib/localcharset.h
	cd lib && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	cd srclib && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	cd src && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	cd po && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	cd man && if test -f Makefile; then $(MAKE) maintainer-clean; fi
	if test -d tests; then cd tests && if test -f Makefile; then $(MAKE) maintainer-clean; fi; fi
	$(RM) config.status config.log config.cache Makefile libtool
	$(RM) config.h stamp-h1 lib/stamp-h2
	$(RM) include/iconv.h

force :

# Work around an automake-1.8 bug.
am--refresh:
