Browse Source

* added nwsnut demo for netware

armin 20 years ago
parent
commit
b611829203

+ 52 - 1
demo/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 1.1 [2004/12/29]
+# Don't edit, this file is generated by FPCMake Version 1.1 [2004/12/30]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx watcom morphos netwlibc
 MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx watcom morphos netwlibc
@@ -237,6 +237,9 @@ endif
 ifeq ($(OS_TARGET),netware)
 ifeq ($(OS_TARGET),netware)
 override TARGET_DIRS+=netware
 override TARGET_DIRS+=netware
 endif
 endif
+ifeq ($(OS_TARGET),netwlibc)
+override TARGET_DIRS+=netwlibc
+endif
 override INSTALL_FPCPACKAGE=y
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
@@ -1630,6 +1633,9 @@ endif
 ifeq ($(OS_TARGET),netware)
 ifeq ($(OS_TARGET),netware)
 TARGET_DIRS_NETWARE=1
 TARGET_DIRS_NETWARE=1
 endif
 endif
+ifeq ($(OS_TARGET),netwlibc)
+TARGET_DIRS_NETWLIBC=1
+endif
 ifdef TARGET_DIRS_TEXT
 ifdef TARGET_DIRS_TEXT
 text_all:
 text_all:
 	$(MAKE) -C text all
 	$(MAKE) -C text all
@@ -1945,6 +1951,51 @@ netware:
 	$(MAKE) -C netware all
 	$(MAKE) -C netware all
 .PHONY: netware_all netware_debug netware_smart netware_release netware_units netware_examples netware_shared netware_install netware_sourceinstall netware_exampleinstall netware_distinstall netware_zipinstall netware_zipsourceinstall netware_zipexampleinstall netware_zipdistinstall netware_clean netware_distclean netware_cleanall netware_info netware_makefiles netware
 .PHONY: netware_all netware_debug netware_smart netware_release netware_units netware_examples netware_shared netware_install netware_sourceinstall netware_exampleinstall netware_distinstall netware_zipinstall netware_zipsourceinstall netware_zipexampleinstall netware_zipdistinstall netware_clean netware_distclean netware_cleanall netware_info netware_makefiles netware
 endif
 endif
+ifdef TARGET_DIRS_NETWLIBC
+netwlibc_all:
+	$(MAKE) -C netwlibc all
+netwlibc_debug:
+	$(MAKE) -C netwlibc debug
+netwlibc_smart:
+	$(MAKE) -C netwlibc smart
+netwlibc_release:
+	$(MAKE) -C netwlibc release
+netwlibc_units:
+	$(MAKE) -C netwlibc units
+netwlibc_examples:
+	$(MAKE) -C netwlibc examples
+netwlibc_shared:
+	$(MAKE) -C netwlibc shared
+netwlibc_install:
+	$(MAKE) -C netwlibc install
+netwlibc_sourceinstall:
+	$(MAKE) -C netwlibc sourceinstall
+netwlibc_exampleinstall:
+	$(MAKE) -C netwlibc exampleinstall
+netwlibc_distinstall:
+	$(MAKE) -C netwlibc distinstall
+netwlibc_zipinstall:
+	$(MAKE) -C netwlibc zipinstall
+netwlibc_zipsourceinstall:
+	$(MAKE) -C netwlibc zipsourceinstall
+netwlibc_zipexampleinstall:
+	$(MAKE) -C netwlibc zipexampleinstall
+netwlibc_zipdistinstall:
+	$(MAKE) -C netwlibc zipdistinstall
+netwlibc_clean:
+	$(MAKE) -C netwlibc clean
+netwlibc_distclean:
+	$(MAKE) -C netwlibc distclean
+netwlibc_cleanall:
+	$(MAKE) -C netwlibc cleanall
+netwlibc_info:
+	$(MAKE) -C netwlibc info
+netwlibc_makefiles:
+	$(MAKE) -C netwlibc makefiles
+netwlibc:
+	$(MAKE) -C netwlibc all
+.PHONY: netwlibc_all netwlibc_debug netwlibc_smart netwlibc_release netwlibc_units netwlibc_examples netwlibc_shared netwlibc_install netwlibc_sourceinstall netwlibc_exampleinstall netwlibc_distinstall netwlibc_zipinstall netwlibc_zipsourceinstall netwlibc_zipexampleinstall netwlibc_zipdistinstall netwlibc_clean netwlibc_distclean netwlibc_cleanall netwlibc_info netwlibc_makefiles netwlibc
+endif
 all: $(addsuffix _all,$(TARGET_DIRS))
 all: $(addsuffix _all,$(TARGET_DIRS))
 debug: $(addsuffix _debug,$(TARGET_DIRS))
 debug: $(addsuffix _debug,$(TARGET_DIRS))
 smart: $(addsuffix _smart,$(TARGET_DIRS))
 smart: $(addsuffix _smart,$(TARGET_DIRS))

+ 1 - 0
demo/Makefile.fpc

@@ -13,6 +13,7 @@ dirs_win32=win32 graph
 dirs_linux=linux graph
 dirs_linux=linux graph
 dirs_os2=os2 graph
 dirs_os2=os2 graph
 dirs_netware=netware
 dirs_netware=netware
+dirs_netwlibc=netwlibc
 
 
 [install]
 [install]
 fpcpackage=y
 fpcpackage=y

+ 10 - 9
demo/fpcdemos.txt

@@ -2,15 +2,16 @@ FPC demo package
 ================
 ================
 This packages contains the following subdirs:
 This packages contains the following subdirs:
 
 
-- text    text mode demos (should run everywhere)
-- graph   demos those use the graph unit (runs nearly everywhere)
-          includes gameunit (text&graph), outputs to another subdir level
-- modex   demos those make extensive use of modeX (runs with go32v2 only)
-- win32   demos those are win32 specific
-- linux   demos those are linux specific
-- os2     demos those are OS/2 specific
-- palmos  demos those are palmos specific (dragonball)
-- netware demos those are netware(clib) specific
+- text     text mode demos (should run everywhere)
+- graph    demos those use the graph unit (runs nearly everywhere)
+           includes gameunit (text&graph), outputs to another subdir level
+- modex    demos those make extensive use of modeX (runs with go32v2 only)
+- win32    demos those are win32 specific
+- linux    demos those are linux specific
+- os2      demos those are OS/2 specific
+- palmos   demos those are palmos specific (dragonball)
+- netware  demos those are netware(clib) specific
+- netwlibc demos those are netware(libc) specific
 
 
 To build the programs simply type 'make' in the base dir. Do do
 To build the programs simply type 'make' in the base dir. Do do
 a cross build, type make OS_TARGET=crosstarget, i.e.
 a cross build, type make OS_TARGET=crosstarget, i.e.

+ 4 - 163
demo/netware/Makefile

@@ -1,8 +1,8 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 1.1 [2004/12/29]
+# Don't edit, this file is generated by FPCMake Version 1.1 [2004/12/30]
 #
 #
 default: all
 default: all
-MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx watcom morphos netwlibc
+MAKEFILETARGETS=netware
 BSDs = freebsd netbsd openbsd darwin
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) sunos qnx
 UNIXs = linux $(BSDs) sunos qnx
 LIMIT83fs = go32v2 os2 emx watcom
 LIMIT83fs = go32v2 os2 emx watcom
@@ -220,7 +220,7 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifeq ($(OS_TARGET),netware)
 ifeq ($(OS_TARGET),netware)
-override TARGET_PROGRAMS+=nutmon check
+override TARGET_PROGRAMS+=nutmon check nuttest
 endif
 endif
 ifdef REQUIRE_UNITSDIR
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
@@ -951,171 +951,11 @@ TAROPT=vz
 TAREXT=.tar.gz
 TAREXT=.tar.gz
 endif
 endif
 override REQUIRE_PACKAGES=rtl 
 override REQUIRE_PACKAGES=rtl 
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),powerpc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),sparc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),x86_64)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),linux)
-ifeq ($(CPU_TARGET),arm)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),go32v2)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),win32)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),os2)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),freebsd)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),freebsd)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),freebsd)
-ifeq ($(CPU_TARGET),x86_64)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),beos)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),netbsd)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),netbsd)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),netbsd)
-ifeq ($(CPU_TARGET),powerpc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),netbsd)
-ifeq ($(CPU_TARGET),sparc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),amiga)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),atari)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),sunos)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),sunos)
-ifeq ($(CPU_TARGET),sparc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),qnx)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
 ifeq ($(OS_TARGET),netware)
 ifeq ($(OS_TARGET),netware)
 ifeq ($(CPU_TARGET),i386)
 ifeq ($(CPU_TARGET),i386)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_RTL=1
 endif
 endif
 endif
 endif
-ifeq ($(OS_TARGET),openbsd)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),openbsd)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),wdosx)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),palmos)
-ifeq ($(CPU_TARGET),m68k)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),macos)
-ifeq ($(CPU_TARGET),powerpc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),darwin)
-ifeq ($(CPU_TARGET),powerpc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),emx)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),watcom)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),morphos)
-ifeq ($(CPU_TARGET),powerpc)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
-ifeq ($(OS_TARGET),netwlibc)
-ifeq ($(CPU_TARGET),i386)
-REQUIRE_PACKAGES_RTL=1
-endif
-endif
 ifdef REQUIRE_PACKAGES_RTL
 ifdef REQUIRE_PACKAGES_RTL
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_RTL),)
 ifneq ($(PACKAGEDIR_RTL),)
@@ -1595,3 +1435,4 @@ ifneq ($(wildcard fpcmake.loc),)
 include fpcmake.loc
 include fpcmake.loc
 endif
 endif
 nutmon.nlm: nutmon.pp nutconnection.pp
 nutmon.nlm: nutmon.pp nutconnection.pp
+nuttest.nlm: nuttest.pp ../netwlibc/nuttest.pp

+ 4 - 3
demo/netware/Makefile.fpc

@@ -1,13 +1,14 @@
 #
 #
-#   Makefile.fpc for FPC Netware demos (part of FPC demo package)
+#   Makefile.fpc for FPC Netware clib demos (part of FPC demo package)
 #
 #
 
 
 [target]
 [target]
-programs_netware=nutmon check
+programs_netware=nutmon check nuttest
 
 
 [default]
 [default]
 fpcdir=../..
 fpcdir=../..
 
 
 [rules]
 [rules]
 nutmon.nlm: nutmon.pp nutconnection.pp
 nutmon.nlm: nutmon.pp nutconnection.pp
-#        $(COMPILER) -Dw -Ch8096 -Cs32728 basicpm.pas
+
+nuttest.nlm: nuttest.pp ../netwlibc/nuttest.pp

+ 2 - 0
demo/netware/nuttest.pp

@@ -0,0 +1,2 @@
+{nuttest.pp is for clib and libc}
+{$i ../netwlibc/nuttest.pp}

+ 1437 - 0
demo/netwlibc/Makefile

@@ -0,0 +1,1437 @@
+#
+# Don't edit, this file is generated by FPCMake Version 1.1 [2004/12/30]
+#
+default: all
+MAKEFILETARGETS=netwlibc
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) sunos qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=ppc386
+endif
+else
+override FPC=ppc386
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+ifndef FPC_VERSION
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FULL_TARGET=$(OS_TARGET)
+FULL_SOURCE=$(OS_SOURCE)
+else
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(FULL_TARGET))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(FULL_TARGET))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override BINUTILSPREFIX=$(CPU_TARGET)-netware-
+ifeq ($(OS_TARGET),netwlibc)
+override TARGET_PROGRAMS+=nuttest
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(FULL_TARGET)
+else
+COMPILER_UNITTARGETDIR=units/$(FULL_TARGET)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(FULL_SOURCE)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(FULL_TARGET)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(FULL_TARGET)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(FULL_TARGET)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(FULL_SOURCE))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+STATICLIBPREFIX=libp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),sunos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.asm
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),sunos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(FULL_TARGET)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(FULL_SOURCE)
+ZIPCROSSPREFIX=$(FULL_TARGET)-
+else
+ZIPSUFFIX=.$(FULL_TARGET)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(OS_TARGET),netwlibc)
+ifeq ($(CPU_TARGET),i386)
+REQUIRE_PACKAGES_RTL=1
+endif
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(FULL_TARGET)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(FULL_TARGET)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) -Xc
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+else
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1
+else
+FPCCPUOPT:=
+endif
+endif
+override FPCOPT+=-Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-OG2p3
+endif
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifeq ($(OS_TARGET),linux)
+ifeq ($(FPC_VERSION),1.0.6)
+override FPCOPTDEF+=HASUNIX
+endif
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_exes
+ifndef CROSSINSTALL
+ifneq ($(TARGET_PROGRAMS),)
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+endif
+fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILES))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILES)))
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared:
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif

+ 16 - 0
demo/netwlibc/Makefile.fpc

@@ -0,0 +1,16 @@
+#
+#   Makefile.fpc for FPC Netware libc demos (part of FPC demo package)
+#
+
+[target]
+programs_netwlibc=nuttest
+
+[default]
+fpcdir=../..
+
+[prerules]
+# binutils are the same for targets netware and netwlibc
+override BINUTILSPREFIX=$(CPU_TARGET)-netware-
+
+
+[rules]

+ 763 - 0
demo/netwlibc/nuttest.pp

@@ -0,0 +1,763 @@
+Program nuttest;
+
+{$if not defined(netware)}
+{$error Sorry, this Demo is for netware and netwlibc only}
+{$endif}
+{$mode objfpc}
+{$if defined (netware_libc)}
+{$description FreePascal NUT Demo - libc}
+{$Screenname FreePascal NWSNUT Demo - libc}
+{$else}
+{$description FreePascal NUT Demo - clib}
+{$Screenname default}
+{$endif}
+{$Copyright 2005 Armin Diehl <[email protected]>}
+{$Version 1,0,0}
+
+
+
+{$if defined(netware_clib)}
+uses nwserv,nwsnut,sysutils;
+{$else}
+uses libc,nwsnut,sysutils;
+{$endif}
+
+var
+  gExiting : boolean  = FALSE;
+  gThreadCount : integer = 0;
+  gNUTHandle : PNUTInfo = NIL;
+
+const
+  gMyName = 'NUT Demo';
+  gMessageTable : array [0..26] of pchar = (
+        gMyName,
+        '1.00',
+        'Exit NUT Demo?',
+        'NUT Demo',
+        'NUTDEMO Tag',
+        'Main Menu',
+        'Sub-menu option #1',
+        'Unsorted Sub-menu Example',
+        'Program Trace Portal',
+        'Bobby',
+        'Sub-menu option #2',
+        'Sub-Menu',
+        'Bravo',
+        'Tango',
+        'Alpha',
+        'Zulu',
+        'Unsorted Menu',
+        'Sorted List',
+        'Sub-menu Example',
+        'Item List Example',
+        'Form Example',
+        'Menu In Form',
+        'Option 1',
+        'Option 2',
+        'Save Data?',
+        'Edit String Example',
+        'Edit Text Exampl');
+
+// keep in sync with above...
+        PROGRAM_NAME                    = $0000;
+        PROGRAM_VERSION                 = $0001;
+        PROGRAM_EXIT                    = $0002;
+        SCREEN_NAME                     = $0003;
+        RS_TAG_NAME                     = $0004;
+        MENU_MAIN__HDR                  = $0005;
+        MENU_SUB_OPTION1                = $0006;
+        MENU_MAIN_NOSORT                = $0007;
+        TRACE_PORTAL__HDR               = $0008;
+        MENU_NOSORT_OPTION_A            = $0009;
+        MENU_SUB_OPTION2                = $000A;
+        MENU_SUB__HDR                   = $000B;
+        MENU_NOSORT_OPTION_B            = $000C;
+        MENU_NOSORT_OPTION_C            = $000D;
+        MENU_NOSORT_OPTION_D            = $000E;
+        MENU_NOSORT_OPTION_E            = $000F;
+        MENU_NOSORT__HDR                = $0010;
+        LIST_SUBLIST__HDR               = $0011;
+        MENU_MAIN_SUBMENU               = $0012;
+        MENU_MAIN_LIST                  = $0013;
+        MENU_MAIN_FORM                  = $0014;
+        MENU_IN_FORM_TITLE              = $0015;
+        FORM_MENU_OPT1			= $0016;
+        FORM_MENU_OPT2                  = $0017;
+        EXIT_FORM_MSG                   = $0018;
+        MENU_MAIN_EDIT_STRING           = $0019;
+        MENU_MAIN_EDIT_TEXT             = $001A;
+
+
+function NLM_VerifyProgramExit : longint; cdecl;
+var res : integer;
+begin
+  res := NWSConfirm (PROGRAM_EXIT,   // Header
+                     0,              // centerLine
+                     0,              // Center Column
+                     1,              // Default Choice
+                     nil,            // Action Procedure
+                     gNUTHandle,     // Handle
+                     nil);           // Action Parameter
+
+  // Escape(-1) means No(0).
+  if (res = -1) then inc (res);
+  Result := res;
+end;
+
+
+(****************************************************************************
+ * Edit a string
+ ****************************************************************************)
+procedure NLM_EditStringSub; cdecl;
+const
+   maxLen = 40;
+var err : integer;
+    str : ansistring;
+begin
+   //------------------------------------------------------------------------
+   // Generate dynamic messages - this allows you to call NUT functions
+   // and specify messages on the fly
+   //*/
+   NWSSetDynamicMessage(DYNAMIC_MESSAGE_ONE, 'String Edit Function',gNUTHandle^.messages);
+   NWSSetDynamicMessage(DYNAMIC_MESSAGE_TWO, ' Editing can be fun: ',gNUTHandle^.messages);
+
+   str := 'String to edit';
+   setlength (str, maxLen);
+
+   err := NWSEditString(
+                10,   // center line
+                40,   // center column
+                1,    // edit height
+                40,   // edit width
+		DYNAMIC_MESSAGE_ONE, // header msg
+		DYNAMIC_MESSAGE_TWO, // prompt msg
+		pchar(str),          // buffer
+		maxLen,              // max length of string
+		EF_ANY OR EF_UPPER,  // acceptable chars
+		gNUTHandle,          // nut handle
+		nil,                 // insert-key procedure
+		nil,                 // action procedure
+		nil);                // parameters
+
+   // if escape key was pressed
+  if (err = 1) then
+    NWSTrace(gNUTHandle,'String was not saved');
+end;
+
+(****************************************************************************
+ * Edit text in a window
+ ****************************************************************************)
+procedure NLM_EditTextSub;
+const maxLen = 1024;
+var err : integer;
+    str : ansistring;
+begin
+  // Generate dynamic messages - this allows you to call NUT functions
+  // and specify messages on the fly
+  NWSSetDynamicMessage(DYNAMIC_MESSAGE_ONE,'Text Edit Function', gNUTHandle^.messages);
+  NWSSetDynamicMessage(DYNAMIC_MESSAGE_TWO,'Save changes?', gNUTHandle^.messages);
+
+  str := 'This could be any kind of text'#13'that you might have.';
+  setlength (str,maxLen+1);
+
+  // Edit the text in a portal with scroll bars that appear only when the
+  // text goes beyond the portal bounderies
+  err := NWSEditTextWithScrollBars (
+		10,                     // center line
+		40,                     // center column
+		4,                      // edit height
+		40,                     // edit width
+		DYNAMIC_MESSAGE_ONE,    // header msg
+		pchar(str),             // buffer
+		maxLen,                 // max length of string
+		DYNAMIC_MESSAGE_TWO,    // confirm msg
+		true,                   // force confirm
+                SHOW_VERTICAL_SCROLL_BAR OR    // // scroll bar props
+                SHOW_HORIZONTAL_SCROLL_BAR OR
+                CONSTANT_SCROLL_BARS,
+                gNUTHandle);
+
+  // escape key was pressed
+  if err = 1 then
+    NWSTrace(gNUTHandle,'Text was not saved');
+end;
+
+function NLM_FormMenuAction (option : longint; param : pointer):longint; cdecl;
+begin
+// Do anything that might be needed by the selection of a given menu option
+// and the value returned will indicate which data item is to be displayed
+// in the menu field on the form.
+   result := option;
+end;
+
+
+function NLM_HotSpotAction (fp : PField; selectKey : longint; var changedField : longint; Handle : PNUTInfo) : longint; cdecl;
+begin
+  // do the work here. . .
+
+  NWSTrace(handle, 'This is your hot spot routine');
+
+  result :=K_RIGHT;  // send us to the next field...
+end;
+
+(****************************************************************************
+ * Form display with various fields
+ ****************************************************************************)
+procedure NLM_FormSub;
+var
+  line,
+  formSaved,
+  menuChoice,
+  myInteger,
+  myHexInteger : longint;
+  MyOtherInteger : cardinal;
+  myBoolean : longbool;
+  myString : ansistring;
+  mfctl : PMFCONTROL;
+begin
+  myInteger := 600;
+  myHexInteger := $2ffc;
+  myOtherInteger := 900;
+
+  // Don't do this list if we should be exiting.
+  if gExiting then exit;
+
+  // At this point, the current list is the Main Menu.  If we begin adding
+  // new items to the current list, it would mess up the Main menu (to say
+  // the least).  So, we will save the Main Menu List on the List stack
+  // (PushList) and then initialize a new form (set head and tail to NULL)
+  // by calling NWSInitForm().
+  NWSPushList(gNUTHandle);
+  NWSInitForm(gNUTHandle);
+
+  // Define the fields in the form
+  line := 0;
+  NWSAppendCommentField (line, 1, 'Boolean Field:', gNUTHandle);
+  NWSAppendBoolField (line, 25, NORMAL_FIELD, myBoolean, 0, gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Integer Field:', gNUTHandle);
+  NWSAppendIntegerField (line, 25, NORMAL_FIELD, myInteger, 0, 9999, 0, gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'String Field:', gNUTHandle);
+  myString := 'Data String';
+  setLength (myString,30);
+  NWSAppendStringField (line, 25, 30, NORMAL_FIELD, pchar(myString), 'A..Za..z ',0, gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Unsigned Integer Field:', gNUTHandle);
+  NWSAppendUnsignedIntegerField (line, 25, NORMAL_FIELD, @myOtherInteger, 0, 99999, 0, gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Hex Field:', gNUTHandle);
+  NWSAppendHexField (line, 25, NORMAL_FIELD, @myHexInteger, 0, 99999, 0, gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Comment Field:', gNUTHandle);
+  NWSAppendCommentField (line, 25, 'A comment', gNUTHandle);
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Hot Spot Field:', gNUTHandle);
+  NWSAppendHotSpotField (line, 25, NORMAL_FIELD, 'Hot Field', @NLM_HotSpotAction, gNUTHandle);
+
+  mfctl := NWSInitMenuField (MENU_IN_FORM_TITLE, 10, 40, @NLM_FormMenuAction, gNUTHandle);
+
+  NWSAppendToMenuField (mfctl, FORM_MENU_OPT1, 1, gNUTHandle);
+  NWSAppendToMenuField (mfctl, FORM_MENU_OPT2, 2, gNUTHandle);
+
+  menuChoice := 1;       // display the text for option one
+
+  line += 2;
+  NWSAppendCommentField (line, 1, 'Menu Field:', gNUTHandle);
+  NWSAppendMenuField (line, 25, NORMAL_FIELD, @menuChoice, mfctl, 0, gNUTHandle);
+
+  // Edit the form
+  formSaved := NWSEditPortalForm (
+		MENU_MAIN_FORM,    // I- header
+		11,                // I- center line
+		40,                // I- center col
+		16,                // I- form height
+		50,                // I- form width
+		F_VERIFY,          // I- ctl flags
+	        F_NO_HELP,         // I- form help
+		EXIT_FORM_MSG,     // I- confirm msg
+		gNUTHandle);
+
+  // This function returns TRUE if the form was saved, FALSE if not.
+  // If the form was not saved you must restore all variables to their
+  // original values manually
+  if longbool (formSaved) then
+    NWSTrace(gNUTHandle,'The form data was not saved');
+
+  // cleanup and discard this form
+  NWSDestroyForm(gNUTHandle);
+  NWSPopList(gNUTHandle);
+end;
+
+
+(****************************************************************************
+ * Display information in a portal given a selection from the list
+ ****************************************************************************)
+procedure NLM_DisplayPortalInformation (selectedItem : pchar);
+var
+  portal : longint;
+  szTemp : ansistring;  //char	szTemp[80+1];
+  portalPCB : PPCB;
+begin
+  // Dim the current portal
+  NWSDeselectPortal(gNUTHandle);
+
+  // Create a portal in which we will display the connection information.
+  // (A portal is a window).
+  portal := NWSCreatePortal(
+		5,              // I- line
+		2,              // I- column
+		10,             // I- frameHeight
+		76,             // I- frameWidth
+		6,              // I- virtualHeight
+		76,             // I- virtualWidth
+		SAVE,           // I- saveFlag
+                selectedItem,   // I- headerText
+                VNORMAL,        // I- headerAttribute
+		SINGLE,         // I- borderType
+                VINTENSE,       // I- borderAttribute
+                CURSOR_OFF,     // I- cursorFlag
+                VIRTUAL,        // I- directflag
+                gNUTHandle);
+
+  case cardinal(portal) of
+    $FFFFFFFE : begin
+                  NWSTrace(gNUTHandle, 'NWSCreatePortal reports: Unable to allocate memory for PCB, virtual screen, or save area.');
+                  exit;
+                end;
+    $FFFFFFFF : begin
+                  NWSTrace(gNUTHandle, 'NWSCreatePortal reports: Maximum number of portals already defined.');
+                  exit;
+                end;
+  end;
+
+  // Get portal's PCB.
+  NWSGetPCB (portalPCB, portal, gNUTHandle);
+
+  // Make our portal current and clear it.
+  NWSSelectPortal(portal, gNUTHandle);
+  NWSClearPortal(portalPCB);
+
+  // Place information on portal.
+  NWSDisplayTextInPortal(1,0,'This is data displayed in a portal',VINTENSE,portalPCB);
+
+  szTemp := format ('Item selected: %s',[selectedItem]);
+  NWSDisplayTextInPortal(3,0,pchar(szTemp),VNORMAL,portalPCB);
+
+  NWSDisplayTextInPortal(5,0,'<Press ESCAPE to exit>',VINTENSE,portalPCB);
+
+  // Update portal content to user screen.
+  NWSUpdatePortal(portalPCB);
+
+  // Wait for user to press ESCAPE.
+  NWSWaitForEscape(gNUTHandle);
+
+  // Trash portal.
+  NWSDestroyPortal(portal, gNUTHandle);
+end;
+
+(****************************************************************************
+ * Action procedure for the list
+ ****************************************************************************)
+function NLM_ListSubAction (keyPressed : longint;
+                            elementSelected:PPLIST;
+                            itemLineNumber:plongint;
+                            actionParameter:pointer) : longint; cdecl;
+begin
+  result := -1;
+  case keyPressed of
+     M_ESCAPE : result := 0;
+     M_SELECT : begin
+                  NLM_DisplayPortalInformation(@elementSelected^^.text);
+                  result := -1;
+                end;
+  end;
+end;
+
+
+(****************************************************************************
+ * Build a list of items
+ ****************************************************************************)
+procedure NLM_ListSubBuild;
+var i : integer;
+    s : ansistring;
+begin
+  for i := 1 to 50 do
+  begin
+    s := format ('Item number %02d',[i]);
+    NWSAppendToList (pchar(s),nil,gNUTHandle);
+  end;
+end;
+
+
+(****************************************************************************
+ * Create and display the list
+ ****************************************************************************)
+procedure NLM_DisplaySubList;
+begin
+  if gExiting then exit;
+
+  // At this point, the current list is the Main Menu.  If we begin adding
+  // new items to the current list, it would mess up the Main menu (to say
+  // the least).  So, we will save the Main Menu List on the List stack
+  // (PushList) and then initialize a new list (set head and tail to NULL)
+  // by calling InitList().  Note that Lists use NWInitList() and Menus use
+  // NWInitMenu().
+  NWSPushList(gNUTHandle);
+  NWSInitList(gNUTHandle, nil);
+
+  // Build a list
+  NLM_ListSubBuild;
+
+  // Display the list and allow user interaction.
+  NWSList(
+           LIST_SUBLIST__HDR,     // I- header
+           0,                     // I- centerLine
+	   0,                     // I- centerColumn
+           10,                    // I- height
+           72,                    // I- width
+           M_ESCAPE OR M_SELECT,  // I- validKeyFlags
+           nil,                   // IO element
+           gNUTHandle,            // I- handle
+           nil,                   // I- formatProcedure
+           @NLM_ListSubAction,    // I- actionProcedure
+           nil);                  // I- actionParameter
+
+  // Before returning, we must free the list items allocated by
+  // NLM_ListSubBuild...().  Then the Main Menu list context
+  // must be restored.  Note that Lists use NWDestroyList() and
+  // Menus use NWDestroyMenu().
+  NWSDestroyList(gNUTHandle);
+  NWSPopList(gNUTHandle);
+end;
+
+
+(****************************************************************************
+ * Unsorted sub-menu (NWSLIST) action procedure.  Note that the parameters
+ * for an NWSList() action procedure are very different from the parameters
+ * passed to an NWSMenu() action procedure.
+ ****************************************************************************)
+
+function NLM_MenuNoSortAct (keyPressed:longint; elementSelected:PPLIST; itemLineNumber:plongint; actionParameter:pointer):longint;  cdecl;
+var index : integer;
+begin
+  // Setup index variable to be the same as it would be in a NWSMenu()
+  // action procedure.
+  if keypressed = M_ESCAPE then
+    index := -1
+  else
+    index := integer(elementSelected^^.otherInfo^);
+
+  // Perform the user-selected action.
+  // (Just like a normal NWSMenu() action procedure...)
+  case index of
+    -1: begin
+          result := 0; exit;
+        end;
+    MENU_NOSORT_OPTION_A :
+          NWSTrace(gNUTHandle,'Insert no-sort sub-menu option #A here.');
+    MENU_NOSORT_OPTION_B :
+          NWSTrace(gNUTHandle,'Insert no-sort sub-menu option #B here.');
+    MENU_NOSORT_OPTION_C :
+          NWSTrace(gNUTHandle,'Insert no-sort sub-menu option #C here.');
+    MENU_NOSORT_OPTION_D :
+          NWSTrace(gNUTHandle,'Insert no-sort sub-menu option #D here.');
+    MENU_NOSORT_OPTION_E :
+          NWSTrace(gNUTHandle,'Insert no-sort sub-menu option #E here.')
+    else
+          NWSTrace(gNUTHandle,pchar(format('Option %d not implemented.',[index])));
+  end;
+
+  // If we should be exiting, pretend that ESCAPE was pressed.
+  if gExiting then
+    result := 0
+  else
+    result := -1;
+end;
+
+
+(****************************************************************************
+ * Unsorted sub-menu.
+ *
+ * There are times when you would like to display a menu, but you don't want
+ * the elements to be sorted.  NWSMenu() automatically sorts the list of menu
+ * items and there is no way to disable this feature.
+ *
+ * The NWSList() function has an M_NO_SORT flag that is not available to the
+ * NWSMenu() function; however, using NWSList to display a menu can be scary
+ * if you don't know how.
+ *
+ * The following code demonstrates how to build a menu and then display it as
+ * a list.  The action procedure (above) is specific to NWSList() and is not
+ * a suitable action procedure for NWSMenu().
+ ***************************************************************************)
+procedure NLM_MenuNoSort;
+var defItem : PLIST;
+begin
+  if gExiting then exit;
+
+  // At this point, the current list is the Main Menu.  If we begin adding
+  // new items to the current list, it would mess up the Main menu (to say
+  // the least).  So, we will save the Main Menu List on the List stack
+  // (PushList) and then initialize a new list (set head and tail to NULL)
+  // by calling InitMenu().  Note that Lists use NWInitList() and Menus use
+  // NWInitMenu().
+  NWSPushList(gNUTHandle);
+  NWSInitMenu(gNUTHandle);
+
+  // Insert menu items in the order they will be displayed.
+  NWSAppendToMenu(MENU_NOSORT_OPTION_B, MENU_NOSORT_OPTION_B, gNUTHandle);
+  NWSAppendToMenu(MENU_NOSORT_OPTION_A, MENU_NOSORT_OPTION_A, gNUTHandle);
+  defItem := NWSAppendToMenu(MENU_NOSORT_OPTION_C, MENU_NOSORT_OPTION_C, gNUTHandle);
+  NWSAppendToMenu(MENU_NOSORT_OPTION_E, MENU_NOSORT_OPTION_E, gNUTHandle);
+  NWSAppendToMenu(MENU_NOSORT_OPTION_D, MENU_NOSORT_OPTION_D, gNUTHandle);
+
+  // Display the menu (as though it were a list) and allow user interaction.
+	NWSList(
+                MENU_NOSORT__HDR,   // header
+		0,                  // centerLine
+		65,                 // centerColumn
+		5,                  // height
+		20,                 // width
+                M_ESCAPE OR M_SELECT OR
+                M_NO_SORT,          // validKeyFlags
+		@defItem,           // element
+		gNUTHandle,         // handle
+		nil,                // formatProcedure
+                @NLM_MenuNoSortAct, // actionProcedure
+		nil);               // actionParameter
+
+  // Before returning, we must free the list items allocated by
+  // NWSAppendToMenu().  Then the Main Menu list context must be restored.
+  // Note that Lists use NWDestroyList() and Menus use NWDestroyMenu().
+  NWSDestroyMenu(gNUTHandle);
+  NWSPopList(gNUTHandle);
+end;
+
+
+(****************************************************************************
+ * Sub menu (sorted) action procedure.
+ ****************************************************************************)
+function NLM_MenuSubAction (index:longint; parm:pointer):longint; cdecl;
+begin
+  // Perform the user-selected action.
+  case index of
+    -1 : begin
+           result := 0; exit;
+         end;
+    MENU_SUB_OPTION1: NWSTrace(gNUTHandle,'Insert sub-menu option #1 here.');
+    MENU_SUB_OPTION2: NWSTrace(gNUTHandle,'Insert sub-menu option #2 here.')
+  else
+    NWSTrace(gNUTHandle,'Option not implemented.');
+  end;
+
+  // If we should be exiting, pretend that ESCAPE was pressed.
+  if gExiting then
+    result := 0
+  else
+    result := -1;
+end;
+
+
+procedure NLM_MenuSub;
+begin
+  if gExiting then exit;
+
+  // At this point, the current list is the Main Menu.  If we begin adding
+  // new items to the current list, it would mess up the Main menu (to say
+  // the least).  So, we will save the Main Menu List on the List stack
+  // (PushList) and then initialize a new list (set head and tail to NULL)
+  // by calling InitMenu().  Note that Lists use NWInitList() and Menus use
+  // NWInitMenu().
+
+  NWSPushList(gNUTHandle);
+  NWSInitMenu(gNUTHandle);
+
+  // Insert menu items.  Note that the insertion order does not matter being
+  // that NWSMenu() will always sort the Menu selections automatically.
+
+  NWSAppendToMenu(MENU_SUB_OPTION1, MENU_SUB_OPTION1, gNUTHandle);
+  NWSAppendToMenu(MENU_SUB_OPTION2, MENU_SUB_OPTION2, gNUTHandle);
+
+  // Display the menu and allow user interaction.
+  NWSMenu(MENU_SUB__HDR,                // Header
+          0,                            // centerLine
+          15,                           // centerColumn
+          nil,                          // defaultElement
+          @NLM_MenuSubAction,           // actionProcedure
+          gNUTHandle,
+          nil);                         // actionParameter
+
+  // Before returning, we must free the list items allocated by
+  // NWSAppendToMenu().  Then the Main Menu list context must be restored.
+  // Note that Lists use NWDestroyList() and Menus use NWDestroyMenu().
+
+  NWSDestroyMenu(gNUTHandle);
+  NWSPopList(gNUTHandle);
+end;
+
+
+
+function NLM_MenuMainAction (index:longint; parm:pointer):longint; cdecl;
+begin
+  case index of
+    -1: if longbool(NLM_VerifyProgramExit) then  // ESC pressed
+        begin
+          result := 0;
+          exit;
+        end;
+    MENU_MAIN_SUBMENU     : NLM_MenuSub;
+    MENU_MAIN_NOSORT      : NLM_MenuNoSort;
+    MENU_MAIN_LIST        : NLM_DisplaySubList;
+    MENU_MAIN_FORM        : NLM_FormSub;
+    MENU_MAIN_EDIT_STRING : NLM_EditStringSub;
+    MENU_MAIN_EDIT_TEXT   : NLM_EditTextSub
+  else
+    NWSTrace(gNUTHandle,'Option not implemented.');
+  end;
+
+  if gExiting then
+    result := 0
+  else
+    result := -1;
+end;
+
+
+procedure DoMainMenu;
+var defaultOption : PLIST;
+begin
+  if gExiting then exit;
+
+  // At this point, the current list is uninitialized (being that it is the
+  // first list of the program.)  Before using the current list it must be
+  // initialized (set head and tail to NULL) by calling InitMenu().
+  // Note that Lists use NWInitList() and Menus use NWInitMenu().
+
+  NWSInitMenu(gNUTHandle);
+
+  // Insert menu items.  Note that the insertion order does not matter being
+  // that NWSMenu() will always sort the Menu selections automatically.
+  // The defaultOption stores a pointer to the menu item which we wish to be
+  // highlighed by default.
+
+  NWSAppendToMenu(MENU_MAIN_SUBMENU, MENU_MAIN_SUBMENU, gNUTHandle);
+  NWSAppendToMenu(MENU_MAIN_NOSORT, MENU_MAIN_NOSORT, gNUTHandle);
+  NWSAppendToMenu(MENU_MAIN_LIST, MENU_MAIN_LIST, gNUTHandle);
+  NWSAppendToMenu(MENU_MAIN_FORM, MENU_MAIN_FORM, gNUTHandle);
+  defaultOption :=
+    NWSAppendToMenu(MENU_MAIN_EDIT_STRING, MENU_MAIN_EDIT_STRING, gNUTHandle);
+  NWSAppendToMenu(MENU_MAIN_EDIT_TEXT, MENU_MAIN_EDIT_TEXT, gNUTHandle);
+
+  // Display the menu and allow user interaction.
+
+  NWSMenu(MENU_MAIN__HDR,       // Header
+          0,                    // centerLine
+          0,                    // centerColumn
+          defaultOption,        // defaultElement
+          @NLM_MenuMainAction,  // procedure to handle events
+          gNUTHandle,
+          nil);                 // actionParameter
+
+  // Before returning, we must free the list items allocated by
+  // NWSAppendToMenu(). Note that Lists use NWDestroyList() and Menus use
+  // NWDestroyMenu().
+
+  NWSDestroyMenu(gNUTHandle);
+end;
+
+
+procedure DeinitializeNUT;
+begin
+  if gNUTHandle <> nil then
+    NWSRestoreNut(gNUTHandle);
+end;
+
+var oldNetwareUnloadProc : pointer = nil;
+
+procedure onUnload;
+var i : integer;
+begin
+  gExiting := TRUE;
+
+  // Wait for main() to terminate.
+  // If main() has not terminateded within a 1/2 second, ungetch an
+  // escape key. This will "trick" a blocking NWSList() or NWSMenu()
+  // function and wake it up.
+  i := 0;
+  while (gThreadCount > 0) do
+  begin
+    delay (100);
+    inc(i);
+    if i = 5 then
+      ungetcharacter(ESCAPE);
+    {$if defined (netware_libc)}
+    pthread_yield;
+    {$else}
+    ThreadSwitchWithDelay;
+    {$endif}
+  end;
+  System.NetwareUnloadProc := oldNetwareUnloadProc;
+end;
+
+
+procedure InitializeNUT;
+var err : integer;
+    NLMHandle : TNLMHandle;
+    screen    : TScr;
+    allocTag  : TRtag;
+begin
+  // use the SIGTERM handler defined in system.pp to facilitate a console UNLOAD command.
+  oldNetwareUnloadProc := System.NetwareUnloadProc;
+  NetwareUnloadProc := @onUnload;
+
+  NLMHandle := getnlmhandle;
+  {$if defined(netware_clib)}
+  screen := CreateScreen ('FreePascal NWSNUT Demo - clib',AUTO_DESTROY_SCREEN);
+  if screen <> nil then
+    DisplayScreen (screen);
+  {$else}
+  screen    := getscreenhandle();
+  {$endif}
+
+  if ((pointer(NLMHandle) = nil) or (pointer(screen) = nil)) then
+  begin
+    gExiting := TRUE;
+    Exit;
+  end;
+
+  // Fire up NWSNUT on our screen which was set up via the linker. LibC
+  // doesn't have a great deal of flexibility with screens. Setting up your
+  // own, additional screen may prove challenging, however, it should be
+  // possible.
+
+  allocTag := AllocateResourceTag(NLMHandle, gMyName, AllocSignature);
+  if pointer(allocTag) = nil then
+  begin
+    gExiting := TRUE;
+    Exit;
+  end;
+
+  err := NWSInitializeNut(PROGRAM_NAME, PROGRAM_VERSION, NORMAL_HEADER,
+                          NUT_REVISION_LEVEL, gMessageTable, nil, screen, allocTag,
+                          gNUTHandle);
+  if err <> 0 then
+    gExiting := TRUE;
+end;
+
+
+begin
+  inc (gThreadCount);
+
+  InitializeNUT;
+  DoMainMenu;
+  DeinitializeNUT;
+
+  dec (gThreadCount);
+end.
+