#
# Makefile for jk_nsapi_plugin (NetWare version - gnu make)
# created by Guenter Knauf <fuankg@apache.org>
#

# Edit the path below to point to the base of your Netscape includes.
ifndef NS_HOME
NS_HOME	= c:/projects/sdks/netscape
endif
# Edit the path below to point to the base of your NetWare Java SDK.
ifndef NW_JDK
NW_JDK	= c:/projects/sdks/java-nw
endif
# Edit the path below to point to the base of your Novell NDK.
ifndef NDKBASE
NDKBASE	= c:/novell
endif

ifndef INSTDIR
INSTDIR	= s:/sys/novonyx/modules
endif

# Edit the vars below to change NLM target settings.
TARGET  = jni_conn
VERSION	= $(JK_VERSION)
#COPYR	= Copyright (c) 2000-2007 The Apache Software Foundation. All rights reserved.
COPYR	= Licensed under the Apache License, Version 2.0
DESCR	= JNI natives for Tomcat $(JK_VERSION_STR)
MTSAFE	= NO
STACK	= 64000
#SCREEN	= System Console
MODULES	= nsapi
EXPORTS	= \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_write \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_startReasponse \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readHeaders \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_readEnvironment \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_read \
	Java_org_apache_tomcat_modules_server_JNIConnectionHandler_getNumberOfHeaders

#IMPORTS	= __nsapi30_table

# Edit the var below to point to your lib architecture.
ifndef LIBARCH
LIBARCH = CLIB
# LIBARCH = LIBC
endif

# must be equal to DEBUG or NDEBUG
DB	= NDEBUG
# DB	= DEBUG
# Optimization: -O<n> or debugging: -g
ifeq ($(DB),NDEBUG)
	OPT	= -O2
	OBJDIR	= release
else
	OPT	= -g
	OBJDIR	= debug
endif

# Include the version info retrieved from jk_version.h
-include $(OBJDIR)/version.inc

# The following line defines your compiler.
ifdef METROWERKS
	CC = mwccnlm
else
	CC = gcc
endif
# RM	= rm -f
# CP	= cp -fv
# if you want to mark the target as MTSAFE you will need a tool for
# generating the xdc data for the linker; here's a minimal tool:
# http://www.gknw.net/development/prgtools/mkxdc.zip
MPKXDC	= mkxdc
AWK	= awk

# Global flags for all compilers
CFLAGS	= $(OPT) -D$(DB) -DNETWARE -DXP_NETWARE -nostdinc

ifeq ($(CC),mwccnlm)
LD	= mwldnlm
LDFLAGS	= -nostdlib $(OBJS) $(PRELUDE) $(LDLIBS) -o $@ -commandfile
CFLAGS	+= -gccinc -inline off -opt nointrinsics
#CFLAGS	+= -w on
ifeq ($(LIBARCH),LIBC)
	PRELUDE = $(SDK_LIBC)/imports/libcpre.o
	CFLAGS += -align 4 -inst mmx -proc 686
#	CFLAGS += -D__ANSIC__
else
	PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj"
	LDLIBS = "$(METROWERKS)/Novell Support/libraries/runtime/mwcrtl.lib"
#	CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h"
	CFLAGS += -align 1 -proc 586
endif
else
LD	= nlmconv
LDFLAGS	= -T
CFLAGS	+= -fno-builtin -fpack-struct -fpcc-struct-return
CFLAGS	+= -Wall -Wno-main # -pedantic
ifeq ($(LIBARCH),LIBC)
	PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
#	CFLAGS += -D__ANSIC__
else
	PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
	CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
endif
endif

NDK_ROOT = $(NDKBASE)/ndk
SDK_CLIB = $(NDK_ROOT)/nwsdk
SDK_LIBC = $(NDK_ROOT)/libc
JKCOMMON = ../common

INCLUDES = -I$(NS_HOME)/include -I$(NS_HOME)/include/base
INCLUDES += -I$(JKCOMMON) -I$(NW_JDK)/include -I$(NW_JDK)/include/netware 

ifeq ($(LIBARCH),LIBC)
	INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
	INCLUDES += -I$(SDK_LIBC)/include/winsock
else
	INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include
	# INCLUDES += -I$(NDKBASE)/ws295sdk/include
	CFLAGS += -DNETDB_USE_INTERNET
endif
CFLAGS	+= $(INCLUDES)

ifeq ($(MTSAFE),YES)
	XDCDATA = $(OBJDIR)/$(TARGET).xdc
endif

ifeq ($(findstring linux,$(OSTYPE)),linux)
DL	= '
#-include $(NDKBASE)/nlmconv/ncpfs.inc
endif

OBJS	= \
	$(OBJDIR)/jk_jnicb.o \
	$(OBJDIR)/jk_nwmain.o \
	$(OBJDIR)/jk_map.o \
	$(OBJDIR)/jk_pool.o \
	$(OBJDIR)/jk_util.o \
	$(OBJDIR)/ap_snprintf.o

vpath %.c . $(JKCOMMON)


all: $(OBJDIR) $(OBJDIR)/version.inc $(OBJDIR)/$(TARGET).nlm 

$(OBJDIR)/%.o: %.c
	@echo Compiling $<
	@$(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR)/version.inc: $(JKCOMMON)/jk_version.h $(OBJDIR)
	@echo Creating $@
	@$(AWK) -f ../../support/get_ver.awk $< > $@

dist: all
	-$(RM) $(OBJDIR)/*.o $(OBJDIR)/$(TARGET).map $(OBJDIR)/$(TARGET).ncv
	-$(RM) $(OBJDIR)/$(TARGET).def $(OBJDIR)/version.inc $(XDCDATA)
#	-$(CP) ../changes.txt $(OBJDIR)/

install: all
	@[ -d $(INSTDIR) ] || mkdir $(INSTDIR)
	@$(CP) $(TARGET).nlm $(INSTDIR)

clean:
	-$(RM) -r $(OBJDIR)

$(OBJDIR):
	@mkdir $(OBJDIR)

$(OBJDIR)/$(TARGET).nlm: $(OBJS) $(OBJDIR)/$(TARGET).def $(XDCDATA)
	@echo Linking $@
	@-$(RM) $@
	@$(LD) $(LDFLAGS) $(OBJDIR)/$(TARGET).def

$(OBJDIR)/%.xdc: Makefile.netware
	@echo Creating $@
	@$(MPKXDC) $(XDCOPT) $@

$(OBJDIR)/%.def: Makefile.netware
	@echo $(DL)# DEF file for linking with $(LD)$(DL) > $@
	@echo $(DL)# Do not edit this file - it is created by make!$(DL) >> $@
	@echo $(DL)# All your changes will be lost!!$(DL) >> $@
	@echo $(DL)#$(DL) >> $@
	@echo $(DL)copyright "$(COPYR)"$(DL) >> $@
	@echo $(DL)description "$(DESCR)"$(DL) >> $@
	@echo $(DL)version $(VERSION)$(DL) >> $@
ifdef NLMTYPE
	@echo $(DL)type $(NLMTYPE)$(DL) >> $@
endif
ifdef STACK
	@echo $(DL)stack $(STACK)$(DL) >> $@
endif
ifdef SCREEN
	@echo $(DL)screenname "$(SCREEN)"$(DL) >> $@
else
	@echo $(DL)screenname "DEFAULT"$(DL) >> $@
endif
ifeq ($(DB),DEBUG)
	@echo $(DL)debug$(DL) >> $@
endif
	@echo $(DL)threadname "$(TARGET)"$(DL) >> $@
ifdef XDCDATA
	@echo $(DL)xdcdata $(XDCDATA)$(DL) >> $@
endif
ifeq ($(LIBARCH),CLIB)
	@echo $(DL)start _Prelude$(DL) >> $@
	@echo $(DL)exit _Stop$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/clib.imp$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/threads.imp$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/nlmlib.imp$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/nwsdk/imports/socklib.imp$(DL) >> $@
	@echo $(DL)module clib$(DL) >> $@
else
ifeq ($(LD),nlmconv)
	@echo $(DL)flag_on 64$(DL) >> $@
else
	@echo $(DL)autounload$(DL) >> $@
endif
	@echo $(DL)pseudopreemption$(DL) >> $@
	@echo $(DL)start _LibCPrelude$(DL) >> $@
	@echo $(DL)exit _LibCPostlude$(DL) >> $@
	@echo $(DL)check _LibCCheckUnload$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/libc/imports/libc.imp$(DL) >> $@
	@echo $(DL)import @$(NDK_ROOT)/libc/imports/netware.imp$(DL) >> $@
	@echo $(DL)module libc$(DL) >> $@
endif
ifdef MODULES
	@echo $(DL)module $(MODULES)$(DL) >> $@
endif
ifdef EXPORTS
	@echo $(DL)export $(EXPORTS)$(DL) >> $@
endif
ifdef IMPORTS
	@echo $(DL)import $(IMPORTS)$(DL) >> $@
endif
ifeq ($(LD),nlmconv)
	@echo $(DL)input $(OBJS)$(DL) >> $@
	@echo $(DL)input $(PRELUDE)$(DL) >> $@
ifdef LDLIBS
	@echo $(DL)input $(LDLIBS)$(DL) >> $@
endif
	@echo $(DL)output $*.nlm$(DL) >> $@
endif


