Bug#647544: Component clfswm not found

Desmond O. Chang dochang at gmail.com
Sat Nov 5 14:36:19 UTC 2011


Hi,

Simon Chopin <chopin.simon at gmail.com> writes:

> Package: clfswm
> Version: 20111015.git51b0a02-1
> Severity: grave
> Justification: renders package unusable
>
> Hi,
>
> When trying to start clfswm, I just get this error message and then the
> program exits :
>
>     *** - Component "clfswm" not found
>

It's a bug from cl-asdf 2:2.018-1.

Actually, ASDF cannot find any system in /usr/share/common-lisp/ if you
use :DEFAULT-REGISTRY in your `source-registry.conf'.  Check the
following two test cases:



Test Case 1
-----------

$ cat ~/.config/common-lisp/source-registry.conf
;; -*- mode: lisp -*-
(:source-registry
 (:default-registry)                                     ;; <1>
 (:ignore-inherited-configuration))

$ clisp -norc -q
[1]> (find-package :asdf)
NIL
[2]> (load #P"/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
;; Loading file /usr/share/common-lisp/source/cl-asdf/asdf.lisp ...
;; Loaded file /usr/share/common-lisp/source/cl-asdf/asdf.lisp
T
[3]> (in-package :asdf)
#<PACKAGE ASDF>
ASDF[4]> (find-system :clfswm)

*** - Component "clfswm" not found
The following restarts are available:
ABORT          :R1      Abort main loop
Break 1 ASDF[5]> :r1
ASDF[6]> 



Test Case 2
-----------

$ cat ~/.config/common-lisp/source-registry.conf
;; -*- mode: lisp -*-
(:source-registry
 (:tree "/usr/share/common-lisp/source/")                ;; <2>
 (:ignore-inherited-configuration))

$ clisp -norc -q
[1]> (find-package :asdf)
NIL
[2]> (load #P"/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
;; Loading file /usr/share/common-lisp/source/cl-asdf/asdf.lisp ...
;; Loaded file /usr/share/common-lisp/source/cl-asdf/asdf.lisp
T
[3]> (in-package :asdf)
#<PACKAGE ASDF>
ASDF[4]> (find-system :clfswm)
;; Loading file /usr/share/common-lisp/source/clfswm/clfswm.asd ...
WARNING: Invalid version "Please, see in src/version.lisp" for component "clfswm"
;; Loaded file /usr/share/common-lisp/source/clfswm/clfswm.asd
#<SYSTEM "clfswm">
ASDF[5]> 



Why does test case 1 fail?  Because :DEFAULT-REGISTRY (<1>) is in
`source-registry.conf'.

Here is the definition of DEFAULT-SOURCE-REGISTRY:

(defun* default-source-registry ()
  `(:source-registry
    #+sbcl (:directory ,(try-subpathname (user-homedir) ".sbcl/systems/"))
    (:directory ,(default-directory))
      ,@(loop :for dir :in
          `(,@(when (os-unix-p)
                `(,(or (getenv "XDG_DATA_HOME")
                       (try-subpathname (user-homedir) ".local/share/"))
                  ,@(split-string (or (getenv "XDG_DATA_DIRS")
                                      "/usr/local/share:/usr/share")                         <1>
                                  :separator ":")))
            ,@(when (os-windows-p)
                `(,(or #+lispworks (sys:get-folder-path :local-appdata)
                       (getenv "LOCALAPPDATA"))
                  ,(or #+lispworks (sys:get-folder-path :appdata)
                       (getenv "APPDATA"))
                  ,(or #+lispworks (sys:get-folder-path :common-appdata)
                       (getenv "ALLUSERSAPPDATA")
                       (try-subpathname (getenv "ALLUSERSPROFILE") "Application Data/")))))
          :collect `(:directory ,(try-subpathname dir "common-lisp/systems/"))               <2>
          :collect `(:tree ,(try-subpathname dir "common-lisp/source/")))                    <3>
      :inherit-configuration))

At <1>, "/usr/share" doesn't end with /, so <2> & <3> return NIL (since
/usr/common-lisp/ doesn't exist).

TRY-SUBPATHNAME simply passes "/usr/share" to SUBPATHNAME, whose
definition is:

(defun* subpathname (pathname subpath &key type)
  (and pathname (merge-pathnames* (coerce-pathname subpath :type type)
                                  (pathname-directory-pathname pathname))))

Here (pathname-directory-pathname "/usr/share") returns "/usr/", then
(subpathname "/usr/share" "common-lisp/source/") returns
"/usr/common-lisp/source/", which doesn't exist.

TRY-SUBPATHNAME just tests the existence of the return pathname of
SUBPATHNAME.  So TRY-SUBPATHNAME returns NIL here since the pathname
doesn't exist.  That's why DEFAULT-SOURCE-REGISTRY goes wrong.



So how can you fix it until the new release is uploaded?  Try to set
XDG_DATA_DIRS to "/usr/local/share/:/usr/share/".  But as SUBPATHNAME is
also used otherwhere, I recommend that you redefine it:

(defun* subpathname (pathname subpath &key type)
  (and pathname (merge-pathnames* (coerce-pathname subpath :type type)
                                  (pathname-directory-pathname
                                   (or (ignore-errors
                                        (ensure-directory-pathname pathname))
                                       pathname)))))


Thanks,
Des





More information about the pkg-common-lisp-devel mailing list