diff --git a/nsprpub/config/Makefile b/nsprpub/config/Makefile index e8002edf7054..6afd21d831fc 100644 --- a/nsprpub/config/Makefile +++ b/nsprpub/config/Makefile @@ -34,7 +34,7 @@ endif # Temporary workaround to disable the generation of # library build time because now.c uses the 'long long' # data type that's not available on some platforms. -ifeq (,$(filter-out NEC SCOOS UNIXWARE,$(OS_ARCH))) +ifeq (,$(filter-out NEC NEXTSTEP SCOOS UNIXWARE,$(OS_ARCH))) DEFINES += -DOMIT_LIB_BUILD_TIME endif diff --git a/nsprpub/config/NEXTSTEP.mk b/nsprpub/config/NEXTSTEP.mk new file mode 100644 index 000000000000..7f6f4fe5b460 --- /dev/null +++ b/nsprpub/config/NEXTSTEP.mk @@ -0,0 +1,52 @@ +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. +# + +# +# Config stuff for NEXTSTEP +# + +include $(MOD_DEPTH)/config/UNIX.mk + +CC = cc +CCC = cc++ + +RANLIB = ranlib + +OS_REL_CFLAGS = -D$(shell uname -p) +CPU_ARCH := $(shell uname -p) + +# "Commons" are tentative definitions in a global scope, like this: +# int x; +# The meaning of a common is ambiguous. It may be a true definition: +# int x = 0; +# or it may be a declaration of a symbol defined in another file: +# extern int x; +# Use the -fno-common option to force all commons to become true +# definitions so that the linker can catch multiply-defined symbols. +# Also, common symbols are not allowed with Rhapsody dynamic libraries. + +OS_CFLAGS = $(DSO_CFLAGS) $(OS_REL_CFLAGS) -Wall -fno-common -pipe -DNEXTSTEP -DHAVE_STRERROR -DHAVE_BSD_FLOCK -D_POSIX_SOURCE -traditional-cpp -posix + +DEFINES += -D_PR_LOCAL_THREADS_ONLY -D_PR_NEED_FAKE_POLL + +ARCH = $(CPU_ARCH) + +# May override this with -bundle to create a loadable module. +#DSO_LDOPTS = -dynamiclib + +#MKSHLIB = $(CC) -arch $(CPU_ARCH) $(DSO_LDOPTS) +DLL_SUFFIX = dylib diff --git a/nsprpub/config/nsinstall.c b/nsprpub/config/nsinstall.c index c3a3bba8560a..67c0d225aea4 100644 --- a/nsprpub/config/nsinstall.c +++ b/nsprpub/config/nsinstall.c @@ -43,7 +43,7 @@ #define HAVE_LCHOWN -#if defined(AIX) || defined(BSDI) || defined(HPUX) || defined(LINUX) || defined(SUNOS4) || defined(SCO) || defined(UNIXWARE) || defined(RHAPSODY) +#if defined(AIX) || defined(BSDI) || defined(HPUX) || defined(LINUX) || defined(SUNOS4) || defined(SCO) || defined(UNIXWARE) || defined(RHAPSODY) || defined(NEXTSTEP) #undef HAVE_LCHOWN #endif @@ -51,15 +51,39 @@ * Does getcwd() take NULL as the first argument and malloc * the result buffer? */ -#if !defined(RHAPSODY) +#if !defined(RHAPSODY) && !defined(NEXTSTEP) #define GETCWD_CAN_MALLOC #endif +#ifdef NEXTSTEP +#include + +/* +** balazs.pataki@sztaki.hu: The getcwd is broken in NEXTSTEP (returns 0), +** when called on a mounted fs. Did anyone notice this? Here's an ugly +** workaround ... +*/ +#define getcwd(b,s) my_getcwd(b,s) + +static char * +my_getcwd (char *buf, size_t size) +{ + FILE *pwd = popen("pwd", "r"); + char *result = fgets(buf, size, pwd); + + if (result) { + buf[strlen(buf)-1] = '\0'; + } + pclose (pwd); + return buf; +} +#endif /* NEXTSTEP */ + #ifdef LINUX #include #endif -#if defined(SCO) || defined(UNIXWARE) || defined(SNI) || defined(NCR) || defined(NEC) +#if defined(SCO) || defined(UNIXWARE) || defined(SNI) || defined(NCR) || defined(NEC) || defined(NEXTSTEP) #if !defined(S_ISLNK) && defined(S_IFLNK) #define S_ISLNK(a) (((a) & S_IFMT) == S_IFLNK) #endif diff --git a/nsprpub/pr/include/gencfg.c b/nsprpub/pr/include/gencfg.c index 695f17ba0f20..f8160611c29d 100644 --- a/nsprpub/pr/include/gencfg.c +++ b/nsprpub/pr/include/gencfg.c @@ -83,6 +83,12 @@ #endif #endif +#if defined(__NeXT__) +#ifndef NEXTSTEP + error - NEXTSTEP is not defined +#endif +#endif + /************************************************************************/ /* Generate cpucfg.h */ diff --git a/nsprpub/pr/include/md/Makefile b/nsprpub/pr/include/md/Makefile index a365ef91d1f3..d25635445c92 100644 --- a/nsprpub/pr/include/md/Makefile +++ b/nsprpub/pr/include/md/Makefile @@ -99,6 +99,10 @@ ifeq ($(OS_ARCH),Rhapsody) MDCPUCFG_H = _rhapsody.cfg endif +ifeq ($(OS_ARCH),NEXTSTEP) +MDCPUCFG_H = _nextstep.cfg +endif + ifeq ($(OS_ARCH),NEWS-OS) MDCPUCFG_H = _sony.cfg endif diff --git a/nsprpub/pr/include/md/_nextstep.cfg b/nsprpub/pr/include/md/_nextstep.cfg new file mode 100644 index 000000000000..2525eb76a2e8 --- /dev/null +++ b/nsprpub/pr/include/md/_nextstep.cfg @@ -0,0 +1,236 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nspr_cpucfg___ +#define nspr_cpucfg___ + +#ifndef XP_UNIX +#define XP_UNIX +#endif + +#ifndef NEXTSTEP +#define NEXTSTEP +#endif + +/* Platform specific +*/ +#if defined(__sparc__) + +/* Check these +*/ +#undef IS_LITTLE_ENDIAN +#define IS_BIG_ENDIAN 1 +#define HAVE_LONG_LONG +#undef HAVE_ALIGNED_DOUBLES +#define HAVE_ALIGNED_LONGLONGS 1 + +#define PR_BYTES_PER_BYTE 1 +#define PR_BYTES_PER_SHORT 2 +#define PR_BYTES_PER_INT 4 +#define PR_BYTES_PER_INT64 8 +#define PR_BYTES_PER_LONG 4 +#define PR_BYTES_PER_FLOAT 4 +#define PR_BYTES_PER_DOUBLE 8 +/* Taken from _solaris.cfg +*/ +#define PR_BYTES_PER_WORD 4 +#define PR_BYTES_PER_DWORD 8 +#define PR_BYTES_PER_WORD_LOG2 2 +#define PR_BYTES_PER_DWORD_LOG2 3 + +#define PR_BITS_PER_BYTE 8 +#define PR_BITS_PER_SHORT 16 +#define PR_BITS_PER_INT 32 +#define PR_BITS_PER_INT64 64 +#define PR_BITS_PER_LONG 32 +#define PR_BITS_PER_FLOAT 32 +#define PR_BITS_PER_DOUBLE 64 +/* Taken from _solaris.cfg +*/ +#define PR_BITS_PER_WORD 32 + +#define PR_BITS_PER_BYTE_LOG2 3 +#define PR_BITS_PER_SHORT_LOG2 4 +#define PR_BITS_PER_INT_LOG2 5 +#define PR_BITS_PER_INT64_LOG2 6 +#define PR_BITS_PER_LONG_LOG2 5 +#define PR_BITS_PER_FLOAT_LOG2 5 +#define PR_BITS_PER_DOUBLE_LOG2 6 +/* Taken from _solaris.cfg +*/ +#define PR_BITS_PER_WORD_LOG2 5 + +#define PR_ALIGN_OF_SHORT 2 +#define PR_ALIGN_OF_INT 4 +#define PR_ALIGN_OF_LONG 4 +#define PR_ALIGN_OF_INT64 8 +#define PR_ALIGN_OF_FLOAT 4 +#define PR_ALIGN_OF_DOUBLE 8 +#define PR_ALIGN_OF_POINTER 4 + +#define PR_WORDS_PER_DWORD_LOG2 1 + +#elif defined(__m68k__) + +/* Check these +*/ +#undef IS_LITTLE_ENDIAN +#define IS_BIG_ENDIAN 1 +#define HAVE_LONG_LONG +#undef HAVE_ALIGNED_DOUBLES +#define HAVE_ALIGNED_LONGLONGS 1 + +#define PR_BYTES_PER_BYTE 1 +#define PR_BYTES_PER_SHORT 2 +#define PR_BYTES_PER_INT 4 +#define PR_BYTES_PER_INT64 8 +#define PR_BYTES_PER_LONG 4 +#define PR_BYTES_PER_FLOAT 4 +#define PR_BYTES_PER_DOUBLE 8 +#define PR_BYTES_PER_WORD 4 +#define PR_BYTES_PER_DWORD 8 +#define PR_BYTES_PER_WORD_LOG2 2 +#define PR_BYTES_PER_DWORD_LOG2 3 + +#define PR_BITS_PER_BYTE 8 +#define PR_BITS_PER_SHORT 16 +#define PR_BITS_PER_INT 32 +#define PR_BITS_PER_INT64 64 +#define PR_BITS_PER_LONG 32 +#define PR_BITS_PER_FLOAT 32 +#define PR_BITS_PER_DOUBLE 64 +#define PR_BITS_PER_WORD 32 + +#define PR_BITS_PER_BYTE_LOG2 3 +#define PR_BITS_PER_SHORT_LOG2 4 +#define PR_BITS_PER_INT_LOG2 5 +#define PR_BITS_PER_INT64_LOG2 6 +#define PR_BITS_PER_LONG_LOG2 5 +#define PR_BITS_PER_FLOAT_LOG2 5 +#define PR_BITS_PER_DOUBLE_LOG2 6 +#define PR_BITS_PER_WORD_LOG2 5 + +#define PR_ALIGN_OF_SHORT 2 +#define PR_ALIGN_OF_INT 2 +#define PR_ALIGN_OF_LONG 2 +#define PR_ALIGN_OF_INT64 2 +#define PR_ALIGN_OF_FLOAT 2 +#define PR_ALIGN_OF_DOUBLE 2 +#define PR_ALIGN_OF_POINTER 2 + +#define PR_WORDS_PER_DWORD_LOG2 1 + +#elif defined(__i386__) + +/* Check these +*/ +#define IS_LITTLE_ENDIAN 1 +#undef IS_BIG_ENDIAN +#define HAVE_LONG_LONG +#undef HAVE_ALIGNED_DOUBLES +#define HAVE_ALIGNED_LONGLONGS 1 + +#define PR_BYTES_PER_BYTE 1 +#define PR_BYTES_PER_SHORT 2 +#define PR_BYTES_PER_INT 4 +#define PR_BYTES_PER_INT64 8 +#define PR_BYTES_PER_LONG 4 +#define PR_BYTES_PER_FLOAT 4 +#define PR_BYTES_PER_DOUBLE 8 +#define PR_BYTES_PER_WORD 4 +#define PR_BYTES_PER_DWORD 8 + +#define PR_BITS_PER_BYTE 8 +#define PR_BITS_PER_SHORT 16 +#define PR_BITS_PER_INT 32 +#define PR_BITS_PER_INT64 64 +#define PR_BITS_PER_LONG 32 +#define PR_BITS_PER_FLOAT 32 +#define PR_BITS_PER_DOUBLE 64 +#define PR_BITS_PER_WORD 32 + +#define PR_BITS_PER_BYTE_LOG2 3 +#define PR_BITS_PER_SHORT_LOG2 4 +#define PR_BITS_PER_INT_LOG2 5 +#define PR_BITS_PER_INT64_LOG2 6 +#define PR_BITS_PER_LONG_LOG2 5 +#define PR_BITS_PER_FLOAT_LOG2 5 +#define PR_BITS_PER_DOUBLE_LOG2 6 +#define PR_BITS_PER_WORD_LOG2 5 + +#define PR_ALIGN_OF_SHORT 2 +#define PR_ALIGN_OF_INT 4 +#define PR_ALIGN_OF_LONG 4 +#define PR_ALIGN_OF_INT64 4 +#define PR_ALIGN_OF_FLOAT 4 +#define PR_ALIGN_OF_DOUBLE 4 +#define PR_ALIGN_OF_POINTER 4 +#define PR_ALIGN_OF_WORD 4 + +#define PR_BYTES_PER_WORD_LOG2 2 +#define PR_BYTES_PER_DWORD_LOG2 3 +#define PR_WORDS_PER_DWORD_LOG2 1 +#endif /* defined(__somearch__) */ + + +#ifndef NO_NSPR_10_SUPPORT + +#define BYTES_PER_BYTE PR_BYTES_PER_BYTE +#define BYTES_PER_SHORT PR_BYTES_PER_SHORT +#define BYTES_PER_INT PR_BYTES_PER_INT +#define BYTES_PER_INT64 PR_BYTES_PER_INT64 +#define BYTES_PER_LONG PR_BYTES_PER_LONG +#define BYTES_PER_FLOAT PR_BYTES_PER_FLOAT +#define BYTES_PER_DOUBLE PR_BYTES_PER_DOUBLE +#define BYTES_PER_WORD PR_BYTES_PER_WORD +#define BYTES_PER_DWORD PR_BYTES_PER_DWORD + +#define BITS_PER_BYTE PR_BITS_PER_BYTE +#define BITS_PER_SHORT PR_BITS_PER_SHORT +#define BITS_PER_INT PR_BITS_PER_INT +#define BITS_PER_INT64 PR_BITS_PER_INT64 +#define BITS_PER_LONG PR_BITS_PER_LONG +#define BITS_PER_FLOAT PR_BITS_PER_FLOAT +#define BITS_PER_DOUBLE PR_BITS_PER_DOUBLE +#define BITS_PER_WORD PR_BITS_PER_WORD + +#define BITS_PER_BYTE_LOG2 PR_BITS_PER_BYTE_LOG2 +#define BITS_PER_SHORT_LOG2 PR_BITS_PER_SHORT_LOG2 +#define BITS_PER_INT_LOG2 PR_BITS_PER_INT_LOG2 +#define BITS_PER_INT64_LOG2 PR_BITS_PER_INT64_LOG2 +#define BITS_PER_LONG_LOG2 PR_BITS_PER_LONG_LOG2 +#define BITS_PER_FLOAT_LOG2 PR_BITS_PER_FLOAT_LOG2 +#define BITS_PER_DOUBLE_LOG2 PR_BITS_PER_DOUBLE_LOG2 +#define BITS_PER_WORD_LOG2 PR_BITS_PER_WORD_LOG2 + +#define ALIGN_OF_SHORT PR_ALIGN_OF_SHORT +#define ALIGN_OF_INT PR_ALIGN_OF_INT +#define ALIGN_OF_LONG PR_ALIGN_OF_LONG +#define ALIGN_OF_INT64 PR_ALIGN_OF_INT64 +#define ALIGN_OF_FLOAT PR_ALIGN_OF_FLOAT +#define ALIGN_OF_DOUBLE PR_ALIGN_OF_DOUBLE +#define ALIGN_OF_POINTER PR_ALIGN_OF_POINTER +#define ALIGN_OF_WORD PR_ALIGN_OF_WORD + +#define BYTES_PER_WORD_LOG2 PR_BYTES_PER_WORD_LOG2 +#define BYTES_PER_DWORD_LOG2 PR_BYTES_PER_DWORD_LOG2 +#define WORDS_PER_DWORD_LOG2 PR_WORDS_PER_DWORD_LOG2 + +#endif /* NO_NSPR_10_SUPPORT */ + +#endif /* nspr_cpucfg___ */ diff --git a/nsprpub/pr/include/md/_nextstep.h b/nsprpub/pr/include/md/_nextstep.h new file mode 100644 index 000000000000..97c0ca9acb8f --- /dev/null +++ b/nsprpub/pr/include/md/_nextstep.h @@ -0,0 +1,284 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nspr_nextstep_defs_h___ +#define nspr_nextstep_defs_h___ + +#include "prthread.h" + +#include +#include + +/* syscall() is not declared in NEXTSTEP's syscall.h ... +*/ +extern int syscall(int number, ...); + +/* + * Internal configuration macros + */ + +#define PR_LINKER_ARCH "nextstep" +#define _PR_SI_SYSNAME "NEXTSTEP" +#if defined(__sparc__) +#define _PR_SI_ARCHITECTURE "sparc" +#elif defined(__m68k__) +#define _PR_SI_ARCHITECTURE "m68k" +#elif defined(__i386__) +#define _PR_SI_ARCHITECTURE "x86" +#else +error Unknown NEXTSTEP architecture +#endif +#define PR_DLL_SUFFIX ".so" + +#define _PR_VMBASE 0x30000000 +#define _PR_STACK_VMBASE 0x50000000 +#define _MD_DEFAULT_STACK_SIZE 65536L +#define _MD_MMAP_FLAGS MAP_PRIVATE + +#undef HAVE_STACK_GROWING_UP + +#define HAVE_WEAK_MALLOC_SYMBOLS + +/* do this until I figure out the rhapsody dll stuff. */ +#define HAVE_DLL +#define USE_RLD +#define _PR_HAVE_SOCKADDR_LEN +#define _PR_STAT_HAS_ONLY_ST_ATIME +#define _PR_NO_LARGE_FILES + +#define USE_SETJMP + +#ifndef _PR_PTHREADS + +#include + +#define PR_CONTEXT_TYPE jmp_buf + +#define CONTEXT(_th) ((_th)->md.context) + +/* balazs.pataki@sztaki.hu: +** __sparc__ is checked +** __m68k__ is checked +** __i386__ is a guess (one of the two defines should work) +*/ +#if defined(__sparc__) +#define _MD_GET_SP(_th) (_th)->md.context[2] +#elif defined(__m68k__) +#define _MD_GET_SP(_th) (_th)->md.context[2] +#elif defined(__i386__) +/* One of this two must be OK ... try using sc_onstack +*/ +#define _MD_GET_SP(_th) (((struct sigcontext *) (_th)->md.context)->sc_onstack) +//#define _MD_GET_SP(_th) (_th)->md.context[0].sc_esp +#else +error Unknown NEXTSTEP architecture +#endif + +#define PR_NUM_GCREGS _JBLEN + +/* +** Initialize a thread context to run "_main()" when started +*/ +#define _MD_INIT_CONTEXT(_thread, _sp, _main, status) \ +{ \ + *status = PR_TRUE; \ + if (setjmp(CONTEXT(_thread))) { \ + _main(); \ + } \ + _MD_GET_SP(_thread) = (int) ((_sp) - 64); \ +} + +#define _MD_SWITCH_CONTEXT(_thread) \ + if (!setjmp(CONTEXT(_thread))) { \ + (_thread)->md.errcode = errno; \ + _PR_Schedule(); \ + } + +/* +** Restore a thread context, saved by _MD_SWITCH_CONTEXT +*/ +#define _MD_RESTORE_CONTEXT(_thread) \ +{ \ + errno = (_thread)->md.errcode; \ + _MD_SET_CURRENT_THREAD(_thread); \ + longjmp(CONTEXT(_thread), 1); \ +} + +/* Machine-dependent (MD) data structures */ + +struct _MDThread { + PR_CONTEXT_TYPE context; + int id; + int errcode; +}; + +struct _MDThreadStack { + PRInt8 notused; +}; + +struct _MDLock { + PRInt8 notused; +}; + +struct _MDSemaphore { + PRInt8 notused; +}; + +struct _MDCVar { + PRInt8 notused; +}; + +struct _MDSegment { + PRInt8 notused; +}; + +/* + * md-specific cpu structure field + */ +#define _PR_MD_MAX_OSFD FD_SETSIZE + +struct _MDCPU_Unix { + PRCList ioQ; + PRUint32 ioq_timeout; + PRInt32 ioq_max_osfd; + PRInt32 ioq_osfd_cnt; +#ifndef _PR_USE_POLL + fd_set fd_read_set, fd_write_set, fd_exception_set; + PRInt16 fd_read_cnt[_PR_MD_MAX_OSFD],fd_write_cnt[_PR_MD_MAX_OSFD], + fd_exception_cnt[_PR_MD_MAX_OSFD]; +#else + struct pollfd *ioq_pollfds; + int ioq_pollfds_size; +#endif /* _PR_USE_POLL */ +}; + +#define _PR_IOQ(_cpu) ((_cpu)->md.md_unix.ioQ) +#define _PR_ADD_TO_IOQ(_pq, _cpu) PR_APPEND_LINK(&_pq.links, &_PR_IOQ(_cpu)) +#define _PR_FD_READ_SET(_cpu) ((_cpu)->md.md_unix.fd_read_set) +#define _PR_FD_READ_CNT(_cpu) ((_cpu)->md.md_unix.fd_read_cnt) +#define _PR_FD_WRITE_SET(_cpu) ((_cpu)->md.md_unix.fd_write_set) +#define _PR_FD_WRITE_CNT(_cpu) ((_cpu)->md.md_unix.fd_write_cnt) +#define _PR_FD_EXCEPTION_SET(_cpu) ((_cpu)->md.md_unix.fd_exception_set) +#define _PR_FD_EXCEPTION_CNT(_cpu) ((_cpu)->md.md_unix.fd_exception_cnt) +#define _PR_IOQ_TIMEOUT(_cpu) ((_cpu)->md.md_unix.ioq_timeout) +#define _PR_IOQ_MAX_OSFD(_cpu) ((_cpu)->md.md_unix.ioq_max_osfd) +#define _PR_IOQ_OSFD_CNT(_cpu) ((_cpu)->md.md_unix.ioq_osfd_cnt) +#define _PR_IOQ_POLLFDS(_cpu) ((_cpu)->md.md_unix.ioq_pollfds) +#define _PR_IOQ_POLLFDS_SIZE(_cpu) ((_cpu)->md.md_unix.ioq_pollfds_size) + +#define _PR_IOQ_MIN_POLLFDS_SIZE(_cpu) 32 + +struct _MDCPU { + struct _MDCPU_Unix md_unix; +}; + +#define _MD_INIT_LOCKS() +#define _MD_NEW_LOCK(lock) PR_SUCCESS +#define _MD_FREE_LOCK(lock) +#define _MD_LOCK(lock) +#define _MD_UNLOCK(lock) +#define _MD_INIT_IO() +#define _MD_IOQ_LOCK() +#define _MD_IOQ_UNLOCK() + +extern PRStatus _MD_InitializeThread(PRThread *thread); + +#define _MD_INIT_RUNNING_CPU(cpu) _MD_unix_init_running_cpu(cpu) +#define _MD_INIT_THREAD _MD_InitializeThread +#define _MD_EXIT_THREAD(thread) +#define _MD_SUSPEND_THREAD(thread) _MD_suspend_thread +#define _MD_RESUME_THREAD(thread) _MD_resume_thread +#define _MD_CLEAN_THREAD(_thread) + +extern PRStatus _MD_CREATE_THREAD( + PRThread *thread, + void (*start) (void *), + PRThreadPriority priority, + PRThreadScope scope, + PRThreadState state, + PRUint32 stackSize); +extern void _MD_SET_PRIORITY(struct _MDThread *thread, PRUintn newPri); +extern PRStatus _MD_WAIT(PRThread *, PRIntervalTime timeout); +extern PRStatus _MD_WAKEUP_WAITER(PRThread *); +extern void _MD_YIELD(void); + +#endif /* ! _PR_PTHREADS */ + +extern void _MD_EarlyInit(void); +extern PRIntervalTime _PR_UNIX_GetInterval(void); +extern PRIntervalTime _PR_UNIX_TicksPerSecond(void); + +#define _MD_EARLY_INIT _MD_EarlyInit +#define _MD_FINAL_INIT _PR_UnixInit +#define _MD_GET_INTERVAL _PR_UNIX_GetInterval +#define _MD_INTERVAL_PER_SEC _PR_UNIX_TicksPerSecond + +/* + * We wrapped the select() call. _MD_SELECT refers to the built-in, + * unwrapped version. + */ +#define _MD_SELECT(nfds,r,w,e,tv) syscall(SYS_select,nfds,r,w,e,tv) + +/* For writev() */ +#include + +/* signal.h */ +/* balazs.pataki@sztaki.hu: this is stolen from sunos4.h. The things is that +** NEXTSTEP doesn't support these flags for `struct sigaction's sa_flags, so +** I have to fake them ... +*/ +#define SA_RESTART 0 + +/* mmap */ +/* balazs.pataki@sztaki.hu: NEXTSTEP doesn't have mmap, at least not +** publically. We have sys/mman.h, but it doesn't declare mmap(), and +** PROT_NONE is also missing. syscall.h has entries for mmap, munmap, and +** mprotect so I wrap these in nextstep.c as mmap(), munmap() and mprotect() +** and pray for it to work. +** +*/ +#define PROT_NONE 0x0 + +caddr_t mmap(caddr_t addr, size_t len, int prot, int flags, + int fildes, off_t off); +int munmap(caddr_t addr, size_t len); +int mprotect(caddr_t addr, size_t len, int prot); + +/* my_mmap() is implemented in nextstep.c and is based on map_fd() of mach. +*/ +caddr_t my_mmap(caddr_t addr, size_t len, int prot, int flags, + int fildes, off_t off); +int my_munmap(caddr_t addr, size_t len); + + +/* string.h +*/ +/* balazs.pataki@sztaki.hu: this is missing so implemenetd in nextstep.c ... +*/ +char *strdup(const char *s1); + +/* unistd.h +*/ +/* balazs.pataki@sztaki.hu: these functions are hidden, though correctly +** implemented in NEXTSTEP. Here I give the declaration for them to be used +** by prmalloc.c, and I have a wrapped syscall() version of them in nextstep.c +*/ +int brk(void *endds); +void *sbrk(int incr); + +#endif /* nspr_nextstep_defs_h___ */ diff --git a/nsprpub/pr/include/md/_unixos.h b/nsprpub/pr/include/md/_unixos.h index 5d3f523dcfbe..ab507d860039 100644 --- a/nsprpub/pr/include/md/_unixos.h +++ b/nsprpub/pr/include/md/_unixos.h @@ -27,7 +27,7 @@ * Linux: FD_SETSIZE is defined in /usr/include/sys/select.h and should * not be redefined. */ -#if !defined(LINUX) && !defined(RHAPSODY) +#if !defined(LINUX) && !defined(RHAPSODY) && !defined(NEXTSTEP) #ifndef FD_SETSIZE #define FD_SETSIZE 4096 #endif @@ -144,7 +144,7 @@ extern void _MD_unix_init_running_cpu(struct _PRCPU *cpu); ** work - it just means that we don't really have a functional ** redzone. */ -#if defined(DEBUG) && !defined(RHAPSODY) +#if defined(DEBUG) && !defined(RHAPSODY) && !defined(NEXTSTEP) #if !defined(SOLARIS) #include /* for memset() */ #define _MD_INIT_STACK(ts,REDZONE) \ diff --git a/nsprpub/pr/include/md/prosdep.h b/nsprpub/pr/include/md/prosdep.h index 980025585723..b0150007dd44 100644 --- a/nsprpub/pr/include/md/prosdep.h +++ b/nsprpub/pr/include/md/prosdep.h @@ -80,6 +80,9 @@ PR_BEGIN_EXTERN_C #elif defined(RHAPSODY) #include "md/_rhapsody.h" +#elif defined(NEXTSTEP) +#include "md/_nextstep.h" + #elif defined(SOLARIS) #include "md/_solaris.h" diff --git a/nsprpub/pr/include/private/primpl.h b/nsprpub/pr/include/private/primpl.h index f4c32230f5dd..200b8fc386cc 100644 --- a/nsprpub/pr/include/private/primpl.h +++ b/nsprpub/pr/include/private/primpl.h @@ -1536,6 +1536,7 @@ extern PRBool _pr_ipv6_enabled; /* defined in prnetdb.c */ && !defined(_PR_PTHREADS) && !defined(_PR_GLOBAL_THREADS_ONLY) \ && !defined(PURIFY) \ && !defined(RHAPSODY) \ + && !defined(NEXTSTEP) \ && !(defined (UNIXWARE) && defined (USE_SVR4_THREADS)) #define _PR_OVERRIDE_MALLOC #endif diff --git a/nsprpub/pr/src/io/prfile.c b/nsprpub/pr/src/io/prfile.c index ece72b0af5c3..ffe6479af81e 100644 --- a/nsprpub/pr/src/io/prfile.c +++ b/nsprpub/pr/src/io/prfile.c @@ -265,7 +265,7 @@ PR_IMPLEMENT(PRFileDesc*) PR_Open(const char *name, PRIntn flags, PRIntn mode) PRInt32 PR_GetSysfdTableMax(void) { -#if defined(XP_UNIX) && !defined(AIX) +#if defined(XP_UNIX) && !defined(AIX) && !defined(NEXTSTEP) struct rlimit rlim; if ( getrlimit(RLIMIT_NOFILE, &rlim) < 0) { @@ -274,7 +274,7 @@ PRInt32 PR_GetSysfdTableMax(void) } return rlim.rlim_max; -#elif defined(AIX) +#elif defined(AIX) || defined(NEXTSTEP) return sysconf(_SC_OPEN_MAX); #elif defined(WIN32) || defined(OS2) /* @@ -294,7 +294,7 @@ PRInt32 PR_GetSysfdTableMax(void) PRInt32 PR_SetSysfdTableSize(int table_size) { -#if defined(XP_UNIX) && !defined(AIX) +#if defined(XP_UNIX) && !defined(AIX) && !defined(NEXTSTEP) struct rlimit rlim; PRInt32 tableMax = PR_GetSysfdTableMax(); @@ -318,7 +318,8 @@ PRInt32 PR_SetSysfdTableSize(int table_size) } return rlim.rlim_cur; -#elif defined(AIX) || defined(WIN32) || defined(WIN16) || defined(OS2) +#elif defined(AIX) || defined(WIN32) || defined(WIN16) || defined(OS2) \ + || defined(NEXTSTEP) PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); return -1; #elif defined (XP_MAC) diff --git a/nsprpub/pr/src/io/prmapopt.c b/nsprpub/pr/src/io/prmapopt.c index 6bd4dddc1a77..88496d825807 100644 --- a/nsprpub/pr/src/io/prmapopt.c +++ b/nsprpub/pr/src/io/prmapopt.c @@ -36,6 +36,11 @@ #include "primpl.h" +#if defined(NEXTSTEP) +/* NEXTSTEP is special: this must come before netinet/tcp.h. */ +#include /* n_short, n_long, n_time */ +#endif + #if defined(XP_UNIX) || defined(OS2) #include /* TCP_NODELAY, TCP_MAXSEG */ #endif diff --git a/nsprpub/pr/src/linking/prlink.c b/nsprpub/pr/src/linking/prlink.c index ff06b33d840a..7516ef0e9564 100644 --- a/nsprpub/pr/src/linking/prlink.c +++ b/nsprpub/pr/src/linking/prlink.c @@ -32,7 +32,7 @@ #include #elif defined(USE_HPSHL) #include -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) #include #endif @@ -45,7 +45,7 @@ /* * On these platforms, symbols have a leading '_'. */ -#if defined(SUNOS4) || defined(RHAPSODY) || defined(WIN16) +#if defined(SUNOS4) || defined(RHAPSODY) || defined(NEXTSTEP) || defined(WIN16) #define NEED_LEADING_UNDERSCORE #endif @@ -71,7 +71,7 @@ struct PRLibrary { #ifdef XP_UNIX #if defined(USE_HPSHL) shl_t dlh; -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) NSModule dlh; #else void* dlh; @@ -170,7 +170,7 @@ void _PR_InitLinker(void) #elif defined(USE_HPSHL) h = NULL; /* don't abort with this NULL */ -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) h = NULL; /* XXXX toshok */ #else #error no dll strategy @@ -641,7 +641,7 @@ PR_LoadLibrary(const char *name) void *h = dlopen(name, RTLD_LAZY); #elif defined(USE_HPSHL) shl_t h = shl_load(name, BIND_DEFERRED | DYNAMIC_PATH, 0L); -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) NSObjectFileImage ofi; NSModule h = NULL; if (NSCreateObjectFileImageFromFile(name, &ofi) @@ -714,7 +714,7 @@ PR_UnloadLibrary(PRLibrary *lib) result = dlclose(lib->dlh); #elif defined(USE_HPSHL) result = shl_unload(lib->dlh); -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) result = NSUnLinkModule(lib->dlh, FALSE); #else #error Configuration error @@ -827,7 +827,7 @@ pr_FindSymbolInLib(PRLibrary *lm, const char *name) if (shl_findsym(&lm->dlh, name, TYPE_PROCEDURE, &f) == -1) { f = NULL; } -#elif defined(RHAPSODY) +#elif defined(RHAPSODY) || defined(NEXTSTEP) f = NSAddressOfSymbol(NSLookupAndBindSymbol(name)); #endif #endif /* HAVE_DLL */ diff --git a/nsprpub/pr/src/md/prosdep.c b/nsprpub/pr/src/md/prosdep.c index 326b3536bd6d..3d288b071495 100644 --- a/nsprpub/pr/src/md/prosdep.c +++ b/nsprpub/pr/src/md/prosdep.c @@ -42,7 +42,8 @@ static void GetPageSize(void) /* Get page size */ #ifdef XP_UNIX #if defined SUNOS4 || defined LINUX || defined BSDI || defined AIX \ - || defined FREEBSD || defined NETBSD || defined OPENBSD || defined RHAPSODY + || defined FREEBSD || defined NETBSD || defined OPENBSD \ + || defined RHAPSODY || defined NEXTSTEP _pr_pageSize = getpagesize(); #elif defined(HPUX) /* I have no idea. Don't get me started. --Rob */ diff --git a/nsprpub/pr/src/md/unix/Makefile b/nsprpub/pr/src/md/unix/Makefile index 7d36371ce47d..3d9e41df8728 100644 --- a/nsprpub/pr/src/md/unix/Makefile +++ b/nsprpub/pr/src/md/unix/Makefile @@ -94,6 +94,10 @@ RHAPSODY_CSRCS = \ rhapsody.c \ $(NULL) +NEXTSTEP_CSRCS = \ + nextstep.c \ + $(NULL) + NEC_CSRCS = \ nec.c \ $(NULL) @@ -163,6 +167,9 @@ endif ifeq ($(OS_ARCH),Rhapsody) CSRCS += $(RHAPSODY_CSRCS) endif +ifeq ($(OS_ARCH),NEXTSTEP) +CSRCS += $(NEXTSTEP_CSRCS) +endif ifeq ($(OS_ARCH),NEC) CSRCS += $(NEC_CSRCS) endif diff --git a/nsprpub/pr/src/md/unix/nextstep.c b/nsprpub/pr/src/md/unix/nextstep.c new file mode 100644 index 000000000000..4bdc00a30c1e --- /dev/null +++ b/nsprpub/pr/src/md/unix/nextstep.c @@ -0,0 +1,265 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "primpl.h" + +#import +#import +#import +#include +#include +#include +#include +#include + + + +/* These functions are hidden in NEXTSTEP, but beacuse they have syscall() +** entries I can wrap these into their corresponding missing function. +*/ +caddr_t +mmap(caddr_t addr, size_t len, int prot, int flags, + int fildes, off_t off) +{ + return (caddr_t) syscall (SYS_mmap, addr, len, prot, flags, fildes, off); +} + +int +munmap(caddr_t addr, size_t len) +{ + return syscall (SYS_munmap, addr, len); +} + +int +mprotect(caddr_t addr, size_t len, int prot) +{ + return syscall (SYS_mprotect, addr, len, prot); +} + + +/* If found the brk() symbol in the sahred libraries but no syscall() entry ... +** I don't know whether it will work ... +int brk(void *endds) +{ + return syscall (); +} +*/ + +void *sbrk(int incr) +{ + return (void *) syscall (SYS_sbrk, incr); +} + +/* These are my mach based versions, untested and probably bad ... +*/ +caddr_t my_mmap(caddr_t addr, size_t len, int prot, int flags, + int fildes, off_t off) +{ + kern_return_t ret_val; + + /* First map ... + */ + ret_val = map_fd ( fildes, /* fd */ + (vm_offset_t) off, /* offset */ + (vm_offset_t*)&addr, /* address */ + TRUE, /* find_space */ + (vm_size_t) len); /* size */ + + if (ret_val != KERN_SUCCESS) { + mach_error("Error calling map_fd() in mmap", ret_val ); + return (caddr_t)0; + } + + /* ... then protect (this is probably bad) + */ + ret_val = vm_protect( task_self(), /* target_task */ + (vm_address_t)addr, /* address */ + (vm_size_t) len, /* size */ + FALSE, /* set_maximum */ + (vm_prot_t) prot); /* new_protection */ + if (ret_val != KERN_SUCCESS) { + mach_error("vm_protect in mmap()", ret_val ); + return (caddr_t)0; + } + + return addr; +} + +int my_munmap(caddr_t addr, size_t len) +{ + kern_return_t ret_val; + + ret_val = vm_deallocate(task_self(), + (vm_address_t) addr, + (vm_size_t) len); + + if (ret_val != KERN_SUCCESS) { + mach_error("vm_deallocate in munmap()", ret_val); + return -1; + } + + return 0; +} + +int my_mprotect(caddr_t addr, size_t len, int prot) +{ + vm_prot_t mach_prot; + kern_return_t ret_val; + + switch (prot) { + case PROT_READ: mach_prot = VM_PROT_READ; break; + case PROT_WRITE: mach_prot = VM_PROT_WRITE; break; + case PROT_EXEC: mach_prot = VM_PROT_EXECUTE; break; + case PROT_NONE: mach_prot = VM_PROT_NONE; break; + } + + ret_val = vm_protect(task_self(), /* target_task */ + (vm_address_t)addr, /* address */ + (vm_size_t) len, /* size */ + FALSE, /* set_maximum */ + (vm_prot_t) prot); /* new_protection */ + + if (ret_val != KERN_SUCCESS) { + mach_error("vm_protect in mprotect()", ret_val); + return -1; + } + + return 0; +} + +char *strdup(const char *s1) +{ + int len = strlen (s1); + char *copy = (char*) malloc (len+1); + + if (copy == (char*)0) + return (char*)0; + + strcpy (copy, s1); + + return copy; +} + +/* Stub rld functions +*/ +extern NSObjectFileImageReturnCode NSCreateObjectFileImageFromFile( + const char *pathName, + NSObjectFileImage *objectFileImage) +{ + return NSObjectFileImageFailure; +} + +extern void * NSAddressOfSymbol( + NSSymbol symbol) +{ + return NULL; +} + +extern NSModule NSLinkModule( + NSObjectFileImage objectFileImage, + const char *moduleName, /* can be NULL */ + enum bool bindNow) +{ + return NULL; +} + +extern NSSymbol NSLookupAndBindSymbol( + const char *symbolName) +{ + return NULL; +} + +extern enum bool NSUnLinkModule( + NSModule module, + enum bool keepMemoryMapped) +{ + return 0; +} + + + +void _MD_EarlyInit(void) +{ +} + +PRWord *_MD_HomeGCRegisters(PRThread *t, int isCurrent, int *np) +{ +#ifndef _PR_PTHREADS + if (isCurrent) { + (void) sigsetjmp(CONTEXT(t), 1); + } + *np = sizeof(CONTEXT(t)) / sizeof(PRWord); + return (PRWord *) CONTEXT(t); +#else + *np = 0; + return NULL; +#endif +} + +#ifndef _PR_PTHREADS + +void +_MD_SET_PRIORITY(_MDThread *thread, PRUintn newPri) +{ + return; +} + +PRStatus +_MD_InitializeThread(PRThread *thread) +{ + return PR_SUCCESS; +} + +PRStatus +_MD_WAIT(PRThread *thread, PRIntervalTime ticks) +{ + PR_ASSERT(!(thread->flags & _PR_GLOBAL_SCOPE)); + _PR_MD_SWITCH_CONTEXT(thread); + return PR_SUCCESS; +} + +PRStatus +_MD_WAKEUP_WAITER(PRThread *thread) +{ + if (thread) { + PR_ASSERT(!(thread->flags & _PR_GLOBAL_SCOPE)); + } + return PR_SUCCESS; +} + +/* These functions should not be called for NEXTSTEP */ +void +_MD_YIELD(void) +{ + PR_NOT_REACHED("_MD_YIELD should not be called for NEXTSTEP."); +} + +PRStatus +_MD_CREATE_THREAD( + PRThread *thread, + void (*start) (void *), + PRThreadPriority priority, + PRThreadScope scope, + PRThreadState state, + PRUint32 stackSize) +{ + PR_NOT_REACHED("_MD_CREATE_THREAD should not be called for NEXTSTEP."); + return PR_FAILURE; +} + +#endif diff --git a/nsprpub/pr/src/md/unix/objs.mk b/nsprpub/pr/src/md/unix/objs.mk index 1d3213245a3e..311926a98997 100644 --- a/nsprpub/pr/src/md/unix/objs.mk +++ b/nsprpub/pr/src/md/unix/objs.mk @@ -86,6 +86,10 @@ RHAPSODY_CSRCS = \ rhapsody.c \ $(NULL) +NEXTSTEP_CSRCS = \ + nextstep.c \ + $(NULL) + NEC_CSRCS = \ nec.c \ $(NULL) @@ -156,6 +160,9 @@ endif ifeq ($(OS_ARCH),Rhapsody) CSRCS += $(RHAPSODY_CSRCS) endif +ifeq ($(OS_ARCH),NEXTSTEP) +CSRCS += $(NEXTSTEP_CSRCS) +endif ifeq ($(OS_ARCH),NEC) CSRCS += $(NEC_CSRCS) endif diff --git a/nsprpub/pr/src/md/unix/unix.c b/nsprpub/pr/src/md/unix/unix.c index 62de2cabf954..62096a6de586 100644 --- a/nsprpub/pr/src/md/unix/unix.c +++ b/nsprpub/pr/src/md/unix/unix.c @@ -46,7 +46,8 @@ #if defined(IRIX) || defined(HPUX) || defined(OSF1) || defined(SOLARIS) \ || defined(AIX4_1) || defined(LINUX) || defined(SONY) \ || defined(BSDI) || defined(SCO) || defined(NEC) || defined(SNI) \ - || defined(SUNOS4) || defined(NCR) || defined(RHAPSODY) + || defined(SUNOS4) || defined(NCR) || defined(RHAPSODY) \ + || defined(NEXTSTEP) #define _PRSockLen_t int #elif (defined(AIX) && !defined(AIX4_1)) || defined(FREEBSD) \ || defined(NETBSD) || defined(OPENBSD) || defined(UNIXWARE) || defined(DGUX) diff --git a/nsprpub/pr/src/md/unix/uxwrap.c b/nsprpub/pr/src/md/unix/uxwrap.c index e7a169866295..783b9885fd07 100644 --- a/nsprpub/pr/src/md/unix/uxwrap.c +++ b/nsprpub/pr/src/md/unix/uxwrap.c @@ -83,6 +83,9 @@ void PR_SetXtHackOkayToReleaseXLockFn(int (*fn)(void)) #if defined(HPUX9) int select(size_t width, int *rl, int *wl, int *el, const struct timeval *tv) +#elif defined(NEXTSTEP) +int wrap_select(int width, fd_set *rd, fd_set *wr, fd_set *ex, + const struct timeval *tv) #elif defined(AIX4_1) int wrap_select(unsigned long width, void *rl, void *wl, void *el, struct timeval *tv) diff --git a/nsprpub/pr/src/misc/pratom.c b/nsprpub/pr/src/misc/pratom.c index d69bb6b06e8c..499c74801f44 100644 --- a/nsprpub/pr/src/misc/pratom.c +++ b/nsprpub/pr/src/misc/pratom.c @@ -39,11 +39,11 @@ * The lock contention should be acceptable. */ -static PRLock *monitor = NULL; +static PRLock *lock = NULL; void _PR_MD_INIT_ATOMIC() { - if (monitor == NULL) { - monitor = PR_NewLock(); + if (lock == NULL) { + lock = PR_NewLock(); } } @@ -55,9 +55,9 @@ _PR_MD_ATOMIC_INCREMENT(PRInt32 *val) if (!_pr_initialized) { _PR_ImplicitInitialization(); } - PR_Lock(monitor); + PR_Lock(lock); rv = ++(*val); - PR_Unlock(monitor); + PR_Unlock(lock); return rv; } @@ -69,9 +69,9 @@ _PR_MD_ATOMIC_ADD(PRInt32 *ptr, PRInt32 val) if (!_pr_initialized) { _PR_ImplicitInitialization(); } - PR_Lock(monitor); + PR_Lock(lock); rv = ((*ptr) += val); - PR_Unlock(monitor); + PR_Unlock(lock); return rv; } @@ -83,9 +83,9 @@ _PR_MD_ATOMIC_DECREMENT(PRInt32 *val) if (!_pr_initialized) { _PR_ImplicitInitialization(); } - PR_Lock(monitor); + PR_Lock(lock); rv = --(*val); - PR_Unlock(monitor); + PR_Unlock(lock); return rv; } @@ -97,10 +97,10 @@ _PR_MD_ATOMIC_SET(PRInt32 *val, PRInt32 newval) if (!_pr_initialized) { _PR_ImplicitInitialization(); } - PR_Lock(monitor); + PR_Lock(lock); rv = *val; *val = newval; - PR_Unlock(monitor); + PR_Unlock(lock); return rv; } diff --git a/nsprpub/pr/tests/Makefile b/nsprpub/pr/tests/Makefile index a004d214a61b..b84afe655093 100644 --- a/nsprpub/pr/tests/Makefile +++ b/nsprpub/pr/tests/Makefile @@ -281,6 +281,12 @@ ifeq ($(OS_ARCH), NCR) export LD_RUN_PATH = $(PWD)/$(DIST)/lib 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