# Makefile for libiconv/src

#### 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
!if !defined(DLL)
DLL=0
!endif
!if !defined(DEBUG)
DEBUG=0
!endif
!if !defined(MFLAGS)
!if !$(DLL)
MFLAGS=
!else
MFLAGS=-MD
!endif
!endif

!if $(DEBUG)
OPTIMFLAGS = -Od -Z7
!else
# Some people prefer -O2 -G6 instead of -O1, but -O2 is not reliable in MSVC5.
OPTIMFLAGS = -D_NDEBUG -O1
!endif

# Set to -W3 if you want to see maximum amount of warnings, including stupid
# ones. Set to -W1 to avoid warnings about signed/unsigned combinations.
WARN_CFLAGS = -W1

# Directories used by "make":
srcdir = .

# Programs used by "make":
CC = cl
CFLAGS = $(MFLAGS) $(WARN_CFLAGS) $(OPTIMFLAGS)
CPP = cl -E
INCLUDES = -I. -I$(srcdir) -I..\include -I$(srcdir)\..\include
RM = del

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

SHELL = /bin/sh

all : iconv.exe

iconv.exe : $(srcdir)/iconv.c ../lib/iconv.lib
	$(CC) $(CFLAGS) $(INCLUDES) -I..\lib $(srcdir)/iconv.c ../lib/iconv.lib -Feiconv.exe
	$(RM) iconv.obj
!if $(DLL)
	copy ..\lib\iconv.dll iconv.dll
!endif

check : all

mostlyclean : clean

clean : force
	$(RM) *.obj
	$(RM) *.dll
	$(RM) *.exe
	$(RM) core

distclean : clean
	$(RM) Makefile

maintainer-clean : distclean

force :
