Bug report: COMPILE-FILE, COMPILE-FILE-PATHNAME disagree on output dir

Robert Munyer 2433647181 at munyer.com
Sun Nov 8 21:52:24 UTC 2020

> Your implementation of COMPILE-FILE-PATHNAME has now been merged into
> [abcl-1.8.1-dev][1][2].
> Thanks for your analysis, thinking, and implementation here.
> This will be part of abcl-1.8.1 which will be released in the next couple
> weeks, pending further shakedown of abcl-1.8.0 issues.  Until then, you will
> need to build abcl from source to get a version which includes your fix.
> I have closed [ticket 476][476] as your implementation addresses the problems
> you uncovered, and continues to pass the CI tests at the same level as without.

COMPILE-FILE-PATHNAME seems good now, but I'm still finding pathname-
related bugs in COMPILE-FILE itself.  The latest is one where it throws
a "file ... does not exist" error while trying to compress the temporary
files that it has just created into an archive.  I'll paste a demo of
that bug at the end of this message.

If you remove this assignment statement from the source of COMPILE-FILE:

    (setf output-file
          (make-pathname :defaults
                         (if output-file
                             (merge-pathnames output-file
                             (compile-file-pathname input-file))
                         :version nil))

, and replace it with this one:

    (setf output-file
          (compile-file-pathname input-file :output-file output-file))

, then the pathname-related bugs that I've been noticing go away.

I see that the existing code is going out of its way to force the
pathname version number to NIL.  I don't know if there is a good
reason for it to be doing that.  If there is a good reason for it,
it should be done in COMPILE-FILE-PATHNAME, not in COMPILE-FILE.

Here is a COMPILE-FILE-PATHNAME that forces the version number;
use this if forcing the version number is actually desirable.

(defun compile-file-pathname (input-file &key output-file &allow-other-keys)
  (let ((defaults (make-pathname :type *compile-file-type*
                                 :defaults (merge-pathnames input-file))))
    (make-pathname :version nil
                   :defaults (cond ((null output-file) defaults)
                                   (t (merge-pathnames output-file

The 2nd and 3rd of the three code snippets above are my own original
work, and I release them into the public domain, no rights reserved.

Here's the report of the "file ... does not exist" error:

The code below works in CCL, CLISP and SBCL, but not in ABCL.
It _does_ work in ABCL if you replace the first code snippet shown
above with the second, the one that's only two lines long.

$ echo '(format t "~&Hello, world!~%")' > bar.lisp
$ java -jar abcl-231e00ef.jar
Armed Bear Common Lisp 1.8.1-dev
Java 1.8.0_272 Oracle Corporation
OpenJDK 64-Bit Server VM
Low-level initialization completed in 0.363 seconds.
Startup completed in 1.35 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (compile-file (make-pathname :name "bar" :type "lisp")
             :output-file (make-pathname :name "bar-baz"))
; Compiling /tmp/foo/bar.lisp ...
; (FORMAT T ...)
#<THREAD "interpreter" {430133BA}>: Debugger invoked on condition of type FILE-ERROR
  The file /tmp/foo/bar-baz does not exist.
  0: TOP-LEVEL Return to top level.
[1] CL-USER(2):

More information about the armedbear-devel mailing list