#
# Copyright 1999-2004 The Apache Software Foundation
#
# Licensed 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.
#

# @author  Pier Fumagalli <mailto:pier@betaversion.org>
# @version $Id$

# All our object files
OBJS =   wa_config.obj \
         wa_main.obj \
         wa_request.obj \
         pr_info.obj \
         pr_warp.obj \
         pr_warp_config.obj \
         pr_warp_network.obj \
         pr_warp_packet.obj \
         pr_warp_socketpool.obj

# Files created by this script (for removal only)
GENS =   webapp.idb \
         webapp.pdb \
         pr_warp_defs.h

# The target library
LIBS =   webapp.lib

# Microsoft Visual C/C++ 6.0 compilation and linking programs
CC =     cl.exe
LINK =   link.exe

# Flags for the C compiler
CFLAGS = /nologo \
         /W3 \
!IF "$(DEBUG)" == "true"
         /MDd \
         /GX \
         /Zi \
         /Od \
         /Yd \
         /D"DEBUG" \
!ELSE
	     /MD \
	     /O2 \
!ENDIF
	     /I "." \
	     /I "..\include" \
	     /I "..\apr\include" \
	     /D"WIN32" \
	     /Fd".\webapp" \
	     /FD

# Flags for the library linker
LFLAGS = -lib \
         /nologo

# Makefile rules
all: $(LIBS)

webapp.lib: pr_warp_defs.h $(OBJS)
    $(LINK) $(LFLAGS) /out:$@ $(OBJS)

pr_warp_defs.h:
    type ..\java\Constants.java.in | \
        ..\support\grep TYPE_ | \
        ..\support\sed "s/public static final int/#define/g" | \
        ..\support\sed "y/=;/  /" > pr_warp_defs.h

clean:
    -@for %%i in ($(OBJS) $(GENS) $(LIBS)) do \
        @erase "%%i"

.c.obj:
	$(CC) $(CFLAGS) /Fo"$@" /c "$<"
