diff --git a/tools/hemcom.lisp b/tools/hemcom.lisp
index f73c63a6da2e4e971c2684790f49068354b1e676..d3fc8030e8ac930dade0fe96829e72d0f6c38d02 100644
--- a/tools/hemcom.lisp
+++ b/tools/hemcom.lisp
@@ -51,7 +51,8 @@
      :context-declarations
      '(((:or :external (:match "$%SET-"))
 	(declare (optimize (safety 2))
-		 (optimize-interface (debug-info 1))))))
+		 (optimize-interface (debug-info 1))))
+       (:macro (declare (optimize (speed 0))))))
 
 (comf "target:code/globals")
 (comf "target:code/struct")
@@ -110,10 +111,19 @@
 (comf "target:hemlock/echocoms")
 (comf "target:hemlock/defsyn")
 
+(comf "target:hemlock/spell-rt")
+(comf "target:hemlock/spell-corr")
+(comf "target:hemlock/spell-aug")
+(comf "target:hemlock/spell-build")
+(comf "target:hemlock/spellcoms")
+(comf "target:hemlock/kbdmac")
+
+(comf "target:hemlock/ts-buf")
+(comf "target:hemlock/ts-stream")
 
 (with-compilation-unit
     (:optimize
-     '(optimize (safety 2))
+     '(optimize (safety 2) (speed 0))
      :context-declarations
      '(((:match "-COMMAND$")
 	(declare (optimize (safety #+small 0 #-small 1))
@@ -132,21 +142,13 @@
 (comf "target:hemlock/text")
 (comf "target:hemlock/doccoms")
 (comf "target:hemlock/srccom")
-(comf "target:hemlock/group")
-(comf "target:hemlock/spell-rt")
-(comf "target:hemlock/spell-corr")
-(comf "target:hemlock/spell-aug")
-(comf "target:hemlock/spell-build")
-(comf "target:hemlock/spellcoms")
 (comf "target:hemlock/abbrev")
+(comf "target:hemlock/group")
 (comf "target:hemlock/overwrite")
 (comf "target:hemlock/gosmacs")
-(comf "target:hemlock/ts-buf")
-(comf "target:hemlock/ts-stream")
 (comf "target:hemlock/eval-server")
 (comf "target:hemlock/lispbuf")
 (comf "target:hemlock/lispeval")
-(comf "target:hemlock/kbdmac")
 (comf "target:hemlock/icom")
 (comf "target:hemlock/hi-integrity")
 (comf "target:hemlock/ed-integrity")
@@ -178,100 +180,91 @@
 ) ;WITH-COMPILER-LOG-FILE
 
 
-(ext:run-program
- "cat"
- (mapcar #'(lambda (x)
-	     (namestring
-	      (truename
-	       (make-pathname
-		:defaults x
-		:type (c:backend-fasl-file-type c:*target-backend*)))))
-	 '("target:hemlock/rompsite"
-	   "target:hemlock/struct"
-	   ; "target:hemlock/struct-ed"
-	   "target:hemlock/charmacs"
-	   "target:hemlock/input"
-	   "target:hemlock/line"
-	   "target:hemlock/ring"
-	   "target:hemlock/vars"
-	   "target:hemlock/buffer"
-	   "target:hemlock/macros"
-	   "target:hemlock/interp"
-	   "target:hemlock/syntax"
-	   "target:hemlock/htext1"
-	   "target:hemlock/htext2"
-	   "target:hemlock/htext3"
-	   "target:hemlock/htext4"
-	   "target:hemlock/files"
-	   "target:hemlock/search1"
-	   "target:hemlock/search2"
-	   "target:hemlock/table"
-	   #+clx "target:hemlock/hunk-draw"
-	   "target:hemlock/window"
-	   "target:hemlock/screen"
-	   "target:hemlock/winimage"
-	   "target:hemlock/linimage"
-	   "target:hemlock/display"
-	   "target:hemlock/termcap"
-	   #+clx "target:hemlock/bit-display"
-	   "target:hemlock/tty-disp-rt"
-	   "target:hemlock/tty-display"
-	   "target:hemlock/pop-up-stream"
-	   #+clx "target:hemlock/bit-screen"
-	   "target:hemlock/tty-screen"
-	   "target:hemlock/cursor"
-	   "target:hemlock/font"
-	   "target:hemlock/streams"
-	   "target:hemlock/hacks"
-	   "target:hemlock/main"
-	   "target:hemlock/echo"
-	   "target:hemlock/echocoms"
-	   "target:hemlock/command"
-	   "target:hemlock/indent"
-	   "target:hemlock/comments"
-	   "target:hemlock/morecoms"
-	   "target:hemlock/undo"
-	   "target:hemlock/killcoms"
-	   "target:hemlock/searchcoms"
-	   "target:hemlock/filecoms"
-	   "target:hemlock/doccoms"
-	   "target:hemlock/srccom"
-	   "target:hemlock/group"
-	   "target:hemlock/fill"
-	   "target:hemlock/text"
-	   "target:hemlock/lispmode"
-	   "target:hemlock/ts-buf"
-	   "target:hemlock/ts-stream"
-	   "target:hemlock/eval-server"
-	   "target:hemlock/lispbuf"
-	   "target:hemlock/lispeval"
-	   "target:hemlock/spell-rt"
-	   "target:hemlock/spell-corr"
-	   "target:hemlock/spell-aug"
-	   "target:hemlock/spellcoms"
-	   "target:hemlock/overwrite"
-	   "target:hemlock/abbrev"
-	   "target:hemlock/icom"
-	   "target:hemlock/kbdmac"
-	   "target:hemlock/defsyn"
-	   "target:hemlock/scribe"
-	   "target:hemlock/pascal"
-	   "target:hemlock/edit-defs"
-	   "target:hemlock/auto-save"
-	   "target:hemlock/register"
-	   "target:hemlock/xcoms"
-	   "target:hemlock/unixcoms"
-	   "target:hemlock/mh"
-	   "target:hemlock/highlight"
-	   "target:hemlock/dired"
-	   "target:hemlock/diredcoms"
-	   "target:hemlock/bufed"
-	   "target:hemlock/lisp-lib"
-	   "target:hemlock/completion"
-	   "target:hemlock/shell"
-	   "target:hemlock/debug"
-	   "target:hemlock/netnews"
-	   "target:hemlock/bindings"))
- :if-output-exists :supersede
- :output (make-pathname :defaults "target:hemlock/hemlock-library"
-			:type (c:backend-fasl-file-type c:*target-backend*)))
+(cat-if-anything-changed
+ "target:hemlock/hemlock-library"
+ "target:hemlock/rompsite"
+ "target:hemlock/struct"
+ ; "target:hemlock/struct-ed"
+ "target:hemlock/charmacs"
+ "target:hemlock/input"
+ "target:hemlock/line"
+ "target:hemlock/ring"
+ "target:hemlock/vars"
+ "target:hemlock/buffer"
+ "target:hemlock/macros"
+ "target:hemlock/interp"
+ "target:hemlock/syntax"
+ "target:hemlock/htext1"
+ "target:hemlock/htext2"
+ "target:hemlock/htext3"
+ "target:hemlock/htext4"
+ "target:hemlock/files"
+ "target:hemlock/search1"
+ "target:hemlock/search2"
+ "target:hemlock/table"
+ #+clx "target:hemlock/hunk-draw"
+ "target:hemlock/window"
+ "target:hemlock/screen"
+ "target:hemlock/winimage"
+ "target:hemlock/linimage"
+ "target:hemlock/display"
+ "target:hemlock/termcap"
+ #+clx "target:hemlock/bit-display"
+ "target:hemlock/tty-disp-rt"
+ "target:hemlock/tty-display"
+ "target:hemlock/pop-up-stream"
+ #+clx "target:hemlock/bit-screen"
+ "target:hemlock/tty-screen"
+ "target:hemlock/cursor"
+ "target:hemlock/font"
+ "target:hemlock/streams"
+ "target:hemlock/hacks"
+ "target:hemlock/main"
+ "target:hemlock/echo"
+ "target:hemlock/echocoms"
+ "target:hemlock/command"
+ "target:hemlock/indent"
+ "target:hemlock/comments"
+ "target:hemlock/morecoms"
+ "target:hemlock/undo"
+ "target:hemlock/killcoms"
+ "target:hemlock/searchcoms"
+ "target:hemlock/filecoms"
+ "target:hemlock/doccoms"
+ "target:hemlock/srccom"
+ "target:hemlock/group"
+ "target:hemlock/fill"
+ "target:hemlock/text"
+ "target:hemlock/lispmode"
+ "target:hemlock/ts-buf"
+ "target:hemlock/ts-stream"
+ "target:hemlock/eval-server"
+ "target:hemlock/lispbuf"
+ "target:hemlock/lispeval"
+ "target:hemlock/spell-rt"
+ "target:hemlock/spell-corr"
+ "target:hemlock/spell-aug"
+ "target:hemlock/spellcoms"
+ "target:hemlock/overwrite"
+ "target:hemlock/abbrev"
+ "target:hemlock/icom"
+ "target:hemlock/kbdmac"
+ "target:hemlock/defsyn"
+ "target:hemlock/scribe"
+ "target:hemlock/pascal"
+ "target:hemlock/edit-defs"
+ "target:hemlock/auto-save"
+ "target:hemlock/register"
+ "target:hemlock/xcoms"
+ "target:hemlock/unixcoms"
+ "target:hemlock/mh"
+ "target:hemlock/highlight"
+ "target:hemlock/dired"
+ "target:hemlock/diredcoms"
+ "target:hemlock/bufed"
+ "target:hemlock/lisp-lib"
+ "target:hemlock/completion"
+ "target:hemlock/shell"
+ "target:hemlock/debug"
+ "target:hemlock/netnews"
+ "target:hemlock/bindings")