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

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

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

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

mostlyclean : force
	cd src; $(MAKE) -r mostlyclean
	cd man; $(MAKE) -r mostlyclean
	if test -d tests; then cd tests; $(MAKE) -r mostlyclean; fi

clean : force
	cd src; $(MAKE) -r clean
	cd man; $(MAKE) -r clean
	if test -d tests; then cd tests; $(MAKE) -r clean; fi

distclean : force
	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 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 :

