On 2010/01/25, at 05:07 , Robert Goldman wrote:
On 1/24/10 Jan 24 -9:39 PM, dherring@tentpost.com wrote:
Robert Goldman wrote:
On 1/24/10 Jan 24 -3:01 PM, Daniel Herring wrote:
Thanks for the ideas. Poking around a bit further, it appears that in the following snippet from output-files-using-mappings (*centralize-lisp-binaries* is false), (pathname-directory path) is nil.
(make-pathname :type (pathname-type path) :directory (append (pathname-directory path) (implementation-specific-directory-
name)) :defaults path)))))
Thus clisp is seeing ":directory (clisp)" without a leading :relative or :absolute. I don't know the cause and am focused on other issues right now (this one has a couple workarounds: use ccl or an older asdf).
Can you trace pathname-type inside the invocation of output-files-using-mappings? This smells like a CLISP bug to me....
Here's some relevant FORMAT ~S output. "p:" is the full path right before the error; p-d is the pathname-directory.
;; Loaded file #<INPUT BUFFERED FILE-STREAM CHARACTER C:\Documents and Settings\nuntius\Desktop\able-release\systems\ltk\ltk.asd @19> p: #P"C:ltk.fas" p-d: NIL *** - MAKE-PATHNAME: Illegal :DIRECTORY argument ("clisp-2.48-win32- i386")
Something bad happened before this call; the paths list is screwed up in the output-files defmethod around compile-op (a few lines below the above snippet). It is merely (#P"C:ltk.fas").
From a few TRACEs, it appears that *default-pathname-defaults* is #P"C:", and this is the value of component-parent-pathname. Component-relative-pathname is "ltk.lisp".
Hm. That looks like the *default-pathname-defaults* has only a :device (or possibly a :host) but no :directory component. I really don't have the foggiest idea how that could have happened. I'm afraid I am neither a windows nor a clisp user, so someone else will have to step in here.
Looks like that :directory argument is simply the output of (implementation-specific-directory-name) and that agrees that pathname-directory of path NIL.
No idea why this is happening, but I suspect it's a problem with the system pathname somehow.
If the *default-pathname-defaults* has a logical host, then all the paths that are parsed (ie. by #P) must have the same logical host, if it's a logical pathname syntax, or implementation dependant if it's a physical pathname syntax.
My conclusion is that it is a very bad idea to put a logical host in *default-pathname-defaults*.
In the case of MS-Windows, an additionnal problem is that the physical device syntax is indistinguishable from a logical host syntax.
How does (let ((*default-pathname-defaults* (make-pathname :host nil :device nil :directory nil :name nil :type nil :version nil))) (values (make-pathname :host "C") and (make- pathname :device "C"))) print in clisp on MS-Windows?
In the case of clisp on cygwin or macosx, :device "C" is illegal.