# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ====================================================================
#
# NMAKEmakefile   Master Tomcat Native makefile.
# Usage:
#                 APR_DECLARE_STATIC=1  Use static version of the APR
#                 ENABLE_OCSP=1  	Enable OpenSSL OCSP code
#                 DEBUG=1   		Build DEBUG version of TCN
#
# Originally contributed by Mladen Turk <mturk redhat.com>
#
# ====================================================================
#

!IF !DEFINED(APR_DECLARE_STATIC) || "$(APR_DECLARE_STATIC)" == ""
PROJECT = libtcnative-1
!ELSE
PROJECT = tcnative-1
!ENDIF
TARGET = DLL

!include <NMAKEmakefile.inc>

!IF !DEFINED(APR_DECLARE_STATIC) || "$(APR_DECLARE_STATIC)" == ""
APR_LIB = libapr-1.lib
!ELSE
CFLAGS = $(CFLAGS) -DAPR_DECLARE_STATIC
APR_LIB = apr-1.lib
!ENDIF
!IF DEFINED(ENABLE_OCSP)
CFLAGS = $(CFLAGS) -DHAVE_OPENSSL_OCSP
!ENDIF

!IF !DEFINED(SRCDIR) || "$(SRCDIR)" == ""
SRCDIR = .
!ENDIF

INCLUDES = -I$(SRCDIR)\include $(JAVA_INCLUDES)

!IFNDEF WITH_APR
WITH_APR = $(SRCDIR)\srclib\apr
LDIRS = /libpath:"$(WITH_APR)\$(WORKDIR)"
!ELSE
LDIRS = /libpath:"$(WITH_APR)\lib"
!ENDIF

INCLUDES = $(INCLUDES) -I$(WITH_APR)\include -I$(WITH_APR)\include\arch\win32
!IF DEFINED(WITH_OPENSSL)
INCLUDES = $(INCLUDES) -I$(WITH_OPENSSL)\include
LDIRS = $(LDIRS) /libpath:"$(WITH_OPENSSL)\lib"
!ELSE
WITH_OPENSSL = $(SRCDIR)\srclib\openssl
INCLUDES = $(INCLUDES) -I$(WITH_OPENSSL)\inc32
LDIRS = $(LDIRS) /libpath:"$(WITH_OPENSSL)\out32"
!ENDIF

LFLAGS = $(LFLAGS) /version:1.1
LFLAGS = $(LFLAGS) user32.lib psapi.lib gdi32.lib shlwapi.lib wldap32.lib ole32.lib
LFLAGS = $(LFLAGS) $(APR_LIB)
LFLAGS = $(LFLAGS) libeay32.lib ssleay32.lib

CFLAGS = $(CFLAGS) -DZLIB_WINAPI -DNO_IDEA -DNO_RC5 -DNO_MDC2 -DOPENSSL_NO_IDEA \
	-DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DHAVE_OPENSSL -DHAVE_SSL_SET_STATE=1


PDBFLAGS = -Fo$(WORKDIR)\ -Fd$(WORKDIR)\$(PROJECT)-src
OBJECTS = \
	$(WORKDIR)\address.obj \
	$(WORKDIR)\bb.obj \
	$(WORKDIR)\dir.obj \
	$(WORKDIR)\error.obj \
	$(WORKDIR)\file.obj \
	$(WORKDIR)\info.obj \
	$(WORKDIR)\jnilib.obj \
	$(WORKDIR)\lock.obj \
	$(WORKDIR)\misc.obj \
	$(WORKDIR)\mmap.obj \
	$(WORKDIR)\multicast.obj \
	$(WORKDIR)\network.obj \
	$(WORKDIR)\os.obj \
	$(WORKDIR)\poll.obj \
	$(WORKDIR)\pool.obj \
	$(WORKDIR)\proc.obj \
	$(WORKDIR)\shm.obj \
	$(WORKDIR)\ssl.obj \
	$(WORKDIR)\sslcontext.obj \
	$(WORKDIR)\sslinfo.obj \
	$(WORKDIR)\sslnetwork.obj \
	$(WORKDIR)\sslutils.obj \
	$(WORKDIR)\stdlib.obj \
	$(WORKDIR)\user.obj \
	$(WORKDIR)\thread.obj \
	$(WORKDIR)\ntpipe.obj \
	$(WORKDIR)\registry.obj \
	$(WORKDIR)\system.obj

HEADERS = \
	$(SRCDIR)\include\tcn.h \
	$(SRCDIR)\include\tcn_api.h \
	$(SRCDIR)\include\tcn_version.h \
	$(SRCDIR)\include\ssl_private.h

BUILDLIB = $(PREFIX)\lib
BUILDBIN = $(WORKDIR)\$(PROJECT).dll
BUILDPDB = $(WORKDIR)\$(PROJECT).pdb
BUILDRES = $(WORKDIR)\$(PROJECT).res
BUILDMAN = $(BUILDBIN).manifest

all : $(WORKDIR) $(BUILDBIN)

$(BUILDLIB) :
	@if not exist "$(BUILDLIB)\$(NULL)" mkdir "$(BUILDLIB)"

$(WORKDIR) :
	@$(MAKEWORKDIR)

{$(SRCDIR)\src}.c{$(WORKDIR)}.obj:
	$(CC) $(CFLAGS) $(INCLUDES) $(PDBFLAGS) $<

{$(SRCDIR)\os\win32}.c{$(WORKDIR)}.obj:
	$(CC) $(CFLAGS) $(INCLUDES) $(PDBFLAGS) $<

$(OBJECTS): $(HEADERS)

$(BUILDRES): $(SRCDIR)\os\win32\libtcnative.rc $(HEADERS)
	$(RC) $(RCFLAGS) /i "$(SRCDIR)\include" /fo $(BUILDRES) $(SRCDIR)\os\win32\libtcnative.rc

$(BUILDBIN): $(WORKDIR) $(OBJECTS) $(BUILDRES)
	$(LINK) $(LFLAGS) $(OBJECTS) $(BUILDRES) $(LIBS) $(LDIRS) /pdb:$(BUILDPDB) /out:$(BUILDBIN)
	IF EXIST $(BUILDMAN) \
		mt -nologo -manifest $(BUILDMAN) -outputresource:$(BUILDBIN);2

clean:
	@$(CLEANTARGET)

install: $(BUILDLIB) $(WORKDIR) $(BUILDBIN)
	@xcopy "$(WORKDIR)\*.lib" "$(BUILDLIB)" /Y /Q
	@xcopy "$(WORKDIR)\*.dll" "$(BUILDLIB)" /Y /Q
