# 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@/autoconf/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 :

