# 
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (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.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is the Netscape Portable Runtime (NSPR).
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998-2000
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****


#! gmake

MOD_DEPTH	= ../..
topsrcdir	= @top_srcdir@
srcdir		= @srcdir@
VPATH		= @srcdir@

include $(MOD_DEPTH)/config/autoconf.mk

include $(topsrcdir)/config/config.mk

DIRS = dll

CSRCS =             \
	accept.c		\
	acceptread.c	\
	acceptreademu.c	\
	addrstr.c		\
	affinity.c		\
	alarm.c			\
	anonfm.c		\
	append.c		\
	atomic.c		\
	attach.c		\
	bigfile.c		\
	bigfile2.c		\
	bigfile3.c		\
	cleanup.c		\
	cltsrv.c		\
	concur.c	    \
	cvar.c			\
	cvar2.c			\
	dceemu.c		\
	dlltest.c		\
	dtoa.c			\
	env.c			\
	errcodes.c		\
	errset.c		\
	exit.c  		\
	fdcach.c		\
	fileio.c		\
	foreign.c	    \
	forktest.c	    \
	formattm.c	    \
	fsync.c	        \
	getai.c			\
	gethost.c		\
	getproto.c		\
	i2l.c		    \
	initclk.c		\
	inrval.c		\
	instrumt.c      \
	intrio.c        \
	intrupt.c       \
	io_timeout.c    \
	ioconthr.c      \
	ipv6.c          \
	join.c    		\
	joinkk.c        \
	joinku.c        \
	joinuk.c        \
	joinuu.c        \
	layer.c		    \
	lazyinit.c		\
	libfilename.c	\
	lltest.c        \
	lock.c          \
	lockfile.c      \
	logfile.c       \
	logger.c		\
	makedir.c		\
	mbcs.c			\
	multiacc.c		\
	multiwait.c		\
	many_cv.c		\
	nameshm1.c      \
	nbconn.c		\
	nblayer.c		\
	nonblock.c		\
	ntioto.c        \
	ntoh.c			\
	obsints.c		\
	op_2long.c      \
	op_excl.c		\
	op_filnf.c		\
	op_filok.c		\
	op_noacc.c		\
	op_nofil.c		\
	openfile.c		\
	parent.c    	\
	parsetm.c    	\
	peek.c    		\
	perf.c    		\
	pipeping.c		\
	pipeping2.c		\
	pipepong.c		\
	pipepong2.c		\
	pipeself.c		\
	poll_er.c		\
	poll_nm.c		\
	poll_to.c		\
	pollable.c		\
	prftest.c		\
	prftest1.c		\
	prftest2.c		\
	primblok.c		\
	priotest.c		\
	provider.c		\
	prpoll.c		\
	prpollml.c		\
	ranfile.c       \
	randseed.c      \
	reinit.c        \
	rmdir.c			\
	rwlocktest.c    \
	sel_spd.c  		\
	selct_er.c	    \
	selct_nm.c	    \
	selct_to.c	    \
	select2.c  		\
	selintr.c  		\
	sem.c 	  		\
	sema.c 	  		\
	semaerr.c 		\
	semaerr1.c 		\
	semaping.c 		\
	semapong.c 		\
	sendzlf.c 		\
	server_test.c	\
	servr_kk.c		\
	servr_ku.c		\
	servr_uk.c		\
	servr_uu.c		\
	short_thread.c	\
	sigpipe.c		\
	socket.c		\
	sockopt.c		\
	sockping.c		\
	sockpong.c		\
	sprintf.c		\
	sproc_ch.c	    \
	sproc_p.c	    \
	stack.c		    \
	stdio.c		    \
	str2addr.c		\
	strod.c			\
	suspend.c		\
	switch.c		\
	system.c		\
	testbit.c    	\
	testfile.c    	\
	thrpool_server.c \
	thrpool_client.c \
	threads.c 	  	\
	thruput.c 	  	\
	timemac.c		\
	timetest.c		\
	tmoacc.c        \
	tmocon.c        \
	tpd.c			\
	vercheck.c		\
	version.c	    \
	udpsrv.c	    \
	writev.c        \
	xnotify.c       \
	y2k.c           \
	y2ktmo.c        \
	zerolen.c       \
	$(NULL)

ifeq ($(OS_ARCH),WINCE)
CFLAGS += -FImozce_shunt.h -Zi -UDEBUG -DNDEBUG
LDOPTS += -link $(DIST)/lib/mozce_shunt.lib ws2.lib -DEBUG -DEBUGTYPE:CV -INCREMENTAL:NO -PDB:$(@:.exe=.pdb)
endif

ifeq ($(OS_TARGET),OS2)
CSRCS +=            \
	sleep.c			\
	stat.c		    \
	yield.c         \
	$(NULL)
endif

ifeq (,$(filter-out WINCE WINNT OS2,$(OS_ARCH)))
PROG_SUFFIX = .exe
DLL_SUFFIX = .dll
else
PROG_SUFFIX =
DLL_SUFFIX = 
endif

PROGS = $(addprefix $(OBJDIR)/, $(CSRCS:.c=$(PROG_SUFFIX)))

TARGETS = $(PROGS)

INCLUDES = -I$(dist_includedir) -I$(topsrcdir)/pr/include -I$(topsrcdir)/pr/include/private

ifeq ($(OS_ARCH), WINNT)
ifdef NS_USE_GCC
  EXTRA_LIBS += -lwsock32
else
  EXTRA_LIBS += wsock32.lib
  LDOPTS = -NOLOGO -DEBUG -DEBUGTYPE:CV -INCREMENTAL:NO
  ifdef PROFILE
    LDOPTS += -PROFILE -MAP
  endif # profile
endif # NS_USE_GCC
endif

ifeq ($(OS_ARCH),OS2)
EXTRA_LIBS = $(OS_LIBS)
LDOPTS = -Zomf -Zlinker /PM:VIO -Zlinker /ST:0x64000
endif

ifneq ($(OS_ARCH), WINNT)
# Use an absolute pathname as the runtime library path (for the -R
# or -rpath linker option or the LD_RUN_PATH environment variable).
ifeq (,$(patsubst /%,,$(DIST)))
# $(DIST) is already an absolute pathname.
ABSOLUTE_LIB_DIR = $(dist_libdir)
else
# $(DIST) is a relative pathname: prepend the current directory.
PWD = $(shell pwd)
ABSOLUTE_LIB_DIR = $(PWD)/$(dist_libdir)
endif
endif

ifeq ($(OS_ARCH), IRIX)
    ifeq ($(USE_CPLUS), 1)
        CC = CC
    endif
    LDOPTS += -rpath $(ABSOLUTE_LIB_DIR)
    ifdef NS_USE_GCC
        LDOPTS += -Wl,-rdata_shared
    else
        LDOPTS += -rdata_shared
    endif
# For 6.x machines, include this flag
    ifeq ($(basename $(OS_RELEASE)),6)
        ifndef NS_USE_GCC
            ifeq ($(USE_N32),1)
                LDOPTS += -n32
            else
                LDOPTS += -32
            endif

            ifeq ($(USE_PTHREADS), 1)
                ifeq ($(OS_RELEASE), 6.2)
                    LDOPTS += -Wl,-woff,85
                endif
            endif
        endif
    endif
endif

ifeq ($(OS_ARCH), OSF1)
    ifeq ($(USE_CPLUS), 1)
        CC = cxx
    endif
# I haven't figured out how to pass -rpath to cc on OSF1 V3.2, so
# we do static linking.
    ifeq (,$(filter-out V2.0 V3.2,$(OS_RELEASE)))
        LIBNSPR = $(dist_libdir)/libnspr$(MOD_MAJOR_VERSION).a
        LIBPLC = $(dist_libdir)/libplc$(MOD_MAJOR_VERSION).a
        EXTRA_LIBS = -lc_r
    else
        LDOPTS += -rpath $(ABSOLUTE_LIB_DIR)
    endif
endif

ifeq ($(OS_ARCH), HP-UX)
    LDOPTS += -z -Wl,+s,+b,$(ABSOLUTE_LIB_DIR)
    ifeq ($(USE_64),1)
        LDOPTS += +DD64
    endif
    ifeq ($(USE_PTHREADS),1)
        EXTRA_LIBS = $(LIBPTHREAD)
    endif
endif

# AIX
ifeq ($(OS_ARCH),AIX)
    LDOPTS += -blibpath:$(ABSOLUTE_LIB_DIR):/usr/lib:/lib
    ifneq ($(OS_ARCH)$(OS_RELEASE),AIX4.1)
        LDOPTS += -brtl
        EXTRA_LIBS = -ldl
    endif
endif

# Solaris
ifeq ($(OS_ARCH), SunOS)
    ifneq ($(OS_RELEASE), 4.1.3_U1)
        ifdef NS_USE_GCC
            LDOPTS += -Xlinker -R -Xlinker $(ABSOLUTE_LIB_DIR)
        else
            ifeq ($(USE_CPLUS), 1)
                CC = CC
            endif
            LDOPTS += -R $(ABSOLUTE_LIB_DIR)
        endif
    endif

    ifdef USE_PTHREADS
        EXTRA_LIBS = -lpthread
    endif
endif # SunOS

ifeq ($(OS_ARCH), NEC)
    EXTRA_LIBS = $(OS_LIBS)
# This hardcodes in the executable programs the directory to find
# libnspr.so etc. at program startup.  Equivalent to the -R or -rpath
# option for ld on other platforms.
    export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH), NCR)
# NCR needs to link against -lsocket -lnsl -ldl (and -lc, which is
# linked implicitly by $(CC)).  Note that we did not link with these
# system libraries when we built libnspr.so.
    EXTRA_LIBS = -lsocket -lnsl -ldl
# This hardcodes in the executable programs the directory to find
# libnspr.so etc. at program startup.  Equivalent to the -R or -rpath 
# option for ld on other platforms.
    export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH), NEXTSTEP)
# balazs.pataki@sztaki.hu: linkage is done in a different pass in the `tests'
# modeul, so we have to pass the `-posix' flag by "hand" to `ld'
LDOPTS += -posix
endif

ifeq ($(OS_ARCH), NEWS-OS)
# This hardcodes in the executable programs the directory to find
# libnspr.so etc. at program startup.  Equivalent to the -R or -rpath 
# option for ld on other platforms.
#export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
    LIBNSPR = $(dist_libdir)/libnspr$(MOD_MAJOR_VERSION).a
    LIBPLC = $(dist_libdir)/libplc$(MOD_MAJOR_VERSION).a
    EXTRA_LIBS = -lsocket -lnsl -lgen -lresolv
endif

ifeq (,$(filter-out Linux GNU GNU_%,$(OS_ARCH)))
    LDOPTS += -Xlinker -rpath $(ABSOLUTE_LIB_DIR)
    ifeq ($(USE_PTHREADS),1)
        EXTRA_LIBS = -lpthread
    endif
endif

ifeq ($(OS_ARCH), SCOOS)
# SCO Unix needs to link against -lsocket again even though we
# already linked with these system libraries when we built libnspr.so.
EXTRA_LIBS = -lsocket
# This hardcodes in the executable programs the directory to find
# libnspr.so etc. at program startup.  Equivalent to the -R or -rpath 
# option for ld on other platforms.
export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH),SINIX)
EXTRA_LIBS = -lsocket -lnsl -lresolv -ldl
# This hardcodes in the executable programs the directory to find
# libnspr.so etc. at program startup.  Equivalent to the -R or -rpath
# option for ld on other platforms.
export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH),OpenUNIX)
export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
ifeq ($(USE_PTHREADS),1)
LDOPTS += -pthread
endif
endif

ifeq ($(OS_ARCH), UNIXWARE)
export LD_RUN_PATH = $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH),FreeBSD)
ifeq ($(USE_PTHREADS),1)
LDOPTS += -pthread
endif
LDOPTS += -Xlinker -R $(ABSOLUTE_LIB_DIR)
endif

ifeq ($(OS_ARCH),OpenBSD)
ifeq ($(USE_PTHREADS),1)
LDOPTS += -pthread
endif
endif

ifeq ($(OS_ARCH),BSD_OS)
ifneq ($(OS_RELEASE),1.1)
EXTRA_LIBS = -ldl
endif
endif

ifeq ($(OS_ARCH),RISCOS)
EXTRA_LIBS = -ldl
endif

ifeq ($(USE_PTHREADS),1)
LIBPTHREAD = -lpthread
ifeq ($(OS_ARCH),AIX)
LIBPTHREAD = -lpthreads
endif
ifeq (,$(filter-out FreeBSD OpenBSD BSD_OS QNX Darwin OpenUNIX,$(OS_ARCH)))
LIBPTHREAD =
endif
ifeq ($(OS_ARCH)$(basename $(OS_RELEASE)),HP-UXB.10)
LIBPTHREAD = -ldce
endif
endif

ifeq ($(OS_TARGET),Android)
LDOPTS=$(OS_LDFLAGS)
LIBPTHREAD=
XCFLAGS=${OS_CFLAGS}
endif

#####################################################
#
# The rules
#
#####################################################

include $(topsrcdir)/config/rules.mk

AIX_PRE_4_2 = 0
ifeq ($(OS_ARCH),AIX)
ifeq ($(OS_RELEASE),4.1)
ifneq ($(USE_PTHREADS), 1)
#AIX_PRE_4_2 = 1
endif
endif
endif

ifeq ($(AIX_PRE_4_2),1)

# AIX releases prior to 4.2 need a special two-step linking hack
# in order to both override the system select() and be able to 
# get at the original system select().
#
# We use a pattern rule in ns/nspr20/config/rules.mk to generate
# the .$(OBJ_SUFFIX) file from the .c source file, then do the
# two-step linking hack below.

$(OBJDIR)/%: $(OBJDIR)/%.$(OBJ_SUFFIX)
	@$(MAKE_OBJDIR)
	rm -f $@ $(AIX_TMP)
	$(CC) $(AIX_LINK_OPTS) -o $(AIX_TMP) $< $(dist_libdir)/libnspr$(MOD_MAJOR_VERSION).a
	$(CC) -o $@ $(AIX_TMP) $(AIX_WRAP)
	rm -f $(AIX_TMP)

else

# All platforms that are not AIX pre-4.2.

$(OBJDIR)/%$(PROG_SUFFIX): $(OBJDIR)/%.$(OBJ_SUFFIX)
	@$(MAKE_OBJDIR)
ifeq ($(NS_USE_GCC)_$(OS_ARCH),_WINNT)
	link $(LDOPTS) $(EXTRA_LDOPTS) $< $(LIBPLC) $(LIBNSPR) $(EXTRA_LIBS) -out:$@
ifdef MT
	@if test -f $@.manifest; then \
		$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
		rm -f $@.manifest; \
	fi
endif
else
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(EXTRA_LIBS) -o $@
endif # WINNT
endif # AIX_PRE_4_2

export:: $(TARGETS)
clean::
	rm -f $(TARGETS)

# The following tests call BSD socket functions, so they need to link
# with -lsocket on some platforms.
ifeq ($(OS_ARCH),SunOS)
ifneq ($(OS_RELEASE),4.1.3_U1)
ifeq ($(USE_IPV6),1)
$(OBJDIR)/gethost: $(OBJDIR)/gethost.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) -lsocket $(EXTRA_LIBS) -o $@
endif
$(OBJDIR)/prpoll: $(OBJDIR)/prpoll.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) -lsocket $(EXTRA_LIBS) -o $@
endif
endif

ifeq ($(USE_PTHREADS), 1)
$(OBJDIR)/attach: $(OBJDIR)/attach.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(LIBPTHREAD) $(EXTRA_LIBS) -o $@
$(OBJDIR)/foreign: $(OBJDIR)/foreign.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(LIBPTHREAD) $(EXTRA_LIBS) -o $@
$(OBJDIR)/provider: $(OBJDIR)/provider.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(LIBPTHREAD) $(EXTRA_LIBS) -o $@
$(OBJDIR)/socket: $(OBJDIR)/socket.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(LIBPTHREAD) $(EXTRA_LIBS) -o $@
$(OBJDIR)/testfile: $(OBJDIR)/testfile.o
	$(PURE) $(CC) $(XCFLAGS) $< $(LDOPTS) $(LIBPLC) $(LIBNSPR) $(LIBPTHREAD) $(EXTRA_LIBS) -o $@
endif

#
# Run the test programs with no arguments
#
# Test output goes to the file pointed to by the environment variable
# NSPR_TEST_LOGFILE, if set, else to /dev/null
#
ECHO = echo
PROGRAMS = $(notdir $(PROGS))
ifdef NSPR_TEST_LOGFILE
LOGFILE = $(NSPR_TEST_LOGFILE)
else
ifeq (,$(filter-out WINNT OS2,$(OS_ARCH)))
LOGFILE = nul
else
LOGFILE = /dev/null
endif
endif

ifeq ($(OS_TARGET),Linux)
ECHO = /bin/echo
endif

ALWAYS:

runtests:: $(PROGS) ALWAYS
	@$(ECHO) "\nNSPR Test Results - $(OBJDIR)\n"
	@$(ECHO) "BEGIN\t\t\t`date`"
	@$(ECHO) "NSPR_TEST_LOGFILE\t$(LOGFILE)\n"
	@$(ECHO) "Test\t\t\tResult\n"
	@cd $(OBJDIR); for i in $(PROGRAMS); do					\
	$(ECHO) "$$i\c";										\
	./$$i >> $(LOGFILE) 2>&1 ;								\
	if  [ 0 = $$? ] ; then									\
		$(ECHO) "\t\t\tPassed";								\
	else													\
		$(ECHO) "\t\t\tFAILED";								\
	fi;														\
	done
	@$(ECHO) "\nEND\t\t`date`\n"
