# Makefile for libcharset

#### 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 : config.h force
!if !$(DLL)
	$(LN) include\libcharset.h.in include\libcharset.h
!else
	$(LN) include\libcharset.h.msvc-shared include\libcharset.h
!endif
	cd lib
	$(MAKE) -f Makefile.msvc all
	cd ..

config.h : config.h.msvc
	$(RM) config.h
	$(LN) config.h.msvc config.h

install : force
	cd lib; $(MAKE) -r install prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(MKINSTALLDIRS) $(includedir)
	$(INSTALL_DATA) include/libcharset.h $(includedir)/libcharset.h

installdirs : force
	cd lib; $(MAKE) -r installdirs prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(MKINSTALLDIRS) $(includedir)

uninstall : force
	cd lib; $(MAKE) -r uninstall prefix='$(prefix)' exec_prefix='$(exec_prefix)' libdir='$(libdir)'
	$(RM) $(includedir)/libcharset.h

check : all force
	cd lib
	$(MAKE) -f Makefile.msvc check
	cd ..

mostlyclean : force
	cd lib
	$(MAKE) -f Makefile.msvc mostlyclean
	cd ..

clean : force
	cd lib
	$(MAKE) -f Makefile.msvc clean
	cd ..

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

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

force :

