# Makefile for Windows NT and Windows 95/98/2000

# Targets are:

#   build    - build flood
#   install  - install a flood build
#   clean      - remove (most) generated files
#
# The following install defaults may be customized;
#
#   Option      Default
#   SRCLIB      $(MAKEDIR)\..\..\httpd-2.0\srclib
#   APRPATH     $(SRCLIB)\apr
#   APRUTILPATH $(APRPATH)\..\apr-util
#   REGEXPATH   $(SRCLIB)\pcre
#   OPENSSLPATH $(SRCLIB)\openssl
#
# For example;
#
#   nmake /f Makefile.win PORT=80 INSTDIR="d:\Program Files\Apache" installr
#
# Be aware that certain awk's will not accept backslahed names,
# so the server root should be given in forward slashes (quoted),
# preferably with the drive designation!

default:        build

!IF "$(SRCLIB)" == ""
SRCLIB=$(MAKEDIR)\..\..\httpd-2.0\srclib
!MESSAGE Using default SRCLIB path $(SRCLIB)
!ENDIF

!IF "$(APRPATH)" == ""
APRPATH=$(SRCLIB)\apr
!MESSAGE Using default APRPATH $(APRPATH)
!ENDIF

!IF "$(APRUTILPATH)" == ""
APRUTILPATH=$(APRPATH)\..\apr-util
!MESSAGE Using default APRUTILPATH path $(APRUTILPATH)
!ENDIF

!IF "$(REGEXPATH)" == ""
REGEXPATH=$(SRCLIB)\pcre
!MESSAGE Using default REGEXPATH $(REGEXPATH)
!ENDIF

!IF "$(OPENSSLPATH)" == ""
OPENSSLPATH=$(SRCLIB)\openssl
!MESSAGE Using default OPENSSLPATH $(OPENSSLPATH)
!ENDIF

!IF !EXIST("$(APRPATH)")
!MESSAGE Please check out or download and unpack the Apache Portability Runtime
!MESSAGE sources (apr and apr-util) into your $(INSTDIR)\srclib directory.
!MESSAGE flood cannot build without these libraries!
!MESSAGE 
!ERROR Need $(APRPATH)
!ENDIF

!IF !EXIST("$(APRUTILPATH)")
!MESSAGE Please check out or download and unpack the Apache Portability Runtime
!MESSAGE sources (apr and apr-util) into your $(INSTDIR)\srclib directory.
!MESSAGE flood cannot build without these libraries!
!MESSAGE 
!ERROR Need $(APRUTILPATH)
!ENDIF

!IF !EXIST("$(REGEXPATH)")
!MESSAGE Please check out or download and unpack the pcre regex directory.
!MESSAGE One solution is the Apache 2.0 srclib/pcre distribution.
!MESSAGE flood cannot build without these libraries!
!MESSAGE 
!ERROR Need $(REGEXPATH)
!ENDIF

!IF !EXIST("$(OPENSSLPATH)")
!IF EXIST("ssl.discovered")
[del ssl.discovered]
[del config.h]
!ENDIF
HAVE_SSL=0
!ELSE
!IF EXIST("ssl.discovered")
[echo $(OPENSSLPATH) > ssl.discovered]
[del config.h]
!ENDIF
!IFDEF DEBUG
SSLBIN=out32dll.dbg
!ELSE
SSLBIN=out32dll
!ENDIF
HAVE_SSL=1
!ENDIF

!IFDEF DEBUG
SHORT=D
LONG=Debug
!ELSE
SHORT=R
LONG=Release
!ENDIF

floodenv.bat: Makefile.win
	echo @echo off>floodenv.bat
	echo set SRCLIB=$(SRCLIB)>>floodenv.bat
	echo set APRPATH=$(APRPATH)>>floodenv.bat
	echo set APRUTILPATH=$(APRUTILPATH)>>floodenv.bat
	echo set OPENSSLPATH=$(OPENSSLPATH)>>floodenv.bat
	echo set REGEXPATH=$(REGEXPATH)>>floodenv.bat
	echo set SSLBIN=$(SSLBIN)>>floodenv.bat

regex.h: $(REGEXPATH)\pcreposix.h
	copy "$(REGEXPATH)\pcreposix.h" regex.h < <<
Y
<<

# Yup, we are our own dependency, if this inline script changes
config.h: Makefile.win floodenv.bat config.h.in regex.h
	-awk -f <<script.awk config.h.in > config.h
{
    sub( /@prngrand@/,   "1" ); 
    sub( /@prngrand48@/, "0" ); 
    sub( /@prngrandom@/, "0" ); 
    sub( /@hasstrtoll@/, "0" ); 
    sub( /@hasstrtoq@/,  "0" ); 
    sub( /@flood_has_openssl@/, "$(HAVE_SSL)" ); 
    sub( /@flood_has_devrand@/, "0" );
    sub( /@CAPATH@/, "certs" );
    print $$0;
}
<<

configure:	config.h

!IFNDEF MAKEOPT
# Only default the behavior if MAKEOPT= is omitted
!IF "$(MAKE)" == "NMAKE"
# Microsoft NMake options
MAKEOPT=-nologo
!ELSEIF "($MAKE)" == "make"
# Borland make options?  Not really supported (yet)
MAKEOPT=-s -N
!ENDIF
!ENDIF

!IF EXIST("flood.mak")

clean:
	-floodenv.bat
	$(MAKE) $(MAKEOPT) -f flood.mak CFG="flood - Win32 $(LONG)" RECURSE=0 CLEAN
	del config.h floodenv.bat regex.h

build: config.h
	floodenv.bat
	$(MAKE) $(MAKEOPT) -f flood.mak CFG="flood - Win32 $(LONG)" RECURSE=0

!ELSEIF EXIST("flood.sln")

clean:  
	-floodenv.bat
	devenv flood.sln /useenv /clean $(LONG) /project flood
	del config.h floodenv.bat regex.h

build: config.h
	floodenv.bat
	devenv flood.sln /useenv /build $(LONG) /project flood

!ELSE

clean:  
	-floodenv.bat
	msdev flood.dsw /USEENV /MAKE \
		"flood - Win32 $(LONG)" /CLEAN
	del config.h floodenv.bat regex.h

build: config.h
	floodenv.bat
	msdev flood.dsw /USEENV /MAKE \
		"flood - Win32 $(LONG)" 

!ENDIF

install:
	echo Y >.y
	echo A >.a
	-mkdir "$(INSTDIR)"
	-mkdir "$(INSTDIR)\bin"
	-mkdir "$(INSTDIR)\certs"
	copy CHANGES "$(INSTDIR)\CHANGES.txt" <.y
	copy CONFIG "$(INSTDIR)\CONFIG.txt" <.y
	copy DESIGN "$(INSTDIR)\DESIGN.txt" <.y
	copy LICENSE "$(INSTDIR)\LICENSE.txt" <.y
	copy $(LONG)\flood.exe "$(INSTDIR)\bin" <.y
!IF EXIST("$(OPENSSLPATH)")
	copy $(OPENSSLPATH)\$(SSLBIN)\libeay32.dll "$(INSTDIR)\bin" <.y
	copy $(OPENSSLPATH)\$(SSLBIN)\ssleay32.dll "$(INSTDIR)\bin" <.y
	xcopy $(OPENSSLPATH)\certs "$(INSTDIR)\certs" < .a
	type << >> "$(INSTDIR)\README.txt"

  This binary distribution includes cryptographic software written by
  Eric Young (eay@cryptsoft.com), software written by Tim Hudson 
  (tjh@cryptsoft.com), and software developed by the OpenSSL Project 
  for use in the OpenSSL Toolkit <http://www.openssl.org/>.
<<
	-awk -f <<script.awk < "$(OPENSSLPATH)\LICENSE" >> "$(INSTDIR)\LICENSE.txt"
BEGIN {
    print "";
    print "For the libeay32.dll and ssleay32.dll components:";
    print "";
    while ( getline > 0 ) {
	print $$0;
   }
}
<<
	copy << + $(OPENSSLPATH)\NEWS "$(INSTDIR)\OPENSSL-NEWS.txt" <.y

 Apache flood Limited OpenSSL Distribution

 This binary distribution includes the minimal components of OpenSSL required
 to support flood (details are listed in OPENSSL-README.txt.)  For the complete 
 list of CHANGES to this and later versions of OpenSSL, please refer to the 
 definative source, <http://www.openssl.org/news/changelog.html>, or see the 
 CHANGES file in the full binary or source distribution package 
 from <http://www.openssl.org/>.

 These OpenSSL binaries were built for distribution from the U.S. without 
 support for the patented encryption methods IDEA, MDC-2 or RC5.

--------------------------------------------------------------------------------
<<
	copy << + $(OPENSSLPATH)\README "$(INSTDIR)\OPENSSL-README.txt" <.y

 Apache flood Limited OpenSSL Distribution

 This binary installation of OpenSSL is a limited distribution of the documents
 OPENSSL-LICENSE.txt, OPENSSL-NEWS.txt and OPENSSL-README.txt, and the binaries

   libeay32.dll
   ssleay32.dll

 These are the minimal libraries and tools required to use flood with HTTPS
 support for SSL v2/v3 and TLS v1.  No library link files, headers or sources 
 are distributed with this binary distribution.  Please refer to the 
 <http://www.openssl.org/> site for complete source or binary distributions.

 These OpenSSL binaries were built for distribution from the U.S. without 
 support for the patented encryption methods IDEA, MDC-2 or RC5.

 The Apache Projects only support the binary distribution of these files
 and development of the flood program.  We cannot provide support assistance
 for using or configuring the OpenSSL package or these modules.  Please refer
 all installation and configuration questions to the appropriate forum,
 such as the user supported lists, <http://httpd.apache.org/userslist.html> 
 the Apache HTTP Server user's list or <http://www.openssl.org/support/> the
 OpenSSL support page.

--------------------------------------------------------------------------------
<<
!ENDIF
	del .a .y

