# 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 = $(prefix)
libdir = $(exec_prefix)/lib
includedir = $(prefix)/include
mandir = $(prefix)/man

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

# Programs used by "make install":
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@

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

SHELL = /bin/sh

all : force
	builddir="`pwd`"; cd libcharset && $(MAKE) -r all && $(MAKE) -r install-lib libdir="$$builddir/lib" includedir="$$builddir/lib"
	cd lib && $(MAKE) -r all
	cd src && $(MAKE) -r all
	cd man && $(MAKE) -r all
	if test -d tests; then cd tests && $(MAKE) -r all; fi

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

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

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

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

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

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

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

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

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

force :

