WHAT=windows

all:: setup-msg outpre-dir

all:: all-$(WHAT)
clean:: clean-$(WHAT)
install:: install-$(WHAT)
check:: check-$(WHAT)

all-windows::
clean-windows::
install-windows::
check-windows::

all-windows:: Makefile
clean-windows:: Makefile

#
# Figure out the CPU
#
!if !defined(CPU) || "$(CPU)" == ""
CPU=$(PROCESSOR_ARCHITECTURE)
!endif # CPU

!if "$(CPU)" == ""
CPU=i386
!endif

# Change x86 or X86 to i386
!if ( "$(CPU)" == "X86" ) || ( "$(CPU)" == "x86" )
CPU=i386
!endif # CPU == X86

!if ( "$(CPU)" != "i386" ) && ( "$(CPU)" != "ALPHA" )
!error Must specify CPU environment variable ( CPU=i386, CPU=ALPHA)
!endif
#
# End of figuring out CPU
#

!if "$(OS)" == "Windows_NT"
DIRNUL=
!else 
DIRNUL=\nul
!endif

# NOTE: ^ is an escape char for NMAKE.
!ifdef NODEBUG
OUTPRE_DBG=rel
!else
OUTPRE_DBG=dbg
!endif
OUTPRE1=obj
OUTPRE2=$(OUTPRE1)\$(CPU)
OUTPRE3=$(OUTPRE2)\$(OUTPRE_DBG)
OUTPRE=$(OUTPRE3)^\

$(OUTPRE3)$(DIRNUL):
	-@if not exist $(OUTPRE1)$(DIRNUL) mkdir $(OUTPRE1)
	-@if not exist $(OUTPRE2)$(DIRNUL) mkdir $(OUTPRE2)
	-@if not exist $(OUTPRE3)$(DIRNUL) mkdir $(OUTPRE3)
	@if exist $(OUTPRE3)$(DIRNUL) echo Output going into $(OUTPRE3)
	@if not exist $(OUTPRE1)$(DIRNUL) echo The directory $(OUTPRE1) could not be created.
	@if exist $(OUTPRE1)$(DIRNUL) if not exist $(OUTPRE2)$(DIRNUL) echo The directory $(OUTPRE2) could not be created.
	@if exist $(OUTPRE2)$(DIRNUL) if not exist $(OUTPRE3)$(DIRNUL) echo The directory $(OUTPRE3) could not be created.


clean-windows-dir::
	-@if exist $(OUTPRE3)$(DIRNUL) rmdir $(OUTPRE3)
	-@if exist $(OUTPRE2)$(DIRNUL) rmdir $(OUTPRE2)
	-@if exist $(OUTPRE1)$(DIRNUL) rmdir $(OUTPRE1)
	@if exist $(OUTPRE2)$(DIRNUL) echo The directory $(OUTPRE2) is not empty.
	@if not exist $(OUTPRE2)$(DIRNUL) if exist $(OUTPRE1)$(DIRNUL) echo The directory $(OUTPRE1) is not empty.

# Directory syntax:
#
# begin absolute path
ABS=^\
# begin relative path
REL=
# up-directory
U=..
# path separator
S=^\
# this is magic... should only be used for preceding a program invocation
C=.^\

srcdir = .
SRCTOP = $(srcdir)\$(BUILDTOP)

!if defined(KRB5_USE_DNS) || defined(KRB5_USE_DNS_KDC) || defined(KRB5_USE_DNS_REALMS)
!if defined(KRB5_NO_WSHELPER)
DNSMSG=resolver
!else
DNSMSG=wshelper
DNSFLAGS=-DWSHELPER=1
!endif
!if !defined(DNS_INC)
!message Must define DNS_INC to point to $(DNSMSG) includes dir!
!error
!endif
!if !defined(DNS_LIB)
!message Must define DNS_LIB to point to $(DNSMSG) library!
!error
!endif
DNSLIBS=$(DNS_LIB)
DNSFLAGS=-I$(DNS_INC) $(DNSFLAGS) -DKRB5_DNS_LOOKUP=1
!if defined(KRB5_USE_DNS_KDC)
DNSFLAGS=$(DNSFLAGS) -DKRB5_DNS_LOOKUP_KDC=1
!endif
!if defined(KRB5_USE_DNS_REALMS)
DNSFLAGS=$(DNSFLAGS) -DKRB5_DNS_LOOKUP_REALM=1
!endif
!else
DNSLIBS=
DNSFLAGS=
!endif

!if defined(KRB5_KFW_COMPILE)
KFWFLAGS=-DUSE_LEASH=1
!endif

#
# The name of the C compiler for the target
#
CC=cl

PDB_OPTS=-Fd$(OUTPRE)\ -FD
CPPFLAGS=-I$(SRCTOP)\include -I$(SRCTOP)\include\krb5 $(DNSFLAGS) -DKRB5_PRIVATE=1 -DWIN32_LEAN_AND_MEAN -DKRB5_DEPRECATED=1 $(KFWFLAGS)
CCOPTS=-nologo /W3 $(PDB_OPTS) $(DLL_FILE_DEF)
LOPTS=-nologo -incremental:no

# /ZI gives better debug info in each object file (MSVC 6.0 or higher).
# /Zi gives debug info in each object file.
# /Gs Avoid stack probes (they don't seem to work anyway)
# /Os optimize for space.  FIXME:  Do not use /Ox; it miscompiles the DES lib!
# /Od disable optimization (for debugging)
# /MD (Win32) thread safe, ML would be single threaded, don't build with ML

#
# CCOPTS  was for DLL compiles
# CCOPTS2 was for non-DLL compiles (EXEs, for example)
#
!ifdef NODEBUG
CCOPTS=/Os /MD $(CCOPTS)
LOPTS=$(LOPTS)
!else
CCOPTS=/Od /ZI /MDd $(CCOPTS)
LOPTS=$(LOPTS) -debug
!endif

# XXX - NOTE: We should probably use DllMainCRTStartup
DLL_LINKOPTS=$(LOPTS) -dll -entry:DllMain
EXE_LINKOPTS=$(LOPTS)

RM=$(BUILDTOP)\config\rm.bat
LIBECHO=$(BUILDTOP)\util\windows\$(OUTPRE)libecho
CP=copy
MV=ren
LN=copy
LIBCMD=lib
AWK=rem
RC = rc
CVTRES = cvtres

WCONFIG_EXE=$(BUILDTOP)\$(OUTPRE)wconfig.exe
WCONFIG=$(WCONFIG_EXE:.exe=) $(WCONFIG_FLAGS)

CLIB=$(BUILDTOP)\lib\$(OUTPRE)comerr32.lib
PLIB=$(BUILDTOP)\lib\$(OUTPRE)xpprof32.lib
KLIB=$(BUILDTOP)\lib\$(OUTPRE)krb5_32.lib
K4LIB=$(BUILDTOP)\lib\$(OUTPRE)krb4_32.lib

GLIB=$(BUILDTOP)\lib\$(OUTPRE)gssapi32.lib
WLIB=

KRB4_INCLUDES=-I$(BUILDTOP)/include/kerberosIV

COM_ERR_DEPS	= $(BUILDTOP)/include/com_err.h

ARADD=rem
RANLIB=rem
ARCHIVE=rem

LIBEXT=lib
OBJEXT=obj
EXEEXT=.exe

MFLAGS=$(MAKEFLAGS)
!ifdef MIGNORE
MAKE=-$(MAKE)
!endif

CFLAGS = $(CCOPTS)
ALL_CFLAGS = $(DEFS) $(DEFINES) $(LOCALINCLUDES) $(CPPFLAGS) $(CFLAGS)

C_RULE_STUFF=$(CC) $(ALL_CFLAGS) -Fo$(OUTPRE)\ -c
C_RULE_PRINT=$(C_RULE_STUFF)
C_RULE=$(C_RULE_STUFF) $<

{}.rc{$(OUTPRE)}.res:
	$(RC) $(RCFLAGS) -fo $@ -r $<

{}.c{$(OUTPRE)}.obj:
	@if "%DO_C_RULE_PRINT%"=="1" echo %C_RULE_PRINT% ...
	@set DO_C_RULE_PRINT=
	@$(C_RULE)

{}.cxx{$(OUTPRE)}.obj:
	@if "%DO_C_RULE_PRINT%"=="1" echo %C_RULE_PRINT% ...
	@set DO_C_RULE_PRINT=
	@$(C_RULE)

{}.cpp{$(OUTPRE)}.obj:
	@if "%DO_C_RULE_PRINT%"=="1" echo %C_RULE_PRINT% ...
	@set DO_C_RULE_PRINT=
	@$(C_RULE)

#
# End of Win32 pre-config lines (config/win-pre.in)
#

datadir=@datadir@

thisconfigdir=.
myfulldir=.
mydir=.
MY_SUBDIRS=util include lib @krb524@ kdc kadmin slave clients appl tests \
	config-files gen-manpages
BUILDTOP=$(REL)$(C)
LOCALINCLUDES = -I$(srcdir) 

SRCS =  
HDRS = 

DISTFILES = $(SRCS) $(HDRS) COPYING COPYING.LIB ChangeLog Makefile.in

all-unix:: krb5-config

all-mac::

all-windows:: maybe-awk Makefile-windows
	@echo Making in util
	cd util
	$(MAKE) -$(MFLAGS)
	@echo Making in include
	cd ..\include
	$(MAKE) -$(MFLAGS) 
	@echo Making in lib
	cd ..\lib
	$(MAKE) -$(MFLAGS) 
	@echo Making in windows
	cd ..\windows
	$(MAKE) -$(MFLAGS) 
	@echo Making in clients
	cd ..\clients
	$(MAKE) -$(MFLAGS)
	@echo Making in appl\gss-sample
	cd ..\appl\gss-sample
	$(MAKE) -$(MFLAGS)
	@echo Making in appl\gssftp\ftp
	cd ..\..\appl\gssftp\ftp
	$(MAKE) -$(MFLAGS)
	cd ..\..\..

world::
	date
	make $(MFLAGS) all
	date

INSTALLMKDIRS = $(KRB5ROOT) $(KRB5MANROOT) $(KRB5OTHERMKDIRS) \
		$(ADMIN_BINDIR) $(SERVER_BINDIR) $(CLIENT_BINDIR) \
		$(ADMIN_MANDIR) $(SERVER_MANDIR) $(CLIENT_MANDIR) \
		$(FILE_MANDIR) $(KRB5_LIBDIR) $(KRB5_INCDIR) \
		$(KRB5_INCSUBDIRS) $(datadir)

install-strip:
	$(MAKE) install INSTALL_STRIP=-s

install-recurse: install-mkdirs

install-mkdirs:
	@for i in $(INSTALLMKDIRS); do \
		$(srcdir)/config/mkinstalldirs $(DESTDIR)$$i; \
	done

install-headers-mkdirs:
	$(srcdir)/config/mkinstalldirs $(DESTDIR)$(KRB5_INCDIR)
	$(srcdir)/config/mkinstalldirs $(DESTDIR)$(KRB5_INCDIR)/gssapi
	$(srcdir)/config/mkinstalldirs $(DESTDIR)$(KRB5_INCDIR)/kerberosIV
install-headers-prerecurse: install-headers-mkdirs

# install::
#	$(MAKE) $(MFLAGS) install.man

TAGS: $(SRCS)
	etags $(SRCS)

clean-:: clean-windows
clean-mac:: clean-unix
clean-unix::
	$(RM) *.o core krb5-config

mostlyclean: clean

# This doesn't work; if you think you need it, you should use a
# separate build directory.
# 
# distclean: clean
# 	rm -f Makefile config.status
# 
# realclean: distclean
# 	rm -f TAGS

dist: $(DISTFILES)
	echo cpio-`sed -e '/version_string/!d' \
	-e 's/[^0-9.]*\([0-9.]*\).*/\1/' -e q version.c` > .fname
	rm -rf `cat .fname`
	mkdir `cat .fname`
	-ln $(DISTFILES) `cat .fname`
	for file in $(DISTFILES); do \
	  test -r `cat .fname`/$$file || cp -p $$file `cat .fname`; \
	done
	tar chzf `cat .fname`.tar.gz `cat .fname`
	rm -rf `cat .fname` .fname

GZIPPROG= gzip -9v
PKGDIR=`pwd`/pkgdir
pkgdir:
	if test ! -d $(PKGDIR); then mkdir $(PKGDIR); else true; fi
tgz-bin: pkgdir
	rm -rf $(PKGDIR)/install cns5-bin.tgz
	mkdir $(PKGDIR)/install
	$(MAKE) install DESTDIR=$(PKGDIR)/install
	(cd $(PKGDIR)/install && tar cf - usr/cygnus) | $(GZIPPROG) > cns5-bin.tgz
	rm -rf $(PKGDIR)/install

# Microsoft Windows build process...
#

config-windows:: Makefile-windows
#	@echo Making in include
#	cd include
#	$(MAKE) -$(MFLAGS)
#	cd ..

#
# We need outpre-dir explicitly in here because we may
# try to build wconfig on a config-windows.
#
$(WCONFIG_EXE): outpre-dir wconfig.c
	$(CC) -Fe$@ -Fo$*.obj wconfig.c

MKFDEP=$(WCONFIG_EXE) config\win-pre.in config\win-post.in

WINMAKEFILES=Makefile \
	appl\gss-sample\Makefile \
	appl\gssftp\ftp\Makefile \
	clients\Makefile clients\kdestroy\Makefile \
	clients\kinit\Makefile clients\klist\Makefile \
	clients\kpasswd\Makefile clients\kvno\Makefile \
	include\Makefile include\krb5\Makefile \
	krb524\Makefile \
	lib\Makefile lib\crypto\Makefile \
	lib\crypto\crc32\Makefile lib\crypto\des\Makefile \
	lib\crypto\dk\Makefile lib\crypto\enc_provider\Makefile \
	lib\crypto\hash_provider\Makefile \
	lib\crypto\keyhash_provider\Makefile \
	lib\crypto\raw\Makefile lib\crypto\old\Makefile \
	lib\crypto\sha1\Makefile lib\crypto\arcfour\Makefile \
	lib\crypto\md4\Makefile lib\crypto\md5\Makefile \
	lib\crypto\yarrow\Makefile lib\crypto\aes\Makefile \
	lib\des425\Makefile \
	lib\gssapi\Makefile lib\gssapi\generic\Makefile \
	lib\gssapi\krb5\Makefile lib\gssapi\mechglue\Makefile \
	lib\krb4\Makefile lib\krb5\Makefile \
	lib\krb5\asn.1\Makefile lib\krb5\ccache\Makefile \
	lib\krb5\ccache\ccapi\Makefile \
	lib\krb5\error_tables\Makefile \
	lib\krb5\keytab\Makefile \
	lib\krb5\krb\Makefile \
	lib\krb5\os\Makefile lib\krb5\posix\Makefile \
	lib\krb5\rcache\Makefile \
	util\Makefile \
	util\et\Makefile util\profile\Makefile \
	util\windows\Makefile \
	windows\Makefile windows\lib\Makefile \
	windows\cns\Makefile windows\gina\Makefile \
	windows\gss\Makefile windows\ms2mit\Makefile \
	windows\wintel\Makefile

Makefile-windows:: $(MKFDEP) $(WINMAKEFILES)

Makefile: Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
appl\gss-sample\Makefile: appl\gss-sample\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
appl\gssftp\ftp\Makefile: appl\gssftp\ftp\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\Makefile: clients\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\kdestroy\Makefile: clients\kdestroy\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\kinit\Makefile: clients\kinit\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\klist\Makefile: clients\klist\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\kpasswd\Makefile: clients\kpasswd\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
clients\kvno\Makefile: clients\kvno\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
include\Makefile: include\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
include\krb5\Makefile: include\krb5\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
krb524\Makefile: krb524\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\Makefile: lib\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\Makefile: lib\crypto\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\crc32\Makefile: lib\crypto\crc32\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\des\Makefile: lib\crypto\des\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\dk\Makefile: lib\crypto\dk\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\enc_provider\Makefile: lib\crypto\enc_provider\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\hash_provider\Makefile: lib\crypto\hash_provider\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\keyhash_provider\Makefile: lib\crypto\keyhash_provider\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\sha1\Makefile: lib\crypto\sha1\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\arcfour\Makefile: lib\crypto\arcfour\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\md4\Makefile: lib\crypto\md4\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\md5\Makefile: lib\crypto\md5\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\yarrow\Makefile: lib\crypto\yarrow\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\aes\Makefile: lib\crypto\aes\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\old\Makefile: lib\crypto\old\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\crypto\raw\Makefile: lib\crypto\raw\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\des425\Makefile: lib\des425\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\gssapi\Makefile: lib\gssapi\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\gssapi\generic\Makefile: lib\gssapi\generic\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\gssapi\mechglue\Makefile: lib\gssapi\mechglue\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\gssapi\krb5\Makefile: lib\gssapi\krb5\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb4\Makefile: lib\krb4\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\Makefile: lib\krb5\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\asn.1\Makefile: lib\krb5\asn.1\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\ccache\Makefile: lib\krb5\ccache\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\ccache\ccapi\Makefile: lib\krb5\ccache\ccapi\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\error_tables\Makefile: lib\krb5\error_tables\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\keytab\Makefile: $$@.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\krb\Makefile: lib\krb5\krb\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\os\Makefile: lib\krb5\os\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\posix\Makefile: lib\krb5\posix\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
lib\krb5\rcache\Makefile: lib\krb5\rcache\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
util\Makefile: util\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
util\et\Makefile: util\et\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
util\profile\Makefile: util\profile\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
util\windows\Makefile: util\windows\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\Makefile: windows\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\lib\Makefile: windows\lib\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\cns\Makefile: windows\cns\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\gina\Makefile: windows\gina\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\gss\Makefile: windows\gss\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\ms2mit\Makefile: windows\ms2mit\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@
windows\wintel\Makefile: windows\wintel\Makefile.in $(MKFDEP)
	$(WCONFIG) config < $@.in > $@

clean-windows:: Makefile-windows
	@echo Making clean in util
	cd util
	$(MAKE) -$(MFLAGS) clean
	@echo Making clean in include
	cd ..\include
	$(MAKE) -$(MFLAGS) clean
	@echo Making clean in lib
	cd ..\lib
	$(MAKE) -$(MFLAGS) clean
	@echo Making clean in windows
	cd ..\windows
	$(MAKE) -$(MFLAGS) clean
	@echo Making clean in clients
	cd ..\clients
	$(MAKE) -$(MFLAGS) clean
	@echo Making in appl\gss-sample
	cd ..\appl\gss-sample
	$(MAKE) -$(MFLAGS) clean
	@echo Making in appl\gssftp\ftp
	cd ..\..\appl\gssftp\ftp
	$(MAKE) -$(MFLAGS) clean
	cd ..\..\..
	@echo Making clean in root

#
# Renames DOS 8.3 filenames back to their proper, longer names.
#
ren2long:
	-sh config/ren2long

#
# Builds the file that distributes Kerberos sources for DOS and 
# Macintosh sites from the source tree on Unix.
#
ZIP=zip
FILES= ./* \
	clients/* clients/kdestroy/* clients/kinit/* clients/klist/* \
	clients/kpasswd/* \
	config/* include/* include/kerberosIV/* \
	include/krb5/* include/krb5/stock/* include/sys/* krb524/* lib/* \
	lib/crypto/* lib/crypto/crc32/* lib/crypto/des/* lib/crypto/dk/* \
	lib/crypto/enc_provider/* lib/crypto/hash_provider/* \
	lib/crypto/keyhash_provider/* lib/crypto/old/* lib/crypto/raw/* \
	lib/crypto/sha1/* lib/crypto/arcfour/* lib/crypto/md4/* \
	lib/crypto/md5/* lib/crypto/yarrow/* \
	lib/des425/* lib/gssapi/* lib/gssapi/generic/* lib/gssapi/krb5/* \
	lib/gssapi/mechglue/* lib/krb4/* \
	lib/krb5/* lib/krb5/asn.1/* lib/krb5/krb/* \
	lib/krb5/ccache/* lib/krb5/ccache/ccapi/* \
	lib/krb5/error_tables/* \
	lib/krb5/keytab/* lib/krb5/keytab/file/* lib/krb5/keytab/srvtab/* \
	lib/krb5/os/* lib/krb5/posix/* lib/krb5/rcache/* \
	util/* util/et/* util/profile/*

WINFILES= util/windows/* windows/* windows/lib/* windows/cns/* \
	windows/wintel/* windows/gss/* windows/gina/* windows/ms2mit/*

MACFILES= mac/* mac/libraries/* config/* include/* \
	include/krb5/* include/krb5/stock/* include/sys/* \
	./patchlevel.h

WINBINARYFILES=	windows/*/*.ico windows/*/*.doc windows/*/*.hlp \
	windows/*/*.hpj windows/lib/*.lib

#
# Part of building the PC release has to be done on Unix. This includes
# anything the requires awk.
#
AWK = awk
AH  = util/et/et_h.awk
AC  = util/et/et_c.awk
INC = include/
ET  = lib/krb5/error_tables/
GG  = lib/gssapi/generic/
GK  = lib/gssapi/krb5/
PR  = util/profile/

ETOUT =	\
	$(INC)asn1_err.h $(ET)asn1_err.c \
	$(INC)kdb5_err.h $(ET)kdb5_err.c \
	$(INC)krb5_err.h $(ET)krb5_err.c \
	$(INC)kv5m_err.h $(ET)kv5m_err.c \
	$(INC)krb524_err.h $(ET)krb524_err.c \
	$(INC)/kerberosIV/kadm_err.h lib/krb4/kadm_err.c \
	$(INC)/kerberosIV/krb_err.h lib/krb4/krb_err.c \
	$(PR)prof_err.h $(PR)prof_err.c \
	$(GG)gssapi_err_generic.h $(GG)gssapi_err_generic.c \
	$(GK)gssapi_err_krb5.h $(GK)gssapi_err_krb5.c \
	lib/krb4/krb_err_txt.c

HOUT =	$(INC)krb5.h $(GG)gssapi.h $(PR)profile.h

CLEANUP= Makefile $(ETOUT) $(HOUT) \
	include/profile.h include/krb5/osconf.h \
	winfile.list macfile.list


kerbsrc.win: kerbsrc.zip

winfile.list:
	echo $(FILES) $(WINFILES) | tr ' ' \\012 | \
		sed -f config/winexclude.sed > winfile.list

MAC_SUBDIRS = lib util
macfile.list:
	/bin/sh mac/macfiles.sh $(MAC_SUBDIRS) > macfile.list
	find $(MACFILES) -prune -type f -print | \
		sed -f config/winexclude.sed >> macfile.list

dos-Makefile:
	cat config/win-pre.in Makefile.in config/win-post.in | \
		sed -e "s/^##DOS##//" -e "s/^##DOS//" > Makefile.tmp
	mv Makefile.tmp Makefile

prep-windows: dos-Makefile awk-windows-mac

krbsrc83.zip: krbsrc83-is-obsolete

krbsrc83-is-obsolete:
	@echo "Win16 and krbsrc83.zip are no longer supported."
	@echo "We don't support building under 8.3 restricted filesystems"
	@echo "anymore.  You can still build for Win32 on filesystems"
	@echo "without 8.3 restrictions using kerbsrc.zip"
	@echo " "

kerbsrc.zip: dos-Makefile awk-windows-mac winfile.list
	rm -f kerbsrc.zip
	$(ZIP) -@Dl kerbsrc.zip < winfile.list
	$(ZIP) -D kerbsrc.zip $(WINBINARYFILES)
	rm -f $(CLEANUP)

kerbsrc-nt.zip: kerbsrc-nt-is-obsolete

kerbsrc-nt-is-obsolete:
	@echo "kerbsrc-nt.zip is now obsolete.  Just use and build kerbsrc.zip"
	@echo "We don't support building under 8.3 restricted filesystems"
	@echo "anymore, so what was kerbsrc-nt.zip is now kerbsrc.zip."
	@echo " "

Macfile: macfile.list 
	rm -f Macfile
	sed -e 's|/|:|g' -e 's/^/:/' -e '/:.:/d' -e '/:mac:/d' macfile.list > macfile.maclist
	grep '\.c$$' macfile.maclist > macsrcsgss
	grep -v ':gssapi:' macsrcsgss > macsrcsk5
	echo SRCS = `cat macsrcsgss` >> Macfile
	echo SRCDIRS = `sed -n -e 's/\(.*:\)[^:]*\.c$$/ \1/p' macfile.maclist | sort -u` >> Macfile
	echo GSSOBJS68K = `sed -e 's/$$/.68K.o/' -e 's/.*://' \
		-e 's/^/:bin:68K:/' macsrcsgss` >> Macfile
	echo GSSOBJS68KCFM = `sed -e 's/$$/.CFM68.o/' -e 's/.*://' \
		-e 's/^/:bin:CFM-68K:/' macsrcsgss` >> Macfile
	echo GSSOBJSPPC = `sed -e 's/$$/.PPC.o/' -e 's/.*://' \
		-e 's/^/:bin:PPC:/' macsrcsgss` >> Macfile
	echo K5OBJS68K = `sed -e 's/$$/.68K.o/' -e 's/.*://' \
		-e 's/^/:bin:68K:/' macsrcsk5` >> Macfile
	echo K5OBJS68KCFM = `sed -e 's/$$/.CFM68.o/' -e 's/.*://' \
		-e 's/^/:bin:CFM-68K:/' macsrcsk5` >> Macfile
	echo K5OBJSPPC = `sed -e 's/$$/.PPC.o/' -e 's/.*://' \
		-e 's/^/:bin:PPC:/' macsrcsk5` >> Macfile
	echo INCLUDES = `sed -n -e 's/\(.*:\)[^:]*\.h$$/-i \1/p' macfile.maclist | sort -u` >> Macfile
	echo "" >> Macfile
	tr '@/:\\' '\245:\304\266'< mac/Makefile.tmpl >> Macfile

mac-bin-dirs:
	rm -rf bin
	mkdir bin bin/68K bin/CFM-68K bin/PPC
	sh mac/mkbindirs.sh bin/68K $(MAC_SUBDIRS)
	sh mac/mkbindirs.sh bin/CFM-68K $(MAC_SUBDIRS)
	sh mac/mkbindirs.sh bin/PPC $(MAC_SUBDIRS)

kerbsrc.mac.tar: awk-windows-mac macfile.list mac-bin-dirs Macfile
	cp mac/libraries/autoconf.h include/autoconf.h
	mv Macfile Makefile
	tar cvf kerbsrc.mac.tar Makefile include/autoconf.h bin \
		`cat macfile.list`
	rm -f $(CLEANUP)
	rm -rf bin
	rm -f include/autoconf.h Makefile macsrc* macfile.maclist

$(INC)asn1_err.h: $(AH) $(ET)asn1_err.et
	$(AWK) -f $(AH) outfile=$@ $(ET)asn1_err.et
$(INC)kdb5_err.h: $(AH) $(ET)kdb5_err.et
	$(AWK) -f $(AH) outfile=$@ $(ET)kdb5_err.et
$(INC)krb5_err.h: $(AH) $(ET)krb5_err.et
	$(AWK) -f $(AH) outfile=$@ $(ET)krb5_err.et
$(INC)kv5m_err.h: $(AH) $(ET)kv5m_err.et
	$(AWK) -f $(AH) outfile=$@ $(ET)kv5m_err.et
$(INC)krb524_err.h: $(AH) $(ET)krb524_err.et
	$(AWK) -f $(AH) outfile=$@ $(ET)krb524_err.et
$(INC)/kerberosIV/kadm_err.h: $(AH) lib/krb4/kadm_err.et
	$(AWK) -f $(AH) outfile=$@ lib/krb4/kadm_err.et
$(INC)/kerberosIV/krb_err.h: $(AH) lib/krb4/krb_err.et
	$(AWK) -f $(AH) outfile=$@ lib/krb4/krb_err.et
$(PR)prof_err.h: $(AH) $(PR)prof_err.et
	$(AWK) -f $(AH) outfile=$@ $(PR)prof_err.et
$(GG)gssapi_err_generic.h: $(AH) $(GG)gssapi_err_generic.et
	$(AWK) -f $(AH) outfile=$@ $(GG)gssapi_err_generic.et
$(GK)gssapi_err_krb5.h: $(AH) $(GK)gssapi_err_krb5.et
	$(AWK) -f $(AH) outfile=$@ $(GK)gssapi_err_krb5.et

$(ET)asn1_err.c: $(AC) $(ET)asn1_err.et
	$(AWK) -f $(AC) outfile=$@ $(ET)asn1_err.et
$(ET)kdb5_err.c: $(AC) $(ET)kdb5_err.et
	$(AWK) -f $(AC) outfile=$@ $(ET)kdb5_err.et
$(ET)krb5_err.c: $(AC) $(ET)krb5_err.et
	$(AWK) -f $(AC) outfile=$@ $(ET)krb5_err.et
$(ET)kv5m_err.c: $(AC) $(ET)kv5m_err.et
	$(AWK) -f $(AC) outfile=$@ $(ET)kv5m_err.et
$(ET)krb524_err.c: $(AC) $(ET)krb524_err.et
	$(AWK) -f $(AC) outfile=$@ $(ET)krb524_err.et
lib/krb4/kadm_err.c: $(AC) lib/krb4/kadm_err.et
	$(AWK) -f $(AC) outfile=$@ lib/krb4/kadm_err.et
lib/krb4/krb_err.c: $(AC) lib/krb4/krb_err.et
	$(AWK) -f $(AC) outfile=$@ lib/krb4/krb_err.et
$(PR)prof_err.c: $(AC) $(PR)prof_err.et
	$(AWK) -f $(AC) outfile=$@ $(PR)prof_err.et
$(GG)gssapi_err_generic.c: $(AC) $(GG)gssapi_err_generic.et
	$(AWK) -f $(AC) outfile=$@ $(GG)gssapi_err_generic.et
$(GK)gssapi_err_krb5.c: $(AC) $(GK)gssapi_err_krb5.et
	$(AWK) -f $(AC) outfile=$@ $(GK)gssapi_err_krb5.et

lib/krb4/krb_err_txt.c: lib/krb4/krb_err.et
	$(AWK) -f lib/krb4/et_errtxt.awk outfile=$@ \
		lib/krb4/krb_err.et

KRBHDEP = $(INC)krb5.hin $(INC)krb5_err.h $(INC)kdb5_err.h \
	$(INC)kv5m_err.h $(INC)krb524_err.h $(INC)asn1_err.h

$(INC)krb5.h: $(KRBHDEP)
	rm -f $@
	cat $(KRBHDEP) > $@
$(PR)profile.h: $(PR)profile.hin $(PR)prof_err.h
	rm -f $@
	cat $(PR)profile.hin $(PR)prof_err.h > $@
$(GG)gssapi.h: $(GG)gssapi.hin
	rm -f $@
	cat $(GG)gssapi.hin > $@

awk-windows-mac: $(ETOUT) $(HOUT)

#
# The maybe-awk target needs to happen after AWK is defined.
#

maybe-awk::
!ifdef WHICH_CMD
!if ![ $(WHICH_CMD) $(AWK) ]
maybe-awk:: awk-windows-mac
!endif
!endif

clean-windows-mac:
	rm -f $(CLEANUP)

distclean-windows:
	config\rm.bat $(CLEANUP:^/=^\)
	config\rm.bat $(WINMAKEFILES)
	config\rm.bat $(KBINDIR)\*.dll $(KBINDIR)\*.exe
	@if exist $(KBINDIR)\nul rmdir $(KBINDIR)

install-windows::
	@if "$(KRB_INSTALL_DIR)"=="" @echo KRB_INSTALL_DIR is not defined!  Please define it.
	@if "$(KRB_INSTALL_DIR)"=="" @dir /b \nul\nul
	@if not exist "$(KRB_INSTALL_DIR)\$(NULL)" @echo The directory $(KRB_INSTALL_DIR) does not exist.  Please create it.
	@if not exist "$(KRB_INSTALL_DIR)\$(NULL)" @dir /b $(KRB_INSTALL_DIR)\nul
	@if not exist "$(KRB_INSTALL_DIR)\include\$(NULL)" @mkdir "$(KRB_INSTALL_DIR)\include"
	@if not exist "$(KRB_INSTALL_DIR)\include\gssapi\$(NULL)" @mkdir "$(KRB_INSTALL_DIR)\include\gssapi"
	@if not exist "$(KRB_INSTALL_DIR)\lib\$(NULL)" @mkdir "$(KRB_INSTALL_DIR)\lib"
	@if not exist "$(KRB_INSTALL_DIR)\bin\$(NULL)" @mkdir "$(KRB_INSTALL_DIR)\bin"
	$(CP) include\krb5.h "$(KRB_INSTALL_DIR)\include\."
	$(CP) include\win-mac.h "$(KRB_INSTALL_DIR)\include\."
	$(CP) include\profile.h "$(KRB_INSTALL_DIR)\include\."
	$(CP) include\com_err.h "$(KRB_INSTALL_DIR)\include\."
	$(CP) include\gssapi\gssapi.h "$(KRB_INSTALL_DIR)\include\gssapi\."
	$(CP) include\gssapi\gssapi_krb5.h "$(KRB_INSTALL_DIR)\include\gssapi\."
	$(CP) lib\$(OUTPRE)*.lib "$(KRB_INSTALL_DIR)\lib\."
	$(CP) lib\$(OUTPRE)*.dll "$(KRB_INSTALL_DIR)\bin\."
	$(CP) windows\cns\$(OUTPRE)krb5.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) windows\wintel\$(OUTPRE)telnet.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) windows\gss\$(OUTPRE)gss.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) clients\klist\$(OUTPRE)klist.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) clients\kinit\$(OUTPRE)kinit.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) clients\kdestroy\$(OUTPRE)kdestroy.exe "$(KRB_INSTALL_DIR)\bin\."
	$(CP) clients\kpasswd\$(OUTPRE)kpasswd.exe "$(KRB_INSTALL_DIR)\bin\."
	@if exist "$(KRB_INSTALL_DIR)\bin\krb4_32.dll" del "$(KRB_INSTALL_DIR)\bin\krb4_32.dll"
	@if exist "$(KRB_INSTALL_DIR)\lib\krb4_32.lib" del "$(KRB_INSTALL_DIR)\lib\krb4_32.lib"

install-unix:: 
	$(INSTALL) krb5-config \
		$(DESTDIR)$(CLIENT_BINDIR)/krb5-config

krb5-config: $(srcdir)/krb5-config.in $(thisconfigdir)/config.status
	cd $(thisconfigdir) && $(SHELL) config.status krb5-config

# Test to ensure that krb5-config does not spit out things like
# $(PURE) or $(LDFLAGS) in case someone changes config/shlib.conf
check-unix:: krb5-config
	$(SHELL) $(srcdir)/t_krbconf
#
# Start of Win32 post-config lines (config/win-post.in)
#

setup-msg::
	@set C_RULE_PRINT=	$(C_RULE_PRINT)
	@set DO_C_RULE_PRINT=1

!if defined(NO_OUTPRE) || defined(NO_OUTDIR)
outpre-dir::
!else
outpre-dir:: $(OUTPRE3)$(DIRNUL)
!endif

#
# put all:: first just in case no other rules occur here
#
all::

#
# Set the #define to indicate that we are compiling a DLL.  We default to 
# compiling the Kerberos library
#
!if defined(DLL_EXP_TYPE)
DLL_FILE_DEF=/D$(DLL_EXP_TYPE)_DLL_FILE
!else
DLL_FILE_DEF=/DKRB5_DLL_FILE
!endif

# Build the Makefile unless we are in the top-level
#(where there is already an explicit rule).
!if !defined(ZIP) && !defined(WINFILES)
Makefile: Makefile.in $(BUILDTOP)\config\win-pre.in $(BUILDTOP)\config\win-post.in
	$(WCONFIG) $(BUILDTOP)\config < Makefile.in > Makefile
!endif


!if defined(LIBNAME)

!if !defined(OBJFILELIST)
OBJFILELIST=@$(OBJFILE)
!endif
!if !defined(OBJFILEDEP)
OBJFILEDEP=$(OBJFILE)
!endif

all-windows:: $(LIBNAME)
$(LIBNAME): $(OBJFILEDEP)
	$(LIBCMD) /out:$(LIBNAME) /nologo $(OBJFILELIST)

!endif # LIBNAME


!if defined(OBJFILE)
all-windows:: $(OBJFILE)
!if defined(LIBOBJS)
$(OBJFILE): $(LIBOBJS)
	if exist $(OBJFILE) del $(OBJFILE)
!if defined(PREFIXDIR)
	$(LIBECHO) -p $(PREFIXDIR)\ $** > $(OBJFILE)
!else
	$(LIBECHO) $** > $(OBJFILE)
!endif # !PREFIXDIR
!endif # LIBOBJS
!endif # OBJFILE


check::
check-windows::

!if defined(LIBNAME)
clean-windows::
# NO LONGER NEEDED BECAUSE WE CLEAN OUT THE DIR...
#	if exist $(LIBNAME) del $(LIBNAME)
!endif
!if defined(OBJFILE)
clean-windows::
# NO LONGER NEEDED BECAUSE WE CLEAN OUT THE DIR...
#	if exist $(OBJFILE) del $(OBJFILE)
!endif

clean-windows:: clean-windows-files clean-windows-dir


# This needs to be in the post because we need RM to be defined in terms
# of BUILDTOP
clean-windows-files::
!if "$(OUTPRE3)" == ""
!error ASSERTION FAILURE: OUTPRE3 must be defined!!!
!endif
!if "$(OS)" == "Windows_NT"
	@if exist $(OUTPRE3)$(DIRNUL) rd /s/q $(OUTPRE3)
!else
	@if exist $(OUTPRE3)$(DIRNUL) deltree /y $(OUTPRE3)
!endif
!if 0
	$(RM) .\$(OUTPRE)*.obj .\$(OUTPRE)*.res
	$(RM) .\$(OUTPRE)*.exe .\$(OUTPRE)*.dll
	$(RM) .\$(OUTPRE)*.lib .\$(OUTPRE)*.pdb
	$(RM) .\$(OUTPRE)*.exp .\$(OUTPRE)*.map
	$(RM) .\$(OUTPRE)*.idb .\$(OUTPRE)*.ilk
!endif
