Re: asdf:defsystem complains about path, sometimes
Mirko Vukovic <[email protected]>
| Newsgroups | gmane.editors.j.devel |
|---|---|
| Message-ID | <CAO73BAC-RW_Y-oTTfe8CnyAj2DfxJ59KvtT7Z4xN-V3PQtK98Q@mail.gmail.com> |
Scales were falling of my eyes as I was reading Drew's explanation. Thank you very much. In my feeble defense, my expectations were based on CLISP, SBCL, and CCL's behavior (as pointed out by the follow-up email from Vibhu). Mirko On Wed, Mar 1, 2017 at 11:25 AM Drew C <[email protected]> wrote: > Hey, > > On Wed, Mar 1, 2017 at 8:00 AM, Mirko Vukovic <[email protected]> > wrote: > > Hello, > > This is with asdf 3.1.7.27, > Armed Bear Common Lisp 1.4.0 > Java 1.6.0_41 Sun Microsystems Inc. > OpenJDK 64-Bit Server VM, > Emacs & Slime > > The following example code from the ASDF manual > > > The manual, > https://common-lisp.net/project/asdf/asdf.html#The-defsystem-form, just > before the code, states : > > << Let’s look at a simple system. This is a complete file that should be > saved as hello-lisp.asd (in order that ASDF can find it when ordered to > operate on the system named "hello-lisp") >> > > This is important, as without a pathname where the system definition > resides, how can it know where "packages.lisp" resides? > > > (asdf:defsystem "hello-lisp" > :description "hello-lisp: a sample Lisp system." > :version "0.0.1" > :author "Joe User <[email protected]>" > :licence "Public Domain" > :depends-on ("optima.ppcre" "command-line-arguments") > :components ((:file "packages") > (:file "macros" :depends-on ("packages")) > (:file "hello" :depends-on ("macros")))) > > when executed via the ABCL command line gives a relative path error > > > Because it is looking for #P"packages.lisp", but does not know where it > resides. > > Have a look at > https://github.com/fare/asdf/blob/90502898375fe183d96cb03cd333d8b3ec09c0ba/parse-defsystem.lisp#L21 > > ;; The defsystem macro calls this function to determine the pathname of a > system as follows: > ;; 1. If the pathname argument is an pathname object (NOT a > namestring), > ;; that is already an absolute pathname, return it. > ;; 2. Otherwise, the directory containing the LOAD-PATHNAME > ;; is considered (as deduced from e.g. *LOAD-PATHNAME*), and > ;; if it is indeed available and an absolute pathname, then > ;; the PATHNAME argument is normalized to a relative pathname > ;; as per PARSE-UNIX-NAMESTRING (with ENSURE-DIRECTORY T) > ;; and merged into that DIRECTORY as per SUBPATHNAME. > ;; Note: avoid *COMPILE-FILE-PATHNAME* because the .asd is loaded > as source, > ;; but may be from within the EVAL-WHEN of a file compilation. > ;; If no absolute pathname was found, we return NIL. > > > Invalid relative pathname #P"packages.lisp" for component ("hello-lisp" > "packages") > Restarts: > 0: RETRY Retry ASDF operation. > 1: CLEAR-CONFIGURATION-AND-RETRY Retry ASDF operation after resetting > the configuration. > 2: TOP-LEVEL Return to top level. > > If that code is in a file, then the file compiles cleanly: > > > > As it should. It now knows where the files are located, because you have > it in the .asd file which is LOAD'ed. > > > > > CL-USER(6): (load (compile-file "test.asd")) > ; Compiling /home/mv/projects/poi+excel/test.asd ... > ; (IN-PACKAGE :CL-USER) > ; (ASDF/PARSE-DEFSYSTEM:DEFSYSTEM "hello-lisp" ...) > ; Wrote /home/mv/projects/poi+excel/test.abcl (0.021 seconds) > T > CL-USER(7): > > I am looking for confirmation of this and second opinions before taking up > at the ASDF mailing list. > > > Confirmed, the second option is what should be used most of the time. > Othewrwise, the source location (:pathname) can be used to tell it where > the source code lies without it 'guessing'. Does that all make sense? > > Cheers, > > Drew Crampsie > > > Thanks, > > Mirko > > > >