# Makefile for libiconv

#### Start of system configuration section. ####

# Flags that can be set on the nmake command line:
#   DLL=1     for compiling a .dll with a stub .lib (default is a static .lib)
#             Note that this works only with MFLAGS=-MD.
#   MFLAGS={-ML|-MT|-MD} for defining the compilation model
#     MFLAGS=-ML (the default)  Single-threaded, statically linked - libc.lib
#     MFLAGS=-MT                Multi-threaded, statically linked  - libcmt.lib
#     MFLAGS=-MD                Multi-threaded, dynamically linked - msvcrt.lib
#   DEBUG=1   for compiling with debugging information
# Note that nmake command line flags are automatically passed to subdirectory
# Makefiles. Therefore we don't need to pass them explicitly to subdirectory
# Makefiles, but the subdirectory Makefiles need to have the same defaults.
!if !defined(DLL)
DLL=0
!endif
!if !defined(DEBUG)
DEBUG=0
!endif
!if !defined(MFLAGS)
!if !$(DLL)
MFLAGS=
!else
MFLAGS=-MD
!endif
!endif

# Directories used by "make install":
prefix = /usr/local
local_prefix = /usr/local
exec_prefix = $(prefix)
libdir = $(exec_prefix)/lib
includedir = $(prefix)/include
mandir = $(prefix)/man

# Programs used by "make":
LN = copy
RM = del

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

SHELL = /bin/sh

all : force
	cd libcharset
	$(MAKE) -f Makefile.msvc all
	cd ..
	$(LN) libcharset\include\libcharset.h lib\libcharset.h
!if !$(DLL)
	$(LN) include\iconv.h.msvc-static include\iconv.h
!else
	$(LN) include\iconv.h.msvc-shared include\iconv.h
!endif
	cd lib
	$(MAKE) -f Makefile.msvc all
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc all
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc all
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc all
	cd ..

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 $(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 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 $(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 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) $(includedir)/iconv.h
	cd man; $(MAKE) -r uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' mandir='$(mandir)'

check : all force
	cd libcharset
	$(MAKE) -f Makefile.msvc check
	cd ..
	cd lib
	$(MAKE) -f Makefile.msvc check
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc check
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc check
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc check
	cd ..

mostlyclean : force
	cd libcharset
	$(MAKE) -f Makefile.msvc mostlyclean
	cd ..
	$(RM) lib\libcharset.h
	cd lib
	$(MAKE) -f Makefile.msvc mostlyclean
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc mostlyclean
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc mostlyclean
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc mostlyclean
	cd ..

clean : force
	cd libcharset
	$(MAKE) -f Makefile.msvc clean
	cd ..
	$(RM) lib\libcharset.h
	cd lib
	$(MAKE) -f Makefile.msvc clean
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc clean
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc clean
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc clean
	cd ..

distclean : force
	cd libcharset
	$(MAKE) -f Makefile.msvc distclean
	cd ..
	$(RM) lib\libcharset.h
	cd lib
	$(MAKE) -f Makefile.msvc distclean
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc distclean
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc distclean
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc distclean
	cd ..
	$(RM) config.status config.log config.cache Makefile
	$(RM) include\iconv.h

maintainer-clean : force
	cd libcharset
	$(MAKE) -f Makefile.msvc maintainer-clean
	cd ..
	$(RM) lib\libcharset.h
	cd lib
	$(MAKE) -f Makefile.msvc maintainer-clean
	cd ..
	cd src
	$(MAKE) -f Makefile.msvc maintainer-clean
	cd ..
#	cd man
#	$(MAKE) -f Makefile.msvc maintainer-clean
#	cd ..
	cd tests
	$(MAKE) -f Makefile.msvc maintainer-clean
	cd ..
	$(RM) config.status config.log config.cache Makefile
	$(RM) include\iconv.h

force :

