瀏覽代碼

Merged revisions 9407,9411,9434,9442,9446,9450-9456,9459-9463,9466,9468-9469,9472-9473,9476-9477,9480,9485,9491-9492,9509,9529,9536,9550,9566-9568,9571,9573,9575-9577,9579-9581,9583,9587,9591,9601-9602,9625,9627-9629,9632-9637,9653,9655-9656,9658,9681-9684,9686 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r9407 | michael | 2007-12-07 11:53:21 +0100 (Fri, 07 Dec 2007) | 1 line

* Patch from Andrew Haines to support FPDOC generating CHMs
........
r9411 | michael | 2007-12-07 17:42:09 +0100 (Fri, 07 Dec 2007) | 1 line

* Implemented dummys for missing methods
........
r9442 | michael | 2007-12-13 21:54:31 +0100 (Thu, 13 Dec 2007) | 1 line

* Patch from Andrew Haines removing some debug statements
........
r9446 | andrew | 2007-12-14 18:24:18 +0100 (Fri, 14 Dec 2007) | 2 lines

changed Int64 to QWord for chmreader to be consistent.
........
r9485 | jonas | 2007-12-17 13:23:46 +0100 (Mon, 17 Dec 2007) | 3 lines

* fixed differing result types between interface/implementation
of CCreateGUID detected by r9484
........
r9509 | Almindor | 2007-12-22 09:59:58 +0100 (Sat, 22 Dec 2007) | 2 lines

* fix glext_fog_coord functions, patch by Michalis Kamburelis
........
r9575 | michael | 2007-12-29 23:09:37 +0100 (Sat, 29 Dec 2007) | 1 line

* Added fclel.res to list of installed files for win32
........
r9580 | michael | 2007-12-30 00:41:12 +0100 (Sun, 30 Dec 2007) | 1 line

+ Fixed file variable names so they can contain = chars
........
r9581 | michael | 2007-12-30 00:48:56 +0100 (Sun, 30 Dec 2007) | 1 line

* Added support for -I directive for include files
........
r9591 | michael | 2007-12-30 21:59:07 +0100 (Sun, 30 Dec 2007) | 1 line

* Second try to fix bug ID #10117
........
r9601 | michael | 2007-12-30 23:25:42 +0100 (Sun, 30 Dec 2007) | 1 line

* Added more drive detection mechanisms
........
r9602 | michael | 2007-12-31 11:02:53 +0100 (Mon, 31 Dec 2007) | 1 line

* Fixed memory leak. Patch by Inoussa OUEDRAOGO
........
r9625 | jonas | 2008-01-04 15:53:27 +0100 (Fri, 04 Jan 2008) | 3 lines

* {$ifdef x86} -> {$if defined(cpui386) or defined(cpux86_64)}
(mantis #10507)
........
r9627 | jonas | 2008-01-04 23:42:19 +0100 (Fri, 04 Jan 2008) | 2 lines

* fixed for 64 bit (patch by Michalis Kamburelis, mantis #10508)
........
r9628 | jonas | 2008-01-04 23:46:22 +0100 (Fri, 04 Jan 2008) | 3 lines

* use math.setexceptionmask so the sse cw is also modified (needed at
least for darwin/x86_64)
........
r9629 | jonas | 2008-01-05 00:32:55 +0100 (Sat, 05 Jan 2008) | 3 lines

* replaced word parameters with cardinal (they are "unsigned int" in
the C headers)
........
r9653 | peter | 2008-01-06 18:15:04 +0100 (Sun, 06 Jan 2008) | 4 lines

* write fpunits.conf when installing units
* fix default setting for globalunitdir and baseinstalldir
* cleanup of log levels
........
r9681 | peter | 2008-01-08 19:41:53 +0100 (Tue, 08 Jan 2008) | 3 lines

* remove defaultpackage from custominstaller, you need to explicity start with package
* rename startpackage to addpackage to be consistent, remove endpackage
........
r9682 | peter | 2008-01-08 19:42:05 +0100 (Tue, 08 Jan 2008) | 2 lines

* updated for new fpmkunit
........
r9683 | peter | 2008-01-08 19:51:31 +0100 (Tue, 08 Jan 2008) | 2 lines

* update for fpmkunit changes
........
r9684 | peter | 2008-01-08 19:52:39 +0100 (Tue, 08 Jan 2008) | 3 lines

* move Add[Doc|Test|Examples]Files to TSources
* force the use of Package.Dependencies.Add or Package.Sources.Add functions
........
r9686 | peter | 2008-01-09 00:43:53 +0100 (Wed, 09 Jan 2008) | 2 lines

* support units per target
........

git-svn-id: branches/fixes_2_2@9762 -

peter 17 年之前
父節點
當前提交
23b62be08b

+ 1 - 2
.gitattributes

@@ -4242,7 +4242,6 @@ packages/fpmkunit/fpmake.pp svneol=native#text/plain
 packages/fpmkunit/src/fpmkunit.pp svneol=native#text/plain
 packages/hash/Makefile svneol=native#text/plain
 packages/hash/Makefile.fpc svneol=native#text/plain
-packages/hash/fpmake.inc svneol=native#text/plain
 packages/hash/fpmake.pp svneol=native#text/plain
 packages/hash/src/crc.pas svneol=native#text/plain
 packages/hash/src/md5.pp svneol=native#text/plain
@@ -4261,7 +4260,6 @@ packages/paszlib/demo/example.pas svneol=native#text/plain
 packages/paszlib/demo/minigzip.pas svneol=native#text/plain
 packages/paszlib/demo/miniunz.pas svneol=native#text/plain
 packages/paszlib/demo/minizip.pas svneol=native#text/plain
-packages/paszlib/fpmake.inc svneol=native#text/plain
 packages/paszlib/fpmake.pp svneol=native#text/plain
 packages/paszlib/gzio.pas svneol=native#text/plain
 packages/paszlib/infblock.pas svneol=native#text/plain
@@ -8779,6 +8777,7 @@ utils/fpdoc/Makefile.fpc svneol=native#text/plain
 utils/fpdoc/README -text
 utils/fpdoc/dglobals.pp svneol=native#text/plain
 utils/fpdoc/dw_html.pp svneol=native#text/plain
+utils/fpdoc/dw_htmlchm.inc svneol=native#text/plain
 utils/fpdoc/dw_ipf.pp svneol=native#text/plain
 utils/fpdoc/dw_latex.pp svneol=native#text/plain
 utils/fpdoc/dw_linrtf.pp svneol=native#text/plain

+ 3 - 1
packages/extra/cdrom/lincd.pp

@@ -1079,7 +1079,7 @@ end;
 
 
 Const
-  NrDevices = 14;
+  NrDevices = 16;
   Devices : Array[1..NrDevices] of string = (
   '/dev/cdrom',
   '/dev/cdroms/cdrom?',
@@ -1094,6 +1094,8 @@ Const
   '/dev/sjcd',
   '/dev/cm206cd',
   '/dev/gscd',
+  '/dev/scd?',
+  '/dev/sr?',
   '/dev/optcd');
 
 Function DetectCD : String;

+ 33 - 249
packages/extra/chm/Makefile

@@ -1,11 +1,12 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/21]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/11/08]
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 .PHONY: FORCE
 override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
@@ -56,6 +57,11 @@ else
 SRCBATCHEXT=.bat
 endif
 endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
 ifdef inUnix
 PATHSEP=/
 else
@@ -102,7 +108,11 @@ ifndef FPC
 FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
 ifneq ($(FPCPROG),)
 FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
 FPC:=$(shell $(FPCPROG) -PB)
+endif
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 endif
@@ -352,6 +362,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override TARGET_PROGRAMS+=chmcmd chmls
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_PROGRAMS+=chmcmd chmls
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override TARGET_PROGRAMS+=chmcmd chmls
 endif
@@ -508,6 +521,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override TARGET_UNITS+=fasthtmlparser htmlutil paslzx paslzxcomp paslznonslide chmbase chmtypes chmspecialfiles chmsitemap chmwriter chmfilewriter chmreader
 endif
@@ -1296,26 +1312,18 @@ override REQUIRE_PACKAGES=rtl rtl fcl-xml
 ifeq ($(FULL_TARGET),i386-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_WINUNITS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
@@ -1323,334 +1331,234 @@ endif
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_NETDB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_WINUNITS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
@@ -1658,94 +1566,66 @@ endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 endif
@@ -1801,110 +1681,6 @@ ifdef UNITDIR_NETDB
 override COMPILER_UNITDIR+=$(UNITDIR_NETDB)
 endif
 endif
-ifdef REQUIRE_PACKAGES_HASH
-PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_HASH),)
-ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
-UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
-else
-UNITDIR_HASH=$(PACKAGEDIR_HASH)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_HASH)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_HASH=
-UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_HASH),)
-UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
-else
-UNITDIR_HASH=
-endif
-endif
-ifdef UNITDIR_HASH
-override COMPILER_UNITDIR+=$(UNITDIR_HASH)
-endif
-endif
-ifdef REQUIRE_PACKAGES_PASZLIB
-PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_PASZLIB),)
-ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
-UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
-else
-UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_PASZLIB=
-UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_PASZLIB),)
-UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
-else
-UNITDIR_PASZLIB=
-endif
-endif
-ifdef UNITDIR_PASZLIB
-override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
-endif
-endif
-ifdef REQUIRE_PACKAGES_LIBASYNC
-PACKAGEDIR_LIBASYNC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /libasync/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_LIBASYNC),)
-ifneq ($(wildcard $(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)),)
-UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)
-else
-UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_LIBASYNC)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_LIBASYNC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_LIBASYNC)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_LIBASYNC=
-UNITDIR_LIBASYNC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /libasync/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_LIBASYNC),)
-UNITDIR_LIBASYNC:=$(firstword $(UNITDIR_LIBASYNC))
-else
-UNITDIR_LIBASYNC=
-endif
-endif
-ifdef UNITDIR_LIBASYNC
-override COMPILER_UNITDIR+=$(UNITDIR_LIBASYNC)
-endif
-endif
-ifdef REQUIRE_PACKAGES_PTHREADS
-PACKAGEDIR_PTHREADS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_PTHREADS),)
-ifneq ($(wildcard $(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)),)
-UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)
-else
-UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_PTHREADS)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_PTHREADS) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_PTHREADS)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_PTHREADS=
-UNITDIR_PTHREADS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_PTHREADS),)
-UNITDIR_PTHREADS:=$(firstword $(UNITDIR_PTHREADS))
-else
-UNITDIR_PTHREADS=
-endif
-endif
-ifdef UNITDIR_PTHREADS
-override COMPILER_UNITDIR+=$(UNITDIR_PTHREADS)
-endif
-endif
 ifdef REQUIRE_PACKAGES_FCL-BASE
 PACKAGEDIR_FCL-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_FCL-BASE),)
@@ -1997,7 +1773,7 @@ override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 ifndef CROSSBOOTSTRAP
 ifneq ($(BINUTILSPREFIX),)
-override FPCOPT+=-XP$(BINUTILSPREFIX) 
+override FPCOPT+=-XP$(BINUTILSPREFIX)
 endif
 ifneq ($(BINUTILSPREFIX),)
 override FPCOPT+=-Xr$(RLINKPATH)
@@ -2129,9 +1905,13 @@ ifeq (,$(findstring -s ,$(COMPILER)))
 EXECPPAS=
 else
 ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
 EXECPPAS:=@$(PPAS)
 endif
 endif
+endif
 .PHONY: fpc_units
 ifneq ($(TARGET_UNITS),)
 override ALLTARGET+=fpc_units
@@ -2372,8 +2152,12 @@ else
 endif
 ifdef inUnix
 	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) (ZIPWRAPPER)
 else
 	$(ZIPWRAPPER)
+endif
 endif
 	$(DEL) $(ZIPWRAPPER)
 else

+ 22 - 10
packages/extra/chm/chmfilewriter.pas

@@ -36,6 +36,7 @@ type
 
   TChmProject = class
   private
+    FWriter: TChmWriter;
     FAutoFollowLinks: Boolean;
     FDefaultFont: String;
     FDefaultPage: String;
@@ -49,6 +50,7 @@ type
     FTitle: String;
   protected
     function GetData(const DataName: String; out PathInChm: String; out FileName: String; var Stream: TStream): Boolean;
+    procedure LastFileAdded(Sender: TObject);
   public
     constructor Create;
     destructor Destroy; override;
@@ -93,6 +95,25 @@ begin
   if Assigned(FOnProgress) then FOnProgress(Self, DataName);
 end;
 
+procedure TChmProject.LastFileAdded(Sender: TObject);
+var
+  IndexStream: TFileStream;
+  TOCStream: TFileStream;
+begin
+  // Assign the TOC and index files
+  if (IndexFileName <> '') and FileExists(IndexFileName) then begin
+    IndexStream := TFileStream.Create(IndexFileName, fmOpenRead);
+    FWriter.AppendIndex(IndexStream);
+    IndexStream.Free;
+  end;
+  if (TableOfContentsFileName <> '') and FileExists(TableOfContentsFileName) then begin
+    TOCStream := TFileStream.Create(TableOfContentsFileName, fmOpenRead);
+    FWriter.AppendTOC(TOCStream);
+    TOCStream.Free;
+  end;
+
+end;
+
 constructor TChmProject.Create;
 begin
   FFiles := TStringList.Create;
@@ -174,20 +195,11 @@ begin
   Writer := TChmWriter.Create(AOutStream, False);
   // our callback to get data
   Writer.OnGetFileData := @GetData;
+  Writer.OnLastFile    := @LastFileAdded;
   
   // give it the list of files
   Writer.FilesToCompress.AddStrings(Files);
 
-  // Assign the TOC and index files
-  if (IndexFileName <> '') and FileExists(IndexFileName) then begin
-    IndexStream := TFileStream.Create(IndexFileName, fmOpenRead);
-    Writer.IndexStream := IndexStream;
-  end;
-  if (TableOfContentsFileName <> '') and FileExists(TableOfContentsFileName) then begin
-    TOCStream := TFileStream.Create(TableOfContentsFileName, fmOpenRead);
-    Writer.TOCStream := TOCStream;
-  end;
-  
   // now some settings in the chm
   Writer.DefaultPage := DefaultPage;
   Writer.Title := Title;

+ 12 - 11
packages/extra/chm/chmreader.pas

@@ -57,9 +57,9 @@ type
     fChmHeader: TITSFHeader;
     fHeaderSuffix: TITSFHeaderSuffix;
     fDirectoryHeader: TITSPHeader;
-    fDirectoryHeaderPos: Int64;
+    fDirectoryHeaderPos: QWord;
     fDirectoryHeaderLength: QWord;
-    fDirectoryEntriesStartPos: Int64;
+    fDirectoryEntriesStartPos: QWord;
     fDirectoryEntries: array of TPMGListChunkEntry;
     fCachedEntry: TPMGListChunkEntry; //contains the last entry found by ObjectExists
     fDirectoryEntriesCount: LongWord;
@@ -75,7 +75,7 @@ type
     procedure GetSections(out Sections: TStringList);
     function  GetBlockFromSection(SectionPrefix: String; StartPos: QWord; BlockLength: QWord): TMemoryStream;
     function  FindBlocksFromUnCompressedAddr(var ResetTableEntry: TPMGListChunkEntry;
-       out CompressedSize: Int64; out UnCompressedSize: Int64; out LZXResetTable: TLZXResetTableArr): QWord;  // Returns the blocksize
+       out CompressedSize: QWord; out UnCompressedSize: QWord; out LZXResetTable: TLZXResetTableArr): QWord;  // Returns the blocksize
   public
     constructor Create(AStream: TStream; FreeStreamOnDestroy: Boolean); virtual;
     destructor Destroy; override;
@@ -343,10 +343,10 @@ procedure TChmReader.ReadCommonData;
      fStrings: TMemoryStream;
      EntryCount,
      EntrySize: DWord;
-     EntryStart: Int64;
+     EntryStart: QWord;
      StrPosition: DWord;
      X: Integer;
-     OffSet: Int64;
+     OffSet: QWord;
    begin
      fWindows := TMemoryStream(GetObject('/#WINDOWS'));
      if fWindows = nil then begin
@@ -629,7 +629,7 @@ var
   ItemCount: Integer;
   procedure ReadQuickRefSection;
   var
-    OldPosn: Int64;
+    OldPosn: QWord;
     Posn: Integer;
     I: Integer;
   begin
@@ -671,7 +671,7 @@ var
   I: Integer;
 begin
   Result := 0;
-
+  //WriteLn('Looking for URL : ', Name);
   if Name = '' then Exit;
   if fDirectoryHeader.DirectoryChunkCount = 0 then exit;
 
@@ -835,8 +835,8 @@ var
   Compressed: Boolean;
   Sig: Array [0..3] of char;
   CompressionVersion: LongWord;
-  CompressedSize: Int64;
-  UnCompressedSize: Int64;
+  CompressedSize: QWord;
+  UnCompressedSize: QWord;
   //LZXResetInterval: LongWord;
   //LZXWindowSize: LongWord;
   //LZXCacheSize: LongWord;
@@ -942,7 +942,7 @@ begin
 
       //now write the decompressed data to the stream
       if ResultCode = DECR_OK then begin
-        Result.Write(OutBuf[WriteStart], Int64(WriteCount));
+        Result.Write(OutBuf[WriteStart], QWord(WriteCount));
       end
       else begin
         {$IFDEF CHM_DEBUG} // windows gui program will cause an exception with writeln's
@@ -967,7 +967,7 @@ begin
 end;
 
 function TITSFReader.FindBlocksFromUnCompressedAddr(var ResetTableEntry: TPMGListChunkEntry;
-  out CompressedSize: Int64; out UnCompressedSize: Int64; out LZXResetTable: TLZXResetTableArr): QWord;
+  out CompressedSize: QWord; out UnCompressedSize: QWord; out LZXResetTable: TLZXResetTableArr): QWord;
 var
   BlockCount: LongWord;
   {$IFDEF ENDIAN_BIG}
@@ -1117,6 +1117,7 @@ begin
     Found := True;
   end;
   if not Found then exit;
+  //WriteLn('Looking for URL ', URL, ' in ', AFileName);
   if CheckOpenFile(AFileName) then
     Result := fLastChm.ObjectExists(URL);
   if Result > 0 then NAme := Url;

+ 13 - 8
packages/extra/chm/chmsitemap.pas

@@ -39,6 +39,7 @@ type
     FComment: String;
     FImageNumber: Integer;
     FIncreaseImageIndex: Boolean;
+    FKeyWord: String;
     FLocal: String;
     FOwner: TChmSiteMapItems;
     FSeeAlso: String;
@@ -50,6 +51,7 @@ type
     destructor Destroy; override;
     property Children: TChmSiteMapItems read FChildren write SetChildren;
     property Text: String read FText write FText; // Name for TOC; KeyWord for index
+    property KeyWord: String read FKeyWord write FKeyWord;
     property Local: String read FLocal write FLocal;
     property URL: String read FURL write FURL;
     property SeeAlso: String read FSeeAlso write FSeeAlso;
@@ -81,6 +83,7 @@ type
     function NewItem: TChmSiteMapItem;
     function Insert(AItem: TChmSiteMapItem; AIndex: Integer): Integer;
     procedure Clear;
+    procedure Sort(Compare: TListSortCompare);
     property Item[AIndex: Integer]: TChmSiteMapItem read GetItem write SetItem;
     property Count: Integer read GetCount;
     property ParentItem: TChmSiteMapItem read FParentItem;
@@ -338,15 +341,15 @@ var
     Item: TChmSiteMapItem;
   begin
     for I := 0 to AItems.Count-1 do begin
-
-      
       Item := AItems.Item[I];
       WriteString('<LI> <OBJECT type="text/sitemap">');
       Inc(Indent, 8);
-      //Merge
-      //if (SiteMapType = stIndex) and (Item.Text <> '') then WriteParam('Keyword', Item.Text);
+
+      if (SiteMapType = stIndex) and (Item.Children.Count > 0) then
+         WriteParam('Keyword', Item.Text);
+      //if Item.KeyWord <> '' then WriteParam('Keyword', Item.KeyWord);
       if Item.Text <> '' then WriteParam('Name', Item.Text);
-      if Item.Local <> '' then WriteParam('Local', Item.Local);
+      if (Item.Local <> '') or (SiteMapType = stIndex) then WriteParam('Local', Item.Local);
       if Item.URL <> '' then WriteParam('URL', Item.URL);
       if (SiteMapType = stIndex) and (Item.SeeAlso <> '') then WriteParam('See Also', Item.SeeAlso);
       //if Item.FrameName <> '' then WriteParam('FrameName', Item.FrameName);
@@ -367,9 +370,6 @@ var
         Dec(Indent, 8);
         WriteString('</UL>');
       end;
-      
-
-
     end;
   end;
 begin
@@ -498,5 +498,10 @@ begin
   for I := Count-1 downto 0 do Delete(I);
 end;
 
+procedure TChmSiteMapItems.Sort(Compare: TListSortCompare);
+begin
+  FList.Sort(Compare);
+end;
+
 end.
 

+ 2 - 2
packages/extra/chm/chmspecialfiles.pas

@@ -34,7 +34,7 @@ uses
   function WriteSpanInfoToStream(const AStream: TStream; UncompressedSize: QWord): Integer;
   function WriteTransformListToStream(const AStream: TStream): Integer;
   function WriteResetTableToStream(const AStream: TStream; ResetTableStream: TMemoryStream): Integer;
-  function WriteContentToStream(const AStream: TStream; ContentStream: TMemoryStream): Integer;
+  function WriteContentToStream(const AStream: TStream; ContentStream: TStream): Integer;
   
 implementation
 
@@ -120,7 +120,7 @@ begin
   Result := AStream.CopyFrom(ResetTableStream, ResetTableStream.Size-SizeOf(QWord));
 end;
 
-function WriteContentToStream(const AStream: TStream; ContentStream: TMemoryStream): Integer;
+function WriteContentToStream(const AStream: TStream; ContentStream: TStream): Integer;
 begin
   //  ::DataSpace/Storage/MSCompressed/Content
   ContentStream.Position := 0;

+ 100 - 62
packages/extra/chm/chmwriter.pas

@@ -32,19 +32,16 @@ type
   //              becomes '/' and /home/user/helpstuff/subfolder/ > /subfolder/
   //  FileName :  /home/user/helpstuff/index.html > index.html
   //  Stream   :  the file opened with DataName should be written to this stream
-  
 
 
   { TChmWriter }
 
   TChmWriter = class(TObject)
+    FOnLastFile: TNotifyEvent;
   private
   
-  
     ForceExit: Boolean;
-  
-  
-  
+    
     FDefaultFont: String;
     FDefaultPage: String;
     FFullTextSearch: Boolean;
@@ -56,18 +53,20 @@ type
     FStringsStream: TMemoryStream;
     FContextStream: TMemoryStream; // the #IVB file
     FSection0: TMemoryStream;
-    FSection1: TMemoryStream; // Compressed Stream
-    FSection1Size: Int64;
+    FSection1: TStream; // Compressed Stream
+    FSection1Size: QWord;
     FSection1ResetTable: TMemoryStream; // has a list of frame positions NOT window positions
     FDirectoryListings: TStream;
-    FIndexStream: TStream;
     FOutStream: TStream;
     FFileNames: TStrings;
     FDestroyStream: Boolean;
+    FTempStream: TStream;
+    FPostStream: TStream;
     FTitle: String;
-    FTOCStream: TStream;
+    FHasTOC: Boolean;
+    FHasIndex: Boolean;
     FWindowSize: LongWord;
-    FReadCompressedSize: Int64; // Current Size of Uncompressed data that went in Section1 (compressed)
+    FReadCompressedSize: QWord; // Current Size of Uncompressed data that went in Section1 (compressed)
     // Linear order of file
     ITSFHeader: TITSFHeader;
     HeaderSection0Table: TITSFHeaderEntry;  // points to HeaderSection0
@@ -81,12 +80,11 @@ type
     // end linear header parts
     procedure InitITSFHeader;
     procedure InitHeaderSectionTable;
+    procedure SetTempRawStream(const AValue: TStream);
     procedure WriteHeader(Stream: TStream);
     procedure CreateDirectoryListings;
     procedure WriteDirectoryListings(Stream: TStream);
     procedure StartCompressingStream;
-    procedure WriteTOC;
-    procedure WriteIndex;
     procedure WriteSYSTEM;
     procedure WriteITBITS;
     procedure WriteSTRINGS;
@@ -106,19 +104,23 @@ type
     constructor Create(OutStream: TStream; FreeStreamOnDestroy: Boolean);
     destructor Destroy; override;
     procedure Execute;
+    procedure AppendTOC(AStream: TStream);
+    procedure AppendIndex(AStream: TStream);
+    procedure AppendSearchDB(AName: String; AStream: TStream);
     procedure AddStreamToArchive(AFileName, APath: String; AStream: TStream; Compress: Boolean = True);
+    procedure PostAddStreamToArchive(AFileName, APath: String; AStream: TStream; Compress: Boolean = True);
     procedure AddContext(AContext: DWord; ATopic: String);
     property WindowSize: LongWord read FWindowSize write FWindowSize default 2; // in $8000 blocks
     property FrameSize: LongWord read FFrameSize write FFrameSize default 1; // in $8000 blocks
     property FilesToCompress: TStrings read FFileNames;
     property OnGetFileData: TGetDataFunc read FOnGetFileData write FOnGetFileData;
+    property OnLastFile: TNotifyEvent read FOnLastFile write FOnLastFile;
     property OutStream: TStream read FOutStream;
     property Title: String read FTitle write FTitle;
     property FullTextSearch: Boolean read FFullTextSearch write FFullTextSearch;
     property DefaultFont: String read FDefaultFont write FDefaultFont;
     property DefaultPage: String read FDefaultPage write FDefaultPage;
-    property TOCStream: TStream read FTOCStream write FTOCStream;
-    property IndexStream: TStream read FIndexStream write FIndexStream;
+    property TempRawStream: TStream read FTempStream write SetTempRawStream;
     //property LocaleID: dword read ITSFHeader.LanguageID write ITSFHeader.LanguageID;
   end;
 
@@ -200,6 +202,18 @@ begin
   HeaderSuffix.Offset := NToLE(HeaderSuffix.Offset);
 end;
 
+procedure TChmWriter.SetTempRawStream(const AValue: TStream);
+begin
+  if (FCurrentStream.Size > 0) or (FSection1.Size > 0) then
+    raise Exception.Create('Cannot set the TempRawStream once data has been written to it!');
+  if AValue = nil then
+    raise Exception.Create('TempRawStream cannot be nil!');
+  if FCurrentStream = AValue then
+    exit;
+  FCurrentStream.Free;
+  FCurrentStream := AValue;
+end;
+
 procedure TChmWriter.WriteHeader(Stream: TStream);
 begin
   Stream.Write(ITSFHeader, SizeOf(TITSFHeader));
@@ -225,8 +239,7 @@ var
   FESize: Integer;
   FileName: String;
   FileNameSize: Integer;
-  LastListIndex,
-  LastIndexIndex: Integer;
+  LastListIndex: Integer;
   FirstListEntry: TFirstListEntry;
   ChunkIndex: Integer;
   ListHeader: TPMGListChunk;
@@ -235,7 +248,7 @@ const
   PMGI = 'PMGI';
   procedure UpdateLastListChunk;
   var
-    Tmp: Int64;
+    Tmp: QWord;
   begin
     if ChunkIndex < 1 then begin
       Exit;
@@ -311,8 +324,7 @@ begin
 
   IndexBlock := TPMGIDirectoryChunk.Create(SizeOf(TPMGIIndexChunk));
   ListingBlock := TDirectoryChunk.Create(SizeOf(TPMGListChunk));
-  
-  LastIndexIndex := -1;
+
   LastListIndex  := -1;
 
   // add files to a pmgl block until it is full.
@@ -373,24 +385,9 @@ begin
   //TMemoryStream(FDirectoryListings).SaveToFile('dirlistings.pmg');
 end;
 
-procedure TChmWriter.WriteIndex;
-var
-  Entry: TFileEntryRec;
-  TmpTitle: String;
-begin
-  if IndexStream = nil then Exit;
-
-  if Title <> '' then TmpTitle := Title
-  else TmpTitle := 'default';
-  
-  AddStreamToArchive(TmpTitle+'.hhk', '/', IndexStream);
-end;
-
 procedure TChmWriter.WriteSystem;
 var
   Entry: TFileEntryRec;
-  EntryCode,
-  EntryLength: Word;
   TmpStr: String;
   TmpTitle: String;
 const
@@ -449,6 +446,7 @@ begin
     FSection0.WriteWord(NToLE(Word(3)));
     FSection0.WriteWord(NToLE(Word(Length(FTitle)+1)));
     FSection0.Write(FTitle[1], Length(FTitle));
+    FSection0.WriteByte(0);
   end;
 
   // 16 Default Font
@@ -456,14 +454,15 @@ begin
     FSection0.WriteWord(NToLE(Word(16)));
     FSection0.WriteWord(NToLE(Word(Length(FDefaultFont)+1)));
     FSection0.Write(FDefaultFont[1], Length(FDefaultFont));
+    FSection0.WriteByte(0);
   end;
   
   // 6
   // unneeded. if output file is :  /somepath/OutFile.chm the value here is outfile(lowercase)
   
   // 0 Table of contents filename
-  if TOCStream <> nil then begin
-    TmpStr := TmpTitle+'.hhc';
+  if FHasTOC then begin
+    TmpStr := 'default.hhc';
     FSection0.WriteWord(0);
     FSection0.WriteWord(NToLE(Word(Length(TmpStr)+1)));
     FSection0.Write(TmpStr[1], Length(TmpStr));
@@ -471,8 +470,8 @@ begin
   end;
   // 1
   // hhk Index
-  if IndexStream <> nil then begin
-    TmpStr := TmpTitle+'.hhk';
+  if FHasIndex then begin
+    TmpStr := 'default.hhk';
     FSection0.WriteWord(NToLE(Word(1)));
     FSection0.WriteWord(NToLE(Word(Length(TmpStr)+1)));
     FSection0.Write(TmpStr[1], Length(TmpStr));
@@ -530,7 +529,7 @@ begin
   FSection0.Write(DISCLAIMER_STR, SizeOf(DISCLAIMER_STR));
   Entry.DecompressedSize := FSection0.Position - Entry.DecompressedOffset;
   Entry.Path := '/';
-  Entry.Name := '_::_README_::_'; //try to use a name that won't conflict with normal names
+  Entry.Name := '_#_README_#_'; //try to use a name that won't conflict with normal names
   FInternalFiles.AddEntry(Entry);
 end;
 
@@ -649,6 +648,19 @@ begin
       Inc(FReadCompressedSize,  FileEntry.DecompressedSize);
       FCurrentStream.Position := 0;
     end;
+
+    // this is intended for programs to add perhaps a file
+    // after all the other files have been added.
+    if (AtEndOfData)
+    and (FCurrentStream <> FPostStream) then
+    begin
+      if Assigned(FOnLastFile) then
+        FOnLastFile(Self);
+      FCurrentStream.Free;
+      FCurrentStream := FPostStream;
+      FCurrentStream.Position := 0;
+      Inc(FReadCompressedSize, FCurrentStream.Size);
+    end;
   end;
 end;
 
@@ -661,11 +673,11 @@ function TChmWriter.WriteCompressedData(Count: Longint; Buffer: Pointer): LongIn
 begin
   // we allocate a MB at a time to limit memory reallocation since this
   // writes usually 2 bytes at a time
-  if FSection1.Position >= FSection1.Size-1 then begin
+  if (FSection1 is TMemoryStream) and (FSection1.Position >= FSection1.Size-1) then begin
     FSection1.Size := FSection1.Size+$100000;
   end;
-  Inc(FSection1Size, FSection1.Write(Buffer^, Count));
-
+  Result := FSection1.Write(Buffer^, Count);
+  Inc(FSection1Size, Result);
 end;
 
 procedure _MarkFrame(arg: pointer; UncompressedTotal, CompressedTotal: LongWord); cdecl;
@@ -680,7 +692,7 @@ procedure TChmWriter.MarkFrame(UnCompressedTotal, CompressedTotal: LongWord);
   end;
   procedure IncEntryCount;
   var
-    OldPos: Int64;
+    OldPos: QWord;
     Value: DWord;
   begin
     OldPos := FSection1ResetTable.Position;
@@ -692,8 +704,7 @@ procedure TChmWriter.MarkFrame(UnCompressedTotal, CompressedTotal: LongWord);
   end;
   procedure UpdateTotalSizes;
   var
-    OldPos: Int64;
-    Value: DWord;
+    OldPos: QWord;
   begin
     OldPos := FSection1ResetTable.Position;
     FSection1ResetTable.Position := $10;
@@ -701,8 +712,6 @@ procedure TChmWriter.MarkFrame(UnCompressedTotal, CompressedTotal: LongWord);
     WriteQWord(CompressedTotal);
     FSection1ResetTable.Position := OldPos;
   end;
-var
-  Tmp : QWord;
 begin
   if FSection1ResetTable.Size = 0 then begin
     // Write the header
@@ -733,6 +742,7 @@ begin
   FSection1 := TMemoryStream.Create;
   FSection1ResetTable := TMemoryStream.Create;
   FDirectoryListings := TMemoryStream.Create;
+  FPostStream := TMemoryStream.Create;;
   FDestroyStream := FreeStreamOnDestroy;
   FFileNames := TStringList.Create;
 end;
@@ -760,8 +770,6 @@ begin
 
   // write any internal files to FCurrentStream that we want in the compressed section
   WriteIVB;
-  WriteTOC;
-  WriteIndex;
   WriteSTRINGS;
   
   // written to Section0 (uncompressed)
@@ -798,10 +806,27 @@ begin
   WriteSection1; // writes section 1 to FOutStream
 end;
 
+procedure TChmWriter.AppendTOC(AStream: TStream);
+begin
+  FHasTOC := True;
+  PostAddStreamToArchive('default.hhc', '/', AStream, True);
+end;
+
+procedure TChmWriter.AppendIndex(AStream: TStream);
+begin
+  FHasIndex := True;
+  PostAddStreamToArchive('default.hhk', '/', AStream, True);
+end;
+
+procedure TChmWriter.AppendSearchDB(AName: String; AStream: TStream);
+begin
+  PostAddStreamToArchive(AName, '/', AStream);
+end;
+
 
 // this procedure is used to manually add files to compress to an internal stream that is
 // processed before FileToCompress is called. Files added this way should not be
-// in the FilesToCompress property.
+// duplicated in the FilesToCompress property.
 procedure TChmWriter.AddStreamToArchive(AFileName, APath: String; AStream: TStream; Compress: Boolean = True);
 var
   TargetStream: TStream;
@@ -823,6 +848,31 @@ begin
   TargetStream.CopyFrom(AStream, AStream.Size);
 end;
 
+procedure TChmWriter.PostAddStreamToArchive(AFileName, APath: String;
+  AStream: TStream; Compress: Boolean);
+var
+  TargetStream: TStream;
+  Entry: TFileEntryRec;
+begin
+  if AStream = nil then Exit;
+  if Compress then
+    TargetStream := FPostStream
+  else
+    TargetStream := FSection0;
+
+  Entry.Name := AFileName;
+  Entry.Path := APath;
+  Entry.Compressed :=  Compress;
+  if not Compress then
+    Entry.DecompressedOffset := TargetStream.Position
+  else
+    Entry.DecompressedOffset := FReadCompressedSize + TargetStream.Position;
+  Entry.DecompressedSize := AStream.Size;
+  FInternalFiles.AddEntry(Entry);
+  AStream.Position := 0;
+  TargetStream.CopyFrom(AStream, AStream.Size);
+end;
+
 procedure TChmWriter.AddContext(AContext: DWord; ATopic: String);
 var
   Offset: DWord;
@@ -858,16 +908,4 @@ begin
   lzx_finish(LZXdata, nil);
 end;
 
-procedure TChmWriter.WriteTOC;
-var
-  TmpTitle: String;
-begin
-  if TOCStream = nil then Exit;
-  if Title <> '' then TmpTitle := Title
-  else TmpTitle := 'default';
-
-  AddStreamToArchive(TmpTitle+'.hhc', '/', TOCStream);
-end;
-
-
 end.

+ 9 - 3
packages/extra/opengl/gl.pp

@@ -1573,6 +1573,11 @@ procedure FreeOpenGL;
 
 implementation
 
+{$if defined(cpui386) or defined(cpux86_64)}
+uses
+  math;
+{$endif}
+
 {$ifdef windows}
 function WinChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer; extdecl; external 'gdi32' name 'ChoosePixelFormat';
 {$endif}
@@ -2315,9 +2320,10 @@ initialization
 
   { according to bug 7570, this is necessary on all x86 platforms,
     maybe we've to fix the sse control word as well }
-  {$ifdef x86}
-  Set8087CW($133F);
-  {$endif x86}
+  { Yes, at least for darwin/x86_64 (JM) }
+  {$if defined(cpui386) or defined(cpux86_64)}
+  SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,exOverflow, exUnderflow, exPrecision]);
+  {$endif}
 
   {$IFDEF Windows}
   LoadOpenGL('opengl32.dll');

+ 16 - 16
packages/extra/opengl/glext.pp

@@ -57,11 +57,11 @@ type
   TGLhandleARB = GLhandleARB;
   PGLhandleARB = ^GLhandleARB;
 
-  GLintptr = Integer;
+  GLintptr = PtrInt;
   TGLintptr = GLintptr;
   PGLintptr = ^GLintptr;
 
-  GLsizeiptr = Integer;
+  GLsizeiptr = PtrInt;
   TGLsizeiptr = GLsizeiptr;
   PGLsizeiptr = ^GLsizeiptr;
 
@@ -1011,10 +1011,10 @@ const
   GL_FOG_COORDINATE_ARRAY_POINTER_EXT = $8456;
   GL_FOG_COORDINATE_ARRAY_EXT = $8457;
 var
-  glFogCoordfEXfloat: procedure(coord: GLfloat); extdecl;
-  glFogCoorddEXdouble: procedure(coord: GLdouble); extdecl;
-  glFogCoordfvEXfloat: procedure(coord: GLfloat); extdecl;
-  glFogCoorddvEXdouble: procedure(coord: GLdouble); extdecl;
+  glFogCoordfEXT: procedure(coord: GLfloat); extdecl;
+  glFogCoorddEXT: procedure(coord: GLdouble); extdecl;
+  glFogCoordfvEXT: procedure(coord: PGLfloat); extdecl;
+  glFogCoorddvEXT: procedure(coord: PGLdouble); extdecl;
   glFogCoordPointerEXT: procedure(_type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
 
 function Load_GL_EXT_fog_coord: Boolean;
@@ -4269,8 +4269,8 @@ begin
   begin
     where := StrPos(start, PChar(extension));
     if where = nil then Break;
-    terminator := Pointer(Integer(where) + Length(extension));
-    if (where = start) or (PChar(Integer(where) - 1)^ = ' ') then
+    terminator := Pointer(PtrUInt(where) + Length(extension));
+    if (where = start) or (PChar(PtrUInt(where) - 1)^ = ' ') then
     begin
       if (terminator^ = ' ') or (terminator^ = #0) then
       begin
@@ -5311,14 +5311,14 @@ begin
 
   if glext_ExtensionSupported('GL_EXT_fog_coord', extstring) then
   begin
-    glFogCoordfEXfloat := wglGetProcAddress('glFogCoordfEXfloat');
-    if not Assigned(glFogCoordfEXfloat) then Exit;
-    glFogCoorddEXdouble := wglGetProcAddress('glFogCoorddEXdouble');
-    if not Assigned(glFogCoorddEXdouble) then Exit;
-    glFogCoordfvEXfloat := wglGetProcAddress('glFogCoordfvEXfloat');
-    if not Assigned(glFogCoordfvEXfloat) then Exit;
-    glFogCoorddvEXdouble := wglGetProcAddress('glFogCoorddvEXdouble');
-    if not Assigned(glFogCoorddvEXdouble) then Exit;
+    glFogCoordfEXT := wglGetProcAddress('glFogCoordfEXT');
+    if not Assigned(glFogCoordfEXT) then Exit;
+    glFogCoorddEXT := wglGetProcAddress('glFogCoorddEXT');
+    if not Assigned(glFogCoorddEXT) then Exit;
+    glFogCoordfvEXT := wglGetProcAddress('glFogCoordfvEXT');
+    if not Assigned(glFogCoordfvEXT) then Exit;
+    glFogCoorddvEXT := wglGetProcAddress('glFogCoorddvEXT');
+    if not Assigned(glFogCoorddvEXT) then Exit;
     glFogCoordPointerEXT := wglGetProcAddress('glFogCoordPointerEXT');
     if not Assigned(glFogCoordPointerEXT) then Exit;
     Result := TRUE;

+ 8 - 8
packages/extra/opengl/glut.pp

@@ -326,7 +326,7 @@ const
 {$IFDEF GLUT_EXCLUSIVE_FPUMODE}
 var
 OLD_glutInit:procedure(argcp: PInteger; argv: PPChar); extdecl;
-OLD_glutInitDisplayMode:procedure(mode: Word); extdecl;
+OLD_glutInitDisplayMode:procedure(mode: Cardinal); extdecl;
 OLD_glutInitDisplayString:procedure(const str: PChar); extdecl;
 OLD_glutInitWindowPosition:procedure(x, y: Integer); extdecl;
 OLD_glutInitWindowSize:procedure(width, height: Integer); extdecl;
@@ -378,7 +378,7 @@ OLD_glutPassiveMotionFunc:procedure(f: TGlut2IntCallback); extdecl;
 OLD_glutEntryFunc:procedure(f: TGlut1IntCallback); extdecl;
 OLD_glutVisibilityFunc:procedure(f: TGlut1IntCallback); extdecl;
 OLD_glutIdleFunc:procedure(f: TGlutVoidCallback); extdecl;
-OLD_glutTimerFunc:procedure(millis: Word; f: TGlut1IntCallback; value: Integer); extdecl;
+OLD_glutTimerFunc:procedure(millis: Cardinal; f: TGlut1IntCallback; value: Integer); extdecl;
 OLD_glutMenuStateFunc:procedure(f: TGlut1IntCallback); extdecl;
 OLD_glutSpecialFunc:procedure(f: TGlut3IntCallback); extdecl;
 OLD_glutSpaceballMotionFunc:procedure(f: TGlut3IntCallback); extdecl;
@@ -441,7 +441,7 @@ OLD_glutLeaveGameMode:procedure; extdecl;
 OLD_glutGameModeGet:function(mode : GLenum): integer; extdecl;
 
 procedure glutInit(argcp: PInteger; argv: PPChar); mode_inline;
-procedure glutInitDisplayMode(mode: Word); mode_inline;
+procedure glutInitDisplayMode(mode: Cardinal); mode_inline;
 procedure glutInitDisplayString(const str: PChar); mode_inline;
 procedure glutInitWindowPosition(x, y: Integer); mode_inline;
 procedure glutInitWindowSize(width, height: Integer); mode_inline;
@@ -493,7 +493,7 @@ procedure glutPassiveMotionFunc(f: TGlut2IntCallback); mode_inline;
 procedure glutEntryFunc(f: TGlut1IntCallback); mode_inline;
 procedure glutVisibilityFunc(f: TGlut1IntCallback); mode_inline;
 procedure glutIdleFunc(f: TGlutVoidCallback); mode_inline;
-procedure glutTimerFunc(millis: Word; f: TGlut1IntCallback; value: Integer); mode_inline;
+procedure glutTimerFunc(millis: Cardinal; f: TGlut1IntCallback; value: Integer); mode_inline;
 procedure glutMenuStateFunc(f: TGlut1IntCallback); mode_inline;
 procedure glutSpecialFunc(f: TGlut3IntCallback); mode_inline;
 procedure glutSpaceballMotionFunc(f: TGlut3IntCallback); mode_inline;
@@ -560,7 +560,7 @@ function glutGameModeGet(mode : GLenum): integer; mode_inline;
 var
 // GLUT initialization sub-API.
   glutInit: procedure(argcp: PInteger; argv: PPChar); extdecl;
-  glutInitDisplayMode: procedure(mode: Word); extdecl;
+  glutInitDisplayMode: procedure(mode: Cardinal); extdecl;
   glutInitDisplayString: procedure(const str: PChar); extdecl;
   glutInitWindowPosition: procedure(x, y: Integer); extdecl;
   glutInitWindowSize: procedure(width, height: Integer); extdecl;
@@ -620,7 +620,7 @@ var
   glutEntryFunc: procedure(f: TGlut1IntCallback); extdecl;
   glutVisibilityFunc: procedure(f: TGlut1IntCallback); extdecl;
   glutIdleFunc: procedure(f: TGlutVoidCallback); extdecl;
-  glutTimerFunc: procedure(millis: Word; f: TGlut1IntCallback; value: Integer); extdecl;
+  glutTimerFunc: procedure(millis: Cardinal; f: TGlut1IntCallback; value: Integer); extdecl;
   glutMenuStateFunc: procedure(f: TGlut1IntCallback); extdecl;
   glutSpecialFunc: procedure(f: TGlut3IntCallback); extdecl;
   glutSpaceballMotionFunc: procedure(f: TGlut3IntCallback); extdecl;
@@ -1285,7 +1285,7 @@ begin
   switch_to_FPC_fpumode;
 end;
 
-procedure glutInitDisplayMode(mode: Word);
+procedure glutInitDisplayMode(mode: Cardinal);
 begin
   switch_to_glut_fpumode;
   OLD_glutInitDisplayMode(mode);
@@ -1649,7 +1649,7 @@ begin
   switch_to_FPC_fpumode;
 end;
 
-procedure glutTimerFunc(millis: Word; f: TGlut1IntCallback; value: Integer);
+procedure glutTimerFunc(millis: Cardinal; f: TGlut1IntCallback; value: Integer);
 begin
   switch_to_glut_fpumode;
   OLD_glutTimerFunc(millis,f,value);

+ 1 - 1
packages/extra/uuid/libuuid.pp

@@ -10,7 +10,7 @@ Var
   LibUUIDName : String = 'libuuid.so.1';
   ProcName    : String = 'uuid_generate_time';
   
-function CCreateGUID(out Guid: TGUID): Integer;
+function CCreateGUID(out Guid: TGUID): HResult;
 
 Implementation
 

+ 7 - 1
packages/fcl-base/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/13]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/15]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
@@ -560,6 +560,12 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_RSTS+=cachecls custapp cgiapp eventlog registry streamcoll inicol
 endif
+ifeq ($(FULL_TARGET),i386-win32)
+override INSTALL_FILES+=src/win/fclel.res
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override INSTALL_FILES+=src/win/fclel.res
+endif
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)
 override COMPILER_OPTIONS+=-S2h

+ 2 - 0
packages/fcl-base/Makefile.fpc

@@ -49,6 +49,8 @@ sourcedir=src/$(OS_TARGET) src/inc
 
 [install]
 fpcpackage=y
+files_win32=src/win/fclel.res
+files_win64=src/win/fclel.res
 
 [default]
 fpcdir=../..

+ 40 - 9
packages/fcl-base/src/inc/cgiapp.pp

@@ -143,6 +143,21 @@ Implementation
 
 uses
   iostream;
+  
+Type
+  TFormFile = Class(TObject)
+  Private
+    FFileName : String;
+  Public  
+    Constructor Create(Const AFileName : String);
+    Property FileName : String Read FFileName Write FFileName;
+  end;  
+  
+Constructor  TFormFile.Create(Const AFileName : String);
+
+begin
+  FFileName:=AFileName;
+end;
 
 {$ifdef cgidebug}
 Var
@@ -185,6 +200,9 @@ end;
 
 Destructor TCgiApplication.Destroy;
 
+Var
+  i : Integer;
+
 begin
   DeleteFormFiles;
   FFormFiles.Free;
@@ -226,15 +244,17 @@ Procedure TCgiApplication.DeleteFormFiles;
 Var
   I,P : Integer;
   FN : String;
-
+  FF : TFormFile;
 begin
   For I:=0 to FFormFiles.Count-1 do
     begin
-    FN:=FFormFiles[i];
-    P:=Pos('=',FN);
-    Delete(FN,1,P);
-    If FileExists(FN) then
-      DeleteFile(FN);
+    FF:=TFormFile(FFormFiles.Objects[i]);
+    If Assigned(FF) then
+      begin
+      If FileExists(FF.FileName) then
+        DeleteFile(FF.FileName);
+      FF.Free;
+      end;  
     end;
 end;
 
@@ -612,7 +632,7 @@ begin
         begin
         Value:=FI.FileName;
         FF:=GetTempCGIFileName;
-        FFormFiles.Add(Key+'='+FF);
+        FFormFiles.AddObject(Key,TFormFile.Create(FF));
         F:=TFileStream.Create(FF,fmCreate);
         Try
           if Length(FI.Data)>0 then
@@ -865,13 +885,24 @@ end;
 Function TCGIApplication.VariableIsUploadedFile(Const VarName : String) : boolean;
 
 begin
-  Result:=FFormFiles.IndexOfName(VarName)<>-1;
+  Result:=FFormFiles.IndexOf(VarName)<>-1;
 end;
 
 Function TCGIApplication.UploadedFileName(Const VarName : String) : String;
 
+Var
+  FF : TFormFile;
+  i : Integer;
+ 
 begin
-  Result:=FFormFiles.Values[VarName];
+  Result:='';
+  I:=FFormFiles.IndexOf(VarName);
+  If (I<>-1) then
+    begin
+    FF:=TFormFile(FFormFiles.Objects[i]);
+    If Assigned(FF) then
+      Result:=FF.FileName;
+    end;  
 end;
 
 {$ifdef cgidebug}

+ 7 - 0
packages/fcl-json/src/jsonparser.pp

@@ -41,6 +41,7 @@ Type
     function Parse: TJSONData;
     Constructor Create(Source : TStream); overload;
     Constructor Create(Source : TJSONStringType); overload;
+    destructor Destroy();override;
   end;
   
   EJSONScanner = Class(Exception);
@@ -245,5 +246,11 @@ begin
   FScanner:=TJSONScanner.Create(Source);
 end;
 
+destructor TJSONParser.Destroy();
+begin
+  FreeAndNil(FScanner);
+  inherited Destroy();
+end;
+
 end.
 

+ 2 - 0
packages/fcl-passrc/src/pparser.pp

@@ -2191,6 +2191,8 @@ var
         'F':
           if s[3] = 'i' then
             FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
+        'I':
+          FileResolver.AddIncludePath(Copy(s, 3, Length(s)));    
         'S':
           if s[3]='d' then
             begin

+ 8 - 9
packages/fcl-process/fpmake.pp

@@ -12,28 +12,27 @@ begin
     begin
 {$endif ALLPACKAGES}
 
-    P:=StartPackage('fcl-process');
+    P:=AddPackage('fcl-process');
 {$ifdef ALLPACKAGES}
-    Directory:='fcl-process';
+    P.Directory:='fcl-process';
 {$endif ALLPACKAGES}
-    Version:='2.0.0';
+    P.Version:='2.0.0';
     P.SourcePath.Add('src');
     P.IncludePath.Add('src/unix',AllUnixOSes);
     P.IncludePath.Add('src/win',AllWindowsOSes);
     P.IncludePath.Add('src/$(OS)',AllOSes-AllWindowsOSes-AllUnixOSes);
-    T:=Targets.AddUnit('pipes.pp');
+    T:=P.Targets.AddUnit('pipes.pp');
       T.Dependencies.AddInclude('pipes.inc');
-    T:=Targets.AddUnit('process.pp');
+    T:=P.Targets.AddUnit('process.pp');
       T.Dependencies.AddInclude('process.inc');
       T.ResourceStrings:=True;
-    T:=Targets.AddUnit('simpleipc.pp');
+    T:=P.Targets.AddUnit('simpleipc.pp');
       T.Dependencies.AddInclude('simpleipc.inc');
       T.ResourceStrings:=True;
-    T:=Targets.AddUnit('dbugmsg.pp');
+    T:=P.Targets.AddUnit('dbugmsg.pp');
       T.ResourceStrings:=True;
-    T:=Targets.AddUnit('dbugintf.pp');
+    T:=P.Targets.AddUnit('dbugintf.pp');
       T.ResourceStrings:=True;
-    EndPackage;
 
 {$ifndef ALLPACKAGES}
     Run;

+ 17 - 2
packages/fcl-xml/src/xmlstreaming.pp

@@ -52,19 +52,20 @@ type
     procedure EndList; override;
     procedure BeginProperty(const PropName: String); override;
     procedure EndProperty; override;
-
+    procedure Write(const Buffer; Count: LongInt); override;
     procedure WriteBinary(const Buffer; Count: Longint); override;
     procedure WriteBoolean(Value: Boolean); override;
     // procedure WriteChar(Value: Char);
     procedure WriteFloat(const Value: Extended); override;
     procedure WriteSingle(const Value: Single); override;
-    {!!!: procedure WriteCurrency(const Value: Currency); override;}
+    procedure WriteCurrency(const Value: Currency); override;
     procedure WriteDate(const Value: TDateTime); override;
     procedure WriteIdent(const Ident: string); override;
     procedure WriteInteger(Value: Int64); override;
     procedure WriteMethodName(const Name: String); override;
     procedure WriteSet(Value: LongInt; SetType: Pointer); override;
     procedure WriteString(const Value: String); override;
+    procedure WriteWideString(const Value: WideString); override;
   end;
 
 
@@ -188,6 +189,10 @@ procedure TXMLObjectWriter.WriteBinary(const Buffer; Count: Longint);
 begin
   WriteLn('WriteBinary (', Count, ' Bytes)');
 end;
+procedure TXMLObjectWriter.Write(const Buffer; Count: Longint);
+begin
+  WriteLn('WriteBinary (', Count, ' Bytes)');
+end;
 
 procedure TXMLObjectWriter.WriteBoolean(Value: Boolean);
 begin
@@ -214,6 +219,11 @@ begin
   GetPropertyElement('ident')['value'] := Ident;
 end;
 
+procedure TXMLObjectWriter.WriteCurrency(const Value : Currency);
+begin
+  Writeln('WriteCurrency',Value);
+end;
+
 procedure TXMLObjectWriter.WriteInteger(Value: Int64);
 begin
   GetPropertyElement('integer')['value'] := IntToStr(Value);
@@ -234,5 +244,10 @@ begin
   GetPropertyElement('string')['value'] := Value;
 end;
 
+procedure TXMLObjectWriter.WriteWideString(const Value: WideString);
+begin
+  GetPropertyElement('widestring')['value'] := Value;
+end;
+
 
 end.

+ 8 - 10
packages/fpmkunit/fpmake.pp

@@ -5,23 +5,21 @@ program fpmake;
 uses fpmkunit;
 
 Var
-  T : TTarget;
-
+  P : TPackage;
 begin
   With Installer do
     begin
 {$endif ALLPACKAGES}
 
-    StartPackage('fpmkunit');
+    P:=AddPackage('fpmkunit');
 {$ifdef ALLPACKAGES}
-    Directory:='fpmkunit';
+    P.Directory:='fpmkunit';
 {$endif ALLPACKAGES}
-    AddDependency('paszlib');
-    AddDependency('fcl-process');
-    Version:='2.2.0';
-    Description:='Free Pascal Make Tool';
-    T:=Targets.AddUnit('src/fpmkunit.pp');
-    EndPackage;
+    P.Version:='2.2.0';
+    P.Description:='Free Pascal Make Tool';
+    P.Dependencies.Add('paszlib');
+    P.Dependencies.Add('fcl-process');
+    P.Targets.AddUnit('src/fpmkunit.pp');
 
 {$ifndef ALLPACKAGES}
     Run;

文件差異過大導致無法顯示
+ 363 - 280
packages/fpmkunit/src/fpmkunit.pp


+ 0 - 15
packages/hash/fpmake.inc

@@ -1,15 +0,0 @@
-    StartPackage('hash');
-    Version:='2.0.0';
-    T:=Targets.AddUnit('md5');
-      T.Directory:='src';
-    T:=Targets.AddUnit('crc');
-      T.Directory:='src';
-    T:=Targets.AddUnit('ntlm');
-      T.Directory:='src';
-    T:=Targets.AddUnit('uuid');
-      T.Directory:='src';
-    T:=Targets.AddUnit('unixcrypt');
-    T:=Targets.AddExampleunit('mdtest');
-      T.Directory:='tests';
-    EndPackage;
-

+ 10 - 11
packages/hash/fpmake.pp

@@ -5,26 +5,25 @@ program fpmake;
 uses fpmkunit;
 
 Var
+  P : TPackage;
   T : TTarget;
-
 begin
   With Installer do
     begin
 {$endif ALLPACKAGES}
 
-    StartPackage('hash');
+    P:=AddPackage('hash');
 {$ifdef ALLPACKAGES}
-    Directory:='hash';
+    P.Directory:='hash';
 {$endif ALLPACKAGES}
-    Version:='2.0.0';
-    T:=Targets.AddUnit('src/md5.pp');
-    T:=Targets.AddUnit('src/crc.pas');
-    T:=Targets.AddUnit('src/ntlm.pas');
-    T:=Targets.AddUnit('src/uuid.pas');
-    T:=Targets.AddUnit('src/unixcrypt.pas');
+    P.Version:='2.0.0';
+    T:=P.Targets.AddUnit('src/md5.pp');
+    T:=P.Targets.AddUnit('src/crc.pas');
+    T:=P.Targets.AddUnit('src/ntlm.pas');
+    T:=P.Targets.AddUnit('src/uuid.pas');
+    T:=P.Targets.AddUnit('src/unixcrypt.pas');
       T.OSes:=[Linux];
-    T:=Targets.AddExampleunit('tests/mdtest.pas');
-    EndPackage;
+    T:=P.Targets.AddExampleunit('examples/mdtest.pas');
 
 {$ifndef ALLPACKAGES}
     Run;

+ 0 - 26
packages/paszlib/fpmake.inc

@@ -1,26 +0,0 @@
-    StartPackage('paszlib');
-    {$IF defined(ALLPACKAGES)}
-    Directory:='base/paszlib';
-    {$ELSEIF defined(BASEPACKAGES)}
-    Directory:='paszlib';
-    {$ENDIF}
-    Version:={$i %FPCVERSION%};
-    T:=Targets.AddUnit('paszlib');
-    T:=Targets.AddUnit('adler');
-    T:=Targets.AddUnit('crc');
-    T:=Targets.AddUnit('gzio');
-    T:=Targets.AddUnit('infblock');
-    T:=Targets.AddUnit('infcodes');
-    T:=Targets.AddUnit('inffast');
-    T:=Targets.AddUnit('inftrees');
-    T:=Targets.AddUnit('infutil');
-    T:=Targets.AddUnit('trees');
-    T:=Targets.AddUnit('zcompres');
-    T:=Targets.AddUnit('zdeflate');
-    T:=Targets.AddUnit('zinflate');
-    T:=Targets.AddUnit('zbase');
-    T:=Targets.AddUnit('zuncompr');
-    T:=Targets.AddUnit('zutil');
-    T:=Targets.AddExampleunit('example');
-    T:=Targets.AddExampleunit('minigzip');
-    EndPackage;

+ 11 - 51
packages/paszlib/fpmake.pp

@@ -5,68 +5,28 @@ program fpmake;
 uses fpmkunit;
 
 Var
-  T : TTarget;
   P : TPackage;
+  T : TTarget;
 begin
   With Installer do
     begin
 {$endif ALLPACKAGES}
 
-    P:=StartPackage('paszlib');
+    P:=AddPackage('hash');
 {$ifdef ALLPACKAGES}
-    P.Directory:='paszlib';
+    P.Directory:='hash';
 {$endif ALLPACKAGES}
-    P.Version:='2.2.0';
-    P.Dependencies.Add('hash');
-    P.SourcePath.Add('src');
-    P.IncludePath.Add('src');
-    T:=Targets.AddUnit('paszlib.pas');
-      T.Dependencies.AddUnit('adler');
-      T.Dependencies.AddUnit('gzio');
-      T.Dependencies.AddUnit('infblock');
-      T.Dependencies.AddUnit('infcodes');
-      T.Dependencies.AddUnit('inffast');
-      T.Dependencies.AddUnit('inftrees');
-      T.Dependencies.AddUnit('infutil');
-      T.Dependencies.AddUnit('trees');
-      T.Dependencies.AddUnit('zbase');
-      T.Dependencies.AddUnit('zcompres');
-      T.Dependencies.AddUnit('zdeflate');
-      T.Dependencies.AddUnit('zinflate');
-      T.Dependencies.AddUnit('zuncompr');
-    T:=Targets.AddUnit('zip.pas');
-      T.Dependencies.AddUnit('paszlib');
-      T.Dependencies.AddUnit('ziputils');
-    T:=Targets.AddUnit('unzip.pas');
-      T.Dependencies.AddUnit('paszlib');
-      T.Dependencies.AddUnit('ziputils');
-    T:=Targets.AddUnit('zipper.pp');
-      T.Dependencies.AddUnit('paszlib');
-    T:=Targets.AddImplicitUnit('adler.pas');
-      T.Dependencies.AddInclude('zconf.inc');
-    T:=Targets.AddImplicitUnit('gzio.pas');
-    T:=Targets.AddImplicitUnit('infblock.pas');
-    T:=Targets.AddImplicitUnit('infcodes.pas');
-    T:=Targets.AddImplicitUnit('inffast.pas');
-    T:=Targets.AddImplicitUnit('inftrees.pas');
-    T:=Targets.AddImplicitUnit('infutil.pas');
-    T:=Targets.AddImplicitUnit('trees.pas');
-    T:=Targets.AddImplicitUnit('zbase.pas');
-    T:=Targets.AddImplicitUnit('zcompres.pas');
-    T:=Targets.AddImplicitUnit('zdeflate.pas');
-    T:=Targets.AddImplicitUnit('zinflate.pas');
-    T:=Targets.AddImplicitUnit('zuncompr.pas');
-    T:=Targets.AddImplicitUnit('ziputils.pas');
-    T:=Targets.AddImplicitUnit('zstream.pp');
-    T:=Targets.AddExampleProgram('tests/example.pas');
-    T:=Targets.AddExampleProgram('tests/minigzip.pas');
-    T:=Targets.AddExampleProgram('tests/miniunz.pas');
-    T:=Targets.AddExampleProgram('tests/minizip.pas');
-    EndPackage;
+    P.Version:='2.0.0';
+    T:=P.Targets.AddUnit('src/md5.pp');
+    T:=P.Targets.AddUnit('src/crc.pas');
+    T:=P.Targets.AddUnit('src/ntlm.pas');
+    T:=P.Targets.AddUnit('src/uuid.pas');
+    T:=P.Targets.AddUnit('src/unixcrypt.pas');
+      T.OSes:=[Linux];
+    T:=P.Targets.AddExampleunit('examples/mdtest.pas');
 
 {$ifndef ALLPACKAGES}
     Run;
     end;
 end.
 {$endif ALLPACKAGES}
-

+ 166 - 268
utils/fpdoc/Makefile

@@ -1,11 +1,12 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/10/21]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/15]
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx
 LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
 FORCE:
 .PHONY: FORCE
 override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
@@ -56,6 +57,11 @@ else
 SRCBATCHEXT=.bat
 endif
 endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
 ifdef inUnix
 PATHSEP=/
 else
@@ -102,7 +108,11 @@ ifndef FPC
 FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
 ifneq ($(FPCPROG),)
 FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
 FPC:=$(shell $(FPCPROG) -PB)
+endif
 ifneq ($(findstring Error,$(FPC)),)
 override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
 endif
@@ -352,6 +362,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override TARGET_PROGRAMS+=fpdoc makeskel unitdiff
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_PROGRAMS+=fpdoc makeskel unitdiff
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override TARGET_PROGRAMS+=fpdoc makeskel unitdiff
 endif
@@ -508,6 +521,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override CLEAN_UNITS+=dglobals dwriter dw_xml sh_pas dw_html dw_latex dw_ipf dw_txt dw_man
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override CLEAN_UNITS+=dglobals dwriter dw_xml sh_pas dw_html dw_latex dw_ipf dw_txt dw_man
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override CLEAN_UNITS+=dglobals dwriter dw_xml sh_pas dw_html dw_latex dw_ipf dw_txt dw_man
 endif
@@ -664,6 +680,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override CLEAN_FILES+=dwriter.rst fpdoc.rst dglobals.rst makeskel.rst
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override CLEAN_FILES+=dwriter.rst fpdoc.rst dglobals.rst makeskel.rst
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override CLEAN_FILES+=dwriter.rst fpdoc.rst dglobals.rst makeskel.rst
 endif
@@ -821,6 +840,9 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 override COMPILER_OPTIONS+=-S2h
 endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 override COMPILER_OPTIONS+=-S2h
 endif
@@ -1604,514 +1626,434 @@ else
 TAROPT=vz
 TAREXT=.tar.gz
 endif
-override REQUIRE_PACKAGES=rtl fcl-xml fcl-passrc
+override REQUIRE_PACKAGES=rtl fcl-xml fcl-passrc chm
 ifeq ($(FULL_TARGET),i386-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_WINUNITS=1
+REQUIRE_PACKAGES_WINUNITS-BASE=1
+REQUIRE_PACKAGES_WINUNITS-JEDI=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netware)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_NETDB=1
+REQUIRE_PACKAGES_FCL-BASE=1
+REQUIRE_PACKAGES_FCL-XML=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_WINUNITS=1
+REQUIRE_PACKAGES_WINUNITS-BASE=1
+REQUIRE_PACKAGES_WINUNITS-JEDI=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-wince)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-gba)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-nds)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
-REQUIRE_PACKAGES_LIBASYNC=1
-REQUIRE_PACKAGES_PTHREADS=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 REQUIRE_PACKAGES_RTL=1
 REQUIRE_PACKAGES_NETDB=1
-REQUIRE_PACKAGES_HASH=1
-REQUIRE_PACKAGES_PASZLIB=1
 REQUIRE_PACKAGES_FCL-BASE=1
 REQUIRE_PACKAGES_FCL-XML=1
 REQUIRE_PACKAGES_FCL-PASSRC=1
+REQUIRE_PACKAGES_CHM=1
 endif
 ifdef REQUIRE_PACKAGES_RTL
 PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
@@ -2165,110 +2107,6 @@ ifdef UNITDIR_NETDB
 override COMPILER_UNITDIR+=$(UNITDIR_NETDB)
 endif
 endif
-ifdef REQUIRE_PACKAGES_HASH
-PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_HASH),)
-ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
-UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
-else
-UNITDIR_HASH=$(PACKAGEDIR_HASH)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_HASH)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_HASH=
-UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_HASH),)
-UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
-else
-UNITDIR_HASH=
-endif
-endif
-ifdef UNITDIR_HASH
-override COMPILER_UNITDIR+=$(UNITDIR_HASH)
-endif
-endif
-ifdef REQUIRE_PACKAGES_PASZLIB
-PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_PASZLIB),)
-ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
-UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
-else
-UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_PASZLIB=
-UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_PASZLIB),)
-UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
-else
-UNITDIR_PASZLIB=
-endif
-endif
-ifdef UNITDIR_PASZLIB
-override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
-endif
-endif
-ifdef REQUIRE_PACKAGES_LIBASYNC
-PACKAGEDIR_LIBASYNC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /libasync/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_LIBASYNC),)
-ifneq ($(wildcard $(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)),)
-UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)/units/$(TARGETSUFFIX)
-else
-UNITDIR_LIBASYNC=$(PACKAGEDIR_LIBASYNC)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_LIBASYNC)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_LIBASYNC) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_LIBASYNC)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_LIBASYNC=
-UNITDIR_LIBASYNC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /libasync/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_LIBASYNC),)
-UNITDIR_LIBASYNC:=$(firstword $(UNITDIR_LIBASYNC))
-else
-UNITDIR_LIBASYNC=
-endif
-endif
-ifdef UNITDIR_LIBASYNC
-override COMPILER_UNITDIR+=$(UNITDIR_LIBASYNC)
-endif
-endif
-ifdef REQUIRE_PACKAGES_PTHREADS
-PACKAGEDIR_PTHREADS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_PTHREADS),)
-ifneq ($(wildcard $(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)),)
-UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)/units/$(TARGETSUFFIX)
-else
-UNITDIR_PTHREADS=$(PACKAGEDIR_PTHREADS)
-endif
-ifdef CHECKDEPEND
-$(PACKAGEDIR_PTHREADS)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_PTHREADS) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_PTHREADS)/$(FPCMADE)
-endif
-else
-PACKAGEDIR_PTHREADS=
-UNITDIR_PTHREADS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /pthreads/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_PTHREADS),)
-UNITDIR_PTHREADS:=$(firstword $(UNITDIR_PTHREADS))
-else
-UNITDIR_PTHREADS=
-endif
-endif
-ifdef UNITDIR_PTHREADS
-override COMPILER_UNITDIR+=$(UNITDIR_PTHREADS)
-endif
-endif
 ifdef REQUIRE_PACKAGES_FCL-BASE
 PACKAGEDIR_FCL-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-base/Makefile.fpc,$(PACKAGESDIR))))))
 ifneq ($(PACKAGEDIR_FCL-BASE),)
@@ -2347,30 +2185,82 @@ ifdef UNITDIR_FCL-PASSRC
 override COMPILER_UNITDIR+=$(UNITDIR_FCL-PASSRC)
 endif
 endif
-ifdef REQUIRE_PACKAGES_WINUNITS
-PACKAGEDIR_WINUNITS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits/Makefile.fpc,$(PACKAGESDIR))))))
-ifneq ($(PACKAGEDIR_WINUNITS),)
-ifneq ($(wildcard $(PACKAGEDIR_WINUNITS)/units/$(TARGETSUFFIX)),)
-UNITDIR_WINUNITS=$(PACKAGEDIR_WINUNITS)/units/$(TARGETSUFFIX)
+ifdef REQUIRE_PACKAGES_CHM
+PACKAGEDIR_CHM:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /chm/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_CHM),)
+ifneq ($(wildcard $(PACKAGEDIR_CHM)/units/$(TARGETSUFFIX)),)
+UNITDIR_CHM=$(PACKAGEDIR_CHM)/units/$(TARGETSUFFIX)
 else
-UNITDIR_WINUNITS=$(PACKAGEDIR_WINUNITS)
+UNITDIR_CHM=$(PACKAGEDIR_CHM)
 endif
 ifdef CHECKDEPEND
-$(PACKAGEDIR_WINUNITS)/$(FPCMADE):
-	$(MAKE) -C $(PACKAGEDIR_WINUNITS) $(FPCMADE)
-override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS)/$(FPCMADE)
+$(PACKAGEDIR_CHM)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_CHM) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_CHM)/$(FPCMADE)
 endif
 else
-PACKAGEDIR_WINUNITS=
-UNITDIR_WINUNITS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits/Package.fpc,$(UNITSDIR)))))
-ifneq ($(UNITDIR_WINUNITS),)
-UNITDIR_WINUNITS:=$(firstword $(UNITDIR_WINUNITS))
+PACKAGEDIR_CHM=
+UNITDIR_CHM:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /chm/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_CHM),)
+UNITDIR_CHM:=$(firstword $(UNITDIR_CHM))
 else
-UNITDIR_WINUNITS=
+UNITDIR_CHM=
+endif
 endif
+ifdef UNITDIR_CHM
+override COMPILER_UNITDIR+=$(UNITDIR_CHM)
 endif
-ifdef UNITDIR_WINUNITS
-override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS)
+endif
+ifdef REQUIRE_PACKAGES_WINUNITS-BASE
+PACKAGEDIR_WINUNITS-BASE:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_WINUNITS-BASE),)
+ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)),)
+UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)/units/$(TARGETSUFFIX)
+else
+UNITDIR_WINUNITS-BASE=$(PACKAGEDIR_WINUNITS-BASE)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_WINUNITS-BASE) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-BASE)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_WINUNITS-BASE=
+UNITDIR_WINUNITS-BASE:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-base/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_WINUNITS-BASE),)
+UNITDIR_WINUNITS-BASE:=$(firstword $(UNITDIR_WINUNITS-BASE))
+else
+UNITDIR_WINUNITS-BASE=
+endif
+endif
+ifdef UNITDIR_WINUNITS-BASE
+override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-BASE)
+endif
+endif
+ifdef REQUIRE_PACKAGES_WINUNITS-JEDI
+PACKAGEDIR_WINUNITS-JEDI:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_WINUNITS-JEDI),)
+ifneq ($(wildcard $(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)),)
+UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)/units/$(TARGETSUFFIX)
+else
+UNITDIR_WINUNITS-JEDI=$(PACKAGEDIR_WINUNITS-JEDI)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_WINUNITS-JEDI) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_WINUNITS-JEDI)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_WINUNITS-JEDI=
+UNITDIR_WINUNITS-JEDI:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /winunits-jedi/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_WINUNITS-JEDI),)
+UNITDIR_WINUNITS-JEDI:=$(firstword $(UNITDIR_WINUNITS-JEDI))
+else
+UNITDIR_WINUNITS-JEDI=
+endif
+endif
+ifdef UNITDIR_WINUNITS-JEDI
+override COMPILER_UNITDIR+=$(UNITDIR_WINUNITS-JEDI)
 endif
 endif
 ifndef NOCPUDEF
@@ -2387,7 +2277,7 @@ override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
 endif
 ifndef CROSSBOOTSTRAP
 ifneq ($(BINUTILSPREFIX),)
-override FPCOPT+=-XP$(BINUTILSPREFIX) 
+override FPCOPT+=-XP$(BINUTILSPREFIX)
 endif
 ifneq ($(BINUTILSPREFIX),)
 override FPCOPT+=-Xr$(RLINKPATH)
@@ -2519,9 +2409,13 @@ ifeq (,$(findstring -s ,$(COMPILER)))
 EXECPPAS=
 else
 ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
 EXECPPAS:=@$(PPAS)
 endif
 endif
+endif
 .PHONY: fpc_exes
 ifndef CROSSINSTALL
 ifneq ($(TARGET_PROGRAMS),)
@@ -2753,8 +2647,12 @@ else
 endif
 ifdef inUnix
 	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) (ZIPWRAPPER)
 else
 	$(ZIPWRAPPER)
+endif
 endif
 	$(DEL) $(ZIPWRAPPER)
 else

+ 1 - 1
utils/fpdoc/Makefile.fpc

@@ -7,7 +7,7 @@ name=fpdoc
 version=2.2.1
 
 [require]
-packages=fcl-xml fcl-passrc
+packages=fcl-xml fcl-passrc chm
 
 [target]
 programs=fpdoc makeskel unitdiff

+ 9 - 0
utils/fpdoc/dglobals.pp

@@ -98,6 +98,15 @@ resourcestring
   
   // HTML usage
   SHTMLUsageFooter = 'Append xhtml from file as footer to html page';
+  
+  // CHM usage
+  SCHMUsageTOC     = 'Use [File] as the table of contents. Usually a .hhc file.';
+  SCHMUsageIndex   = 'Use [File] as the index. Usually a .hhk file.';
+  SCHMUsageDefPage = 'Set the "Home" page relative to where it lives in the chm. i.e. "/index.html"';
+  SCHMUsageOtrFiles= 'A txt file containing a list of files to be added relative to the working directory.';
+  SCHMUsageCSSFile = 'Filename of a .css file to be included in the chm.';
+  SCHMUsageAutoTOC = 'Automatically generate a Table of Contents. Ignores --toc-file';
+  SCHMUsageAutoIDX = 'Automatically generate an Index. Ignores --index-file';
 
   STitle           = 'FPDoc - Free Pascal Documentation Tool';
   SVersion         = 'Version %s [%s]';

+ 22 - 4
utils/fpdoc/dw_html.pp

@@ -15,11 +15,14 @@
 {$mode objfpc}
 {$H+}
 
+{$DEFINE FPDOC_CHM}
+
 unit dw_HTML;
 
 interface
 
-uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter;
+uses Classes, DOM, DOM_HTML, dGlobals, PasTree, dWriter
+    {$IFDEF FPDOC_CHM},ChmWriter, ChmBase{$ENDIF};
 
 const
   // Subpage indices for modules
@@ -233,7 +236,7 @@ type
       ASubpageIndex: Integer): TXMLDocument;
 
     // For producing complete package documentation
-    procedure WriteHTMLPages;
+    procedure WriteHTMLPages; virtual;
     procedure WriteXHTMLPages;
 
     SearchPage: String;
@@ -252,10 +255,17 @@ type
     Procedure CreateAllocator; override;
   end;
 
+{$DEFINE FPDOC_CHM}
+
+{$IFDEF FPDOC_CHM}
+  {$DEFINE chmInterface}
+  {$I dw_htmlchm.inc}
+  {$UNDEF chmInterface}
+{$ENDIF}
 
 implementation
 
-uses SysUtils, XHTML, XMLRead, XMLWrite, HTMWrite, sh_pas;
+uses SysUtils, XHTML, XMLRead, XMLWrite, HTMWrite, sh_pas {$IFDEF FPDOC_CHM},chmsitemap{$ENDIF};
 
 
 Function FixHTMLpath(S : String) : STring;
@@ -264,6 +274,8 @@ begin
   Result:=StringReplace(S,'\','/',[rfReplaceAll]);
 end;
 
+{$I dw_htmlchm.inc}
+
 procedure TFileAllocator.AllocFilename(AElement: TPasElement;
   ASubindex: Integer);
 begin
@@ -652,7 +664,7 @@ var
   i: Integer;
   PageDoc: TXMLDocument;
   Filename: String;
-begin
+begin WriteLn('!!!!!!!!!!!!!!!!!!!!!!1');
   if Engine.Output <> '' then
     Engine.Output := IncludeTrailingBackSlash(Engine.Output);
   for i := 0 to PageInfos.Count - 1 do
@@ -3007,7 +3019,13 @@ initialization
   // Do not localize.
   RegisterWriter(THTMLWriter,'html','HTML output using fpdoc.css stylesheet.');
   RegisterWriter(THTMWriter,'htm','HTM (8.3 filenames) output using fpdoc.css stylesheet.');
+  {$IFDEF FPDOC_CHM}
+  RegisterWriter(TCHMHTMLWriter,'chm','Compressed HTML file output using fpdoc.css stylesheet.');
+  {$ENDIF}
 finalization
   UnRegisterWriter('html');
   UnRegisterWriter('htm');
+  {$IFDEF FPDOC_CHM}
+  UnRegisterWriter('chm');
+  {$ENDIF}
 end.

+ 516 - 0
utils/fpdoc/dw_htmlchm.inc

@@ -0,0 +1,516 @@
+{%mainunit dw_html}
+{$IFDEF chmInterface}
+type
+
+  { TCHMHTMLWriter }
+
+  TCHMHTMLWriter = class(THTMLWriter)
+  private
+    FOutChm: TStream;
+    FChm: TChmWriter;
+    FTempUncompressed: TStream;
+    FTempUncompressedName: String;
+    FTOCName,
+    FIndexName,
+    FDefaultPage: String;
+    FCSSFile: String;
+    FAutoTOC,
+    FAutoIndex: Boolean;
+    FOtherFiles: String;
+    procedure ProcessOptions;
+    function RetrieveOtherFiles(const DataName: String; out PathInChm: String; out FileName: String; var Stream: TStream): Boolean;
+    procedure LastFileAdded(Sender: TObject);
+    procedure GenerateTOC;
+    procedure GenerateIndex;
+  public
+    procedure WriteHTMLPages; override;
+    
+    function  InterPretOption(const Cmd,Arg : String): boolean; override;
+
+    class procedure Usage(List: TStrings); override;
+  end;
+{$ELSE} // implementation
+
+{ TCHMHTMLWriter }
+
+procedure TCHMHTMLWriter.ProcessOptions;
+var
+  TempStream: TMemoryStream;
+begin
+  if FDefaultPage = '' then
+    FDefaultPage := 'index.html'
+  else
+  begin
+    WriteLn('Note: --index-page not assigned. Using default "index.html"');
+  end;
+  
+  if FCSSFile <> '' then
+  begin
+    TempStream := TMemoryStream.Create;
+    TempStream.LoadFromFile(FCSSFile);
+    TempStream.Position := 0;
+    FChm.AddStreamToArchive('fpdoc.css', '/', TempStream, True);
+    TempStream.Free;
+  end;
+
+  FChm.DefaultPage := FDefaultPage;
+  
+  if FOtherFiles <> '' then
+  begin
+    FChm.FilesToCompress.LoadFromFile(FOtherFiles);
+  end;
+
+end;
+
+function TCHMHTMLWriter.RetrieveOtherFiles(const DataName: String; out
+  PathInChm: String; out FileName: String; var Stream: TStream): Boolean;
+var
+  Dir: String;
+begin
+  if Stream <> nil then
+    Stream.Free;
+  Stream := TMemoryStream.Create;
+  TMemoryStream(Stream).LoadFromFile(DataName);
+  FileName := ExtractFileName(DataName);
+  
+  if ExtractFileDir(DataName) <> '' then
+    PathInChm := ExtractRelativepath(GetCurrentDir, ExtractFileDir(DataName))
+  else
+    PathInChm := '/';
+  FixHTMLpath(PathInChm);
+  Stream.Position := 0;
+end;
+
+procedure TCHMHTMLWriter.LastFileAdded(Sender: TObject);
+var
+  TmpStream: TMemoryStream;
+begin
+  TmpStream := TMemoryStream.Create;
+  if FAutoTOC then
+    GenerateTOC
+  else
+    if FTOCName <> '' then
+    begin
+      TmpStream.LoadFromFile(FTOCName);
+      TmpStream.Position := 0;
+      FChm.AppendTOC(TmpStream);
+      TmpStream.Size := 0;
+    end;
+    
+  if FAutoIndex then
+    GenerateIndex
+  else
+    if FIndexName <> '' then
+    begin
+      TmpStream.LoadFromFile(FIndexName);
+      TmpStream.Position := 0;
+      FChm.AppendIndex(TmpStream);
+    end;
+  TmpStream.Free;
+  WriteLn('Finishing compressing...');
+end;
+
+function TOCSort(Item1, Item2: TChmSiteMapItem): Integer;
+begin
+  Result := CompareText(LowerCase(Item1.Text), LowerCase(Item2.Text));
+end;
+
+function GetAlphaItem(AItems: TChmSiteMapItems; AName: String): TChmSiteMapItem;
+var
+  x: Integer;
+begin
+  Result := nil;
+  for x := 0 to AItems.Count-1 do
+  begin
+    if AItems.Item[x].Text = AName then
+      Exit(AItems.Item[x]);
+  end;
+  Result := AItems.NewItem;
+  Result.Text := AName;
+end;
+     
+procedure TCHMHTMLWriter.GenerateTOC;
+var
+  TOC: TChmSiteMap;
+  Element: TPasElement;
+  k: Integer;
+  j: Integer;
+  i: Integer;
+  AModule: TPasModule;
+  Member: TPasElement;
+  Stream: TMemoryStream;
+  TmpItem:  TChmSiteMapItem;
+  ObjByUnitItem,
+  AlphaObjItem,
+   ObjUnitItem,
+  RoutinesByUnitItem,
+    RoutinesUnitItem,
+  AlphaRoutinesItem: TChmSiteMapItem;
+
+begin
+  WriteLn('Generating Table of contents...');
+  if Assigned(Package) then
+  begin
+    Toc := TChmSiteMap.Create(stTOC);
+    Stream := TMemoryStream.Create;
+    ObjByUnitItem := TOC.Items.NewItem;
+    ObjByUnitItem.Text      := 'Classes and Objects, by Unit';
+    AlphaObjItem := TOC.Items.NewItem;
+    AlphaObjItem.Text       := 'Alphabetical Classes and Objects List';
+    RoutinesByUnitItem := TOC.Items.NewItem;
+    RoutinesByUnitItem.Text := 'Routines, by Unit';
+    AlphaRoutinesItem  := TOC.Items.NewItem;
+    AlphaRoutinesItem.Text  := 'Alphabetical Routines List';
+
+    // objects and classes
+    for i := 0 to Package.Modules.Count - 1 do
+    begin
+      AModule := TPasModule(Package.Modules[i]);
+      ObjUnitItem := ObjByUnitItem.Children.NewItem;
+      ObjUnitItem.Text := AModule.Name;
+      RoutinesUnitItem := RoutinesByUnitItem.Children.NewItem;
+      RoutinesUnitItem.Text := AModule.Name;
+      for j := 0 to AModule.InterfaceSection.Classes.Count-1 do
+      begin
+        Element := TPasClassType(AModule.InterfaceSection.Classes[j]);
+        // by unit
+        TmpItem := ObjUnitItem.Children.NewItem;
+        TmpItem.Text := Element.Name;
+        TmpItem.Local := Allocator.GetFilename(Element, 0);
+        
+        //alpha
+        TmpItem := GetAlphaItem(AlphaObjItem.Children, UpperCase(Copy(Element.Name, 1, 2))).Children.NewItem;
+        TmpItem.Text := Element.Name;
+        TmpItem.Local := Allocator.GetFilename(Element, 0);
+        
+      end;
+      
+      // non object procedures and functions
+      for j := 0 to AModule.InterfaceSection.Functions.Count-1 do
+      begin
+        Element := TPasFunctionType(AModule.InterfaceSection.Functions[j]);
+        // by unit
+        TmpItem := RoutinesUnitItem.Children.NewItem;
+        TmpItem.Text := Element.Name;
+        TmpItem.Local := Allocator.GetFilename(Element, 0);
+        
+        // alpha
+        TmpItem := GetAlphaItem(AlphaRoutinesItem.Children, UpperCase(Element.Name[1])).Children.NewItem;
+        TmpItem.Text := Element.Name;
+        TmpItem.Local := Allocator.GetFilename(Element, 0);
+      end;
+    end;
+  end;
+  // cleanup
+  for i := ObjByUnitItem.Children.Count-1 downto 0 do
+  begin
+    if ObjByUnitItem.Children.Item[i].Children.Count = 0 then
+      ObjByUnitItem.Children.Delete(i);
+  end;
+
+  for i := RoutinesByUnitItem.Children.Count-1 downto 0 do
+  begin
+    if RoutinesByUnitItem.Children.Item[i].Children.Count = 0 then
+      RoutinesByUnitItem.Children.Delete(i);
+  end;
+  
+  for i := TOC.Items.Count-1 downto 0 do
+  begin
+    if TOC.Items.Item[i].Children.Count = 0 then
+      TOC.Items.Delete(i);
+  end;
+  
+  // Sort
+  for i := 0 to TOC.Items.Count-1 do
+  begin
+    TOC.Items.Item[i].Children.Sort(TListSortCompare(@TOCSort));
+    for j := 0 to TOC.Items.Item[i].Children.Count-1 do
+    begin
+      TOC.Items.Item[i].Children.Item[j].Children.Sort(TListSortCompare(@TOCSort));
+    end;
+  end;
+  
+  TOC.SaveToStream(Stream);
+  TOC.Free;
+
+  fchm.AppendTOC(Stream);
+  Stream.Free;
+end;
+
+type
+  TClassMemberType = (cmtProcedure, cmtFunction, cmtConstructor, cmtDestructor,
+      cmtInterface, cmtProperty, cmtVariable, cmtUnknown);
+  
+function ElementType(Element: TPasElement): TClassMemberType;
+var
+  ETypeName: String;
+begin
+  Result := cmtUnknown;
+  ETypeName := Element.ElementTypeName;
+  //overloaded we don't care
+  if ETypeName[1] = 'o' then ETypeName := Copy(ETypeName, 11, Length(ETypeName));
+  
+  if ETypeName[1] = 'f' then Exit(cmtFunction);
+  if ETypeName[1] = 'c' then Exit(cmtConstructor);
+  if ETypeName[1] = 'v' then Exit(cmtVariable);
+  if ETypeName[1] = 'i' then Exit(cmtInterface);
+  // the p's
+  if ETypeName[4] = 'c' then Exit(cmtProcedure);
+  if ETypeName[4] = 'p' then Exit(cmtProperty);
+  
+end;
+
+procedure TCHMHTMLWriter.GenerateIndex;
+var
+  Index: TChmSiteMap;
+  i, j, k: Integer;
+  TmpItem: TChmSiteMapItem;
+  ParentItem: TChmSiteMapItem;
+  AModule: TPasModule;
+  TmpElement: TPasElement;
+  ParentElement: TPasElement;
+  MemberItem: TChmSiteMapItem;
+  Stream: TMemoryStream;
+begin
+  WriteLn('Generating Index...');
+
+  if Assigned(Package) then
+  begin
+  try
+    Index := TChmSiteMap.Create(stIndex);
+    Stream := TMemoryStream.Create;
+    for i := 0 to Package.Modules.Count - 1 do
+    begin
+      AModule := TPasModule(Package.Modules[i]);
+      //  classes
+      for j := 0 to AModule.InterfaceSection.Classes.Count-1 do
+      begin
+        ParentElement := TPasClassType(AModule.InterfaceSection.Classes[j]);
+        ParentItem := Index.Items.NewItem;
+        ParentItem.Text := ParentELement.Name;
+        ParentItem.Local := Allocator.GetFilename(ParentElement, 0);
+        for k := 0 to TPasClassType(ParentElement).Members.Count-1 do
+        begin
+          TmpElement := TPasElement(TPasClassType(ParentElement).Members.Items[k]);
+          if Engine.HidePrivate and(TmpElement.Visibility = visPrivate) then
+            continue;
+          if Engine.HideProtected and(TmpElement.Visibility = visProtected) then
+            continue;
+          TmpItem := ParentItem.Children.NewItem;
+          case ElementType(TmpElement) of
+            cmtProcedure   : TmpItem.Text := TmpElement.Name + ' procedure';
+            cmtFunction    : TmpItem.Text := TmpElement.Name + ' function';
+            cmtConstructor : TmpItem.Text := TmpElement.Name + ' constructor';
+            cmtDestructor  : TmpItem.Text := TmpElement.Name + ' destructor';
+            cmtProperty    : TmpItem.Text := TmpElement.Name + ' property';
+            cmtVariable    : TmpItem.Text := TmpElement.Name + ' variable';
+            cmtInterface   : TmpItem.Text := TmpElement.Name + ' interface';
+            cmtUnknown     : TmpItem.Text := TmpElement.Name;
+          end;
+          TmpItem.Local := Allocator.GetFilename(TmpElement, 0);
+          {
+          ParentElement = Class
+             TmpElement = Member
+          }
+          MemberItem := nil;
+          MemberItem := GetAlphaItem(Index.Items, TmpElement.Name);
+          // ahh! if MemberItem.Local is empty MemberType is not shown!
+          MemberItem.Local := Allocator.GetFilename(TmpElement, 0);
+
+          TmpItem := MemberItem.Children.NewItem;
+          TmpItem.Text := ParentElement.Name;
+          TmpITem.Local := Allocator.GetFilename(TmpElement, 0);
+        end;
+      end;
+      // routines
+      for j := 0 to AModule.InterfaceSection.Functions.Count-1 do
+      begin
+        ParentElement := TPasProcedureType(AModule.InterfaceSection.Functions[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name + ' ' + TPasFunction(ParentElement).ElementTypeName;
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+      end;
+      // consts
+      for j := 0 to AModule.InterfaceSection.Consts.Count-1 do
+      begin
+        ParentElement := TPasElement(AModule.InterfaceSection.Consts[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name;
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+      end;
+      // types
+      for j := 0 to AModule.InterfaceSection.Types.Count-1 do
+      begin
+        ParentElement := TPasType(AModule.InterfaceSection.Types[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name;
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+        // enums
+        if ParentELement is TPasEnumType then
+        begin
+          ParentItem := TmpItem;
+          for k := 0 to TPasEnumType(ParentElement).Values.Count-1 do
+          begin
+            TmpElement := TPasType(TPasEnumType(ParentElement).Values.Items[k]);
+            // subitem
+            TmpItem := ParentItem.Children.NewItem;
+            TmpItem.Text := TmpElement.Name;
+            TmpItem.Local := ParentItem.Local;
+            // root level
+            TmpItem := Index.Items.NewItem;
+            TmpItem.Text := TmpElement.Name;
+            TmpItem.Local := ParentItem.Local;
+          end;
+        end;
+      end;
+      // variables
+      for j := 0 to AModule.InterfaceSection.Variables.Count-1 do
+      begin
+        ParentElement := TPasElement(AModule.InterfaceSection.Variables[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name + ' var';
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+      end;
+      // declarations
+      {
+      for j := 0 to AModule.InterfaceSection.Declarations.Count-1 do
+      begin
+        ParentElement := TPasElement(AModule.InterfaceSection.Declarations[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name;
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+      end;
+      // resource strings
+      for j := 0 to AModule.InterfaceSection.ResStrings.Count-1 do
+      begin
+        ParentElement := TPasElement(AModule.InterfaceSection.ResStrings[j]);
+        TmpItem := Index.Items.NewItem;
+        TmpItem.Text := ParentElement.Name;
+        TmpItem.Local := Allocator.GetFilename(ParentElement, 0);
+      end;
+      }
+    end;
+
+    // Sort
+    Index.Items.Sort(TListSortCompare(@TOCSort));
+    for i := 0 to Index.Items.Count-1 do
+    begin
+      Index.Items.Item[i].Children.Sort(TListSortCompare(@TOCSort));
+    end;
+
+    // save
+    Index.SaveToStream(Stream);
+    Index.Free;
+    Stream.Position :=0 ;
+    FChm.AppendIndex(Stream);
+    Stream.Free;
+  except
+    Dump_Stack(StdOut, get_frame);
+    Halt(1);
+  end;
+  end;
+end;
+
+procedure TCHMHTMLWriter.WriteHTMLPages;
+var
+  i: Integer;
+  PageDoc: TXMLDocument;
+  FileStream: TMemoryStream;
+  FileName: String;
+  FilePath: String;
+begin
+  if Engine.Output = '' then
+  begin
+    WriteLn('Error: no --output option used.');
+    Exit;
+  end;
+  
+  if ExtractFileExt(Engine.Output) <> '.chm' then
+    ChangeFileExt(Engine.OutPut, '.chm');
+
+  FOutChm := TFileStream.Create(Engine.Output, fmOpenReadWrite or fmCreate);
+
+  FTempUncompressedName := GetTempFileName+IntToStr(GetProcessID) +'.raw';
+  FTempUncompressed := TFileStream.Create(FTempUncompressedName, fmOpenReadWrite  or fmCreate);
+  FChm := TChmWriter.Create(FOutChm, False);
+  FChm.Title := Copy(Package.Name, 2, Length(Package.Name));
+  FChm.TempRawStream := FTempUncompressed;
+  FChm.OnGetFileData := @RetrieveOtherFiles;
+  FChm.OnLastFile := @LastFileAdded;
+  
+  ProcessOptions;
+
+  FileStream := TMemoryStream.Create;
+  for i := 0 to PageInfos.Count - 1 do
+    with TPageInfo(PageInfos[i]) do
+    begin
+      PageDoc := CreateHTMLPage(Element, SubpageIndex);
+      try
+        FileName := ExtractFileName(Allocator.GetFilename(Element, SubpageIndex));
+        FilePath := '/'+FixHTMLpath(ExtractFilePath(Allocator.GetFilename(Element, SubpageIndex)));
+
+        try
+          WriteHTMLFile(PageDoc, FileStream);
+          FChm.AddStreamToArchive(FileName, FilePath, FileStream, True);
+        except
+	  on E: Exception do
+            WriteLn(Format(SErrCouldNotCreateFile, [FileName, e.Message]));
+        end;
+      finally
+        PageDoc.Free;
+        FileStream.Size := 0;
+      end;
+    end;
+  FileStream.Free;
+  WriteLn('HTML Files written. Collecting other files and compressing...this could take some time');
+  FChm.Execute;
+  FChm.Free;
+  // we don't need to free FTempUncompressed
+  // FTempUncompressed.Free;
+  FOutChm.Free;
+  DeleteFile(FTempUncompressedName);
+end;
+
+function TCHMHTMLWriter.InterPretOption(const Cmd, Arg: String): boolean;
+begin
+  Result:=True;
+  if Cmd = '--toc-file' then
+    FTOCName := arg
+  else if Cmd = '--index-file' then
+    FIndexName := arg
+  else if Cmd = '--default-page' then
+    FDefaultPage := arg
+  else if Cmd = '--other-files' then
+    FOtherFiles := arg
+  else if Cmd = '--css-file' then
+    FCSSFile := arg
+  else if Cmd = '--auto-index' then
+    FAutoIndex := True
+  else if Cmd = '--auto-toc' then
+    FAutoTOC := True
+  else
+    Result:=inherited InterPretOption(Cmd, Arg);
+end;
+
+class procedure TCHMHTMLWriter.Usage(List: TStrings);
+begin
+  THTMLWriter.Usage(List);
+  List.add('--default-page');
+  List.Add(SCHMUsageDefPage);
+  List.add('--toc-file');
+  List.Add(SCHMUsageTOC);
+  List.add('--index-file');
+  List.Add(SCHMUsageIndex);
+  List.add('--other-files');
+  List.Add(SCHMUsageOtrFiles);
+  List.add('--css-file');
+  List.Add(SCHMUsageCSSFile);
+  List.add('--auto-index');
+  List.Add(SCHMUsageAutoIDX);
+  List.add('--auto-toc');
+  List.Add(SCHMUsageAutoTOC);
+end;
+
+
+
+{$ENDIF}

部分文件因文件數量過多而無法顯示