Jonas Maebe e246cac3ac * regenerated using latest fpcmake %!s(int64=16) %!d(string=hai) anos
..
demos 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
tests abb6577ccd * changes for new threadvar support %!s(int64=22) %!d(string=hai) anos
Makefile e246cac3ac * regenerated using latest fpcmake %!s(int64=16) %!d(string=hai) anos
Makefile.fpc 1251ec996b - removed $(SYSTEMUNIT)$(PPUEXT) from the macpas unit dependencies %!s(int64=17) %!d(string=hai) anos
README.txt 4bf254bc32 * added .txt extensions to all README, TODO and COPYING files %!s(int64=16) %!d(string=hai) anos
aio.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
aio.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
audnlm32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
calnlm32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
ccs-os.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
ccs.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
classes.pp 3a1b633325 + revive generics based tfplist/tstringlist implementation for generics testing; build with FPC_TESTGENERICS %!s(int64=18) %!d(string=hai) anos
clib.imp 41e0b1a0a7 * added NetWare Alert %!s(int64=20) %!d(string=hai) anos
clibaux.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
clibctx.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
clxnlm32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
convertimp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
crt.pp 78c29a33ba * changed the parameters of gotoxy() and the return values of wherex/wherey %!s(int64=16) %!d(string=hai) anos
dos.pp f4f3ae84d0 * AllowDirectorySeparators and AllowDriveSeparators typed constants %!s(int64=17) %!d(string=hai) anos
dplsv386.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
dsapi.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
dsevent.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
errno.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
initc.pp f7da932aa4 * use ctypes instead of defining own types %!s(int64=18) %!d(string=hai) anos
keyboard.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
lib0.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
locnlm32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
mouse.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
ndpsrpc.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
netnlm32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
netware.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
netwsockh.inc f83568d897 * fix INVALID_SOCKET for other platforms too %!s(int64=18) %!d(string=hai) anos
nit.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
nlmlib.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
npackoff.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
npackon.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
nwcalls.pp d0ae92c6db * currected some cvs conversion probs %!s(int64=20) %!d(string=hai) anos
nwnit.pp d0ae92c6db * currected some cvs conversion probs %!s(int64=20) %!d(string=hai) anos
nwpre.as 50778076c3 initial import %!s(int64=20) %!d(string=hai) anos
nwpre.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
nwprot.pp d0ae92c6db * currected some cvs conversion probs %!s(int64=20) %!d(string=hai) anos
nwpsrv.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
nwpsrv3x.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
nwserv.pp d0ae92c6db * currected some cvs conversion probs %!s(int64=20) %!d(string=hai) anos
nwsnut.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
nwsnut.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
nwsock.inc 1c452dd4f9 + Restore and fix text/file socket functionality. %!s(int64=18) %!d(string=hai) anos
nwsys.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
prelude.as 50778076c3 initial import %!s(int64=20) %!d(string=hai) anos
qos.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
requestr.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
sockets.pp f8e5a62f61 * synchronized with SocketError change %!s(int64=18) %!d(string=hai) anos
socklib.imp 50778076c3 initial import %!s(int64=20) %!d(string=hai) anos
streams.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
sysdir.inc f4f3ae84d0 * AllowDirectorySeparators and AllowDriveSeparators typed constants %!s(int64=17) %!d(string=hai) anos
sysfile.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
sysheap.inc 0c3a2a257d * Convert heap to ptruint. %!s(int64=18) %!d(string=hai) anos
sysos.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
sysosh.inc 4ace790492 * remove $Log %!s(int64=20) %!d(string=hai) anos
system.pp d4d7b695c7 - removed all "islibrary:=false;" assignments from system unit %!s(int64=16) %!d(string=hai) anos
systhrd.inc 7f2a257102 + heap manager now per thread, reduce heap lock contention %!s(int64=18) %!d(string=hai) anos
sysutils.pp e3164530b8 * use __get_errno_ptr to implement GetLastOSError %!s(int64=18) %!d(string=hai) anos
threads.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
tli.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
tthread.inc 33baacbe04 * fixed leaking of TThread %!s(int64=19) %!d(string=hai) anos
unicode.imp 50778076c3 initial import %!s(int64=20) %!d(string=hai) anos
varutils.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
video.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
vollib.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
winsock.pp 790a4fe2d3 * log and id tags removed %!s(int64=20) %!d(string=hai) anos
ws2_32.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos
ws2nlm.imp e925386393 * moved rtl/netware/nwimp/*.imp to rtl/netware %!s(int64=21) %!d(string=hai) anos

README.txt


General
=======

Currently generating NetWare-NLM's only work under Linux and win32. (may work under other
unix versions also but this is not tested yet)


Binutils with netware-support needed
====================================

You need a version of binutils compiled with netware-support. As of FreePascal 1.9.5 Nov 2004
binutils needs to be named i386-netware-* (i.e. i386-netware-ld, i386-netware-nlmconv).
Unfortunately in the Linux distibutions this component of the binutils is not included
so you have to compile it. So download the latest stable binutils package from your
favourite GNU mirror, decompress it ('tar xfz binutils-x.yy.z.tar.gz' on unices
with GNU tar), change to the binutils-x.yy.z directory and configure:

./configure --prefix=/usr --enable-shared --enable-target=i386-netware

I used the prefix /usr because thats the default location on redhat (thats what I'm using)

and use

make
make install

to build and install binutils. To check that netware is supported by the version of binutils
installed, use i386-netware-ld --version. The emulation 'i386nw' must be present. Also check that
i386-netware-nlmconv
is present and can be started without specifying the complete path of i386-netware-nlmconv.

You can find more information and a binary version of binutils with netware-support for
linux on:
http://home.sch.bme.hu/~keresztg/novell/howto/NLM-Linux-HOWTO.html.

Binutils for win32 and Fedora Core 2 are available from:
ftp://ftp.freepascal.org/pub/fpc/contrib/cross


Building the freepascal runtime-library for netware
===================================================

Install the current fpc sources from ftp.freepascal.org and change to the directory
rtl/netware under the freepascal sourcetree. Verify the path of your units in
Makefile. The default is /usr/lib/fpc/1.9.5/units/i386-netware/*.
Compile and install the rtl with

make install

This will install the basic rtl files. To install all (packages,fcl and nlm's) do a

make OS_TARGET=netware build

and

make OS_TARGET=netware install

at the fpc source root dir.


Settings and needed files to compile for netware
================================================

Edit your /etc/fpc.cfg and add the rtl source path for netware. This are my settings,
you may paste it to your fpc.cfg:

#IFDEF Netware_clib
-Fu/usr/lib/fpc/1.9.5/units/i386-netware/*
-Fl/usr/lib/fpc/1.9.5/units/i386-netware/rtl
#ENDIF

#IFDEF Netware_libc
-Fu/usr/lib/fpc/1.9.5/units/i386-netwlibc/*
-Fl/usr/lib/fpc/1.9.5/units/i386-netwlibc/rtl
-XPi386-netware-
#ENDIF

This adds the search path for the rtl-units as well as for the needed import-files.
You can use the import files from the rtl/netware directory, they are automaticly
installed. If you want to use import files from novell, be aware that you have to
convert the files to unix format (i.e. with dos2unix).

Building the first nlm
======================

Ok, now you have installed all needed files, try the following program and compile it
with

ppc386 -Tnetware hello.pas

PROGRAM Hello;
{$Description The FreePascal HelloWorld for Netware}
{$Version 1.0.0}
{$Copyright Copyright (c) 2001 The FreePascal Development Team}
{$Screenname FPC Hello World for Netware}

BEGIN
WriteLn ('This is open source, FreePascal for netware');
END.

Hints on using freepascal for nlm's
===================================

- Compiler Switches for Netware
-----------------------------
The following compiler-swiches are supported for NetWare:
$DESCRIPTION : NLM-Description, will be displayed at load-time
$M : For Stack-Size. Heap-Size will be ignored
$VERSION x.x.x : Sets Major, Minor and Revision, Revision 0 is nothing, 1=a, 2=b ...
$COPYRIGHT : Sets Copyright, needs a patched nlmconv, patch is
available at the location for binutils-win32 shown
above.
$SCREENNAME : Sets the screen-name (i.e. shown in ctrl-esc screen)
$SCREENNAME DEFAULT : output to logger screen
$SCREENNAME NONE : no output at all (do not use this, writeln,
even from a runtime error may crash the sever)
$SCREENNAME MyScreen: Name the screen "MyScreen"
$THREADNAME : Sets the thread name (dont use names that are to long
for netware, that will prevent your nlm from loading)

- Exports
-------

Exports will be handled like in win32:
procedure bla; CDECL; EXPORT;
begin
end;

exports bla name 'bla';

Be aware that without Name 'bla' this will be exported in upper-case.

- Netware import (.imp) files
---------------------------

Import files are needed by nlmconv as with other netware linkers. FreePascal is
searching import files via the specified library path (-Fl). If you plan to use
import files from novell be aware that they have to be converted from CR/LF to
LF only. The script 'convertimp' in rtl/netware/nwimp will do that.
If a module name is specified in an import, the module is automaticly
declared as autoload by FreePascal.

I.e. the following declaration needs nlmlib.imp and sets nlmlib.nlm as autoload:

FUNCTION rmdir (path : PCHAR) : LONGINT; CDECL; EXTERNAL 'nlmlib.nlm' NAME 'rmdir';

while the following declaration only imports the symbol without autoloading:

FUNCTION rmdir (path : PCHAR) : LONGINT; CDECL; EXTERNAL;

If nlmlib.nlm is not loaded while loading your nlm, you will get an error about
unknown symbols.


- Debugging
---------

Debugging is possible with gdb on Netware 4.11, 5, 6 and 6.5.
See http://home.arcor.de/armin.diehl/fpcnw/gdbnw.html for details


- Netware SDK
-----------

Delphi declarations for the multiplattform api is available at
http://developer.novell.com. You can download the sdk after registering
as a developer.
The files are designed for win32 so they will not work off the box.
I think changing the dll-name to the corrosponding nlm-name will work.
i.e. in calwin32.imp the following declaration:

function NWAbortServicingQueueJob2; StdCall; external 'calwin32.dll' index 231;

has to be changed to

function NWAbortServicingQueueJob2; CDecl; external 'calwin32.nlm';

[email protected]