#
# 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  = nsapi_rd
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	= Netscape plugin for Tomcat $(JK_VERSION_STR)
MTSAFE	= NO
STACK	= 65536
#SCREEN	= System Console
MODULES	= nshttpd
EXPORTS	= jk_init jk_service
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_nsapi_plugin.o \
	$(OBJDIR)/jk_nwmain.o \
	$(OBJDIR)/jk_ajp12_worker.o \
	$(OBJDIR)/jk_ajp13.o \
	$(OBJDIR)/jk_ajp13_worker.o \
	$(OBJDIR)/jk_ajp14.o \
	$(OBJDIR)/jk_ajp14_worker.o \
	$(OBJDIR)/jk_ajp_common.o \
	$(OBJDIR)/jk_connect.o \
	$(OBJDIR)/jk_context.o \
	$(OBJDIR)/jk_jni_worker.o \
	$(OBJDIR)/jk_lb_worker.o \
	$(OBJDIR)/jk_map.o \
	$(OBJDIR)/jk_md5.o \
	$(OBJDIR)/jk_msg_buff.o \
	$(OBJDIR)/jk_pool.o \
	$(OBJDIR)/jk_shm.o \
	$(OBJDIR)/jk_sockbuf.o \
	$(OBJDIR)/jk_status.o \
	$(OBJDIR)/jk_uri_worker_map.o \
	$(OBJDIR)/jk_util.o \
	$(OBJDIR)/jk_worker.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


